Removes C++ style comments.
This commit is contained in:
parent
7c524df1d9
commit
5d6bcabd45
@ -1,31 +1,31 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
@ -33,32 +33,27 @@
|
||||
#ifndef UPNP_DEBUG_H
|
||||
#define UPNP_DEBUG_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ThreadPool.h"
|
||||
#include "upnpconfig.h"
|
||||
#include "UpnpGlobal.h" /* for UPNP_INLINE */
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \name Other debugging features
|
||||
/*! \name Other debugging features
|
||||
*
|
||||
* The UPnP SDK contains other features to aid in debugging.
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
/** \name Upnp_LogLevel
|
||||
/*! \name Upnp_LogLevel
|
||||
* The user has the option to select 4 different types of debugging levels,
|
||||
* see \c UpnpSetLogLevel.
|
||||
* The critical level will show only those messages
|
||||
@ -85,7 +80,6 @@ typedef enum Upnp_Module {
|
||||
HTTP
|
||||
} Dbg_Module;
|
||||
|
||||
|
||||
/*@{*/
|
||||
typedef enum Upnp_LogLevel_e {
|
||||
UPNP_CRITICAL,
|
||||
@ -95,14 +89,11 @@ typedef enum Upnp_LogLevel_e {
|
||||
} Upnp_LogLevel;
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
/*!
|
||||
* Default log level : see \c Upnp_LogLevel
|
||||
*/
|
||||
#define UPNP_DEFAULT_LOG_LEVEL UPNP_ALL
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Initialize the log files.
|
||||
*
|
||||
@ -117,7 +108,6 @@ static UPNP_INLINE int UpnpInitLog(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set the log level (see \c Upnp_LogLevel).
|
||||
*/
|
||||
@ -126,10 +116,13 @@ void UpnpSetLogLevel(
|
||||
/*! [in] Log level. */
|
||||
Upnp_LogLevel log_level);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
|
||||
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level)
|
||||
{
|
||||
return;
|
||||
log_level = log_level;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Closes the log files.
|
||||
*/
|
||||
@ -139,7 +132,6 @@ void UpnpCloseLog(void);
|
||||
static UPNP_INLINE void UpnpCloseLog(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set the name for error and information files, respectively.
|
||||
*/
|
||||
@ -152,10 +144,14 @@ void UpnpSetLogFileNames(
|
||||
#else
|
||||
static UPNP_INLINE void UpnpSetLogFileNames(
|
||||
const char *ErrFileName,
|
||||
const char *InfoFileName) {}
|
||||
const char *InfoFileName)
|
||||
{
|
||||
return;
|
||||
ErrFileName = ErrFileName;
|
||||
InfoFileName = InfoFileName;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Check if the module is turned on for debug and returns the file
|
||||
* descriptor corresponding to the debug level
|
||||
@ -174,6 +170,8 @@ FILE *UpnpGetDebugFile(
|
||||
static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module)
|
||||
{
|
||||
return NULL;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -196,6 +194,8 @@ static UPNP_INLINE int DebugAtThisLevel(
|
||||
Dbg_Module Module)
|
||||
{
|
||||
return 0;
|
||||
DLevel = DLevel;
|
||||
Module = Module;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -234,6 +234,12 @@ static UPNP_INLINE void UpnpPrintf(
|
||||
const char* FmtStr,
|
||||
...)
|
||||
{
|
||||
return;
|
||||
DLevel = DLevel;
|
||||
Module = Module;
|
||||
DbgFileName = DbgFileName;
|
||||
DbgLineNo = DbgLineNo;
|
||||
FmtStr = FmtStr;
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
@ -254,7 +260,13 @@ void UpnpDisplayFileAndLine(
|
||||
static UPNP_INLINE void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
int DbgLineNo)
|
||||
{
|
||||
return;
|
||||
fd = fd;
|
||||
DbgFileName = DbgFileName;
|
||||
DbgLineNo = DbgLineNo;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -276,7 +288,14 @@ static UPNP_INLINE void UpnpDisplayBanner(
|
||||
FILE *fd,
|
||||
const char **lines,
|
||||
size_t size,
|
||||
int starlength) {}
|
||||
int starlength)
|
||||
{
|
||||
return;
|
||||
fd = fd;
|
||||
lines = lines;
|
||||
size = size;
|
||||
starlength = starlength;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -300,10 +319,14 @@ static UPNP_INLINE void PrintThreadPoolStats(
|
||||
int DbgLineNo,
|
||||
const char *msg)
|
||||
{
|
||||
return;
|
||||
tp = tp;
|
||||
DbgFileName = DbgFileName;
|
||||
DbgLineNo = DbgLineNo;
|
||||
msg = msg;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -191,7 +191,7 @@ int SampleUtil_FindAndParseService (
|
||||
********************************************************************************/
|
||||
typedef void (*print_string)(const char *string);
|
||||
|
||||
//global print function used by sample util
|
||||
/*global print function used by sample util */
|
||||
extern print_string gPrintFun;
|
||||
|
||||
/********************************************************************************
|
||||
@ -212,7 +212,7 @@ typedef void (*state_update)(
|
||||
const char *UDN,
|
||||
eventType type);
|
||||
|
||||
//global state update function used by smaple util
|
||||
/*global state update function used by smaple util */
|
||||
extern state_update gStateUpdateFun;
|
||||
|
||||
/********************************************************************************
|
||||
|
@ -52,10 +52,10 @@ enum cmdloop_tvcmds {
|
||||
Data structure for parsing commands from the command line
|
||||
*/
|
||||
struct cmdloop_commands {
|
||||
char *str; // the string
|
||||
int cmdnum; // the command
|
||||
int numargs; // the number of arguments
|
||||
char *args; // the args
|
||||
char *str; /* the string */
|
||||
int cmdnum; /* the command */
|
||||
int numargs; /* the number of arguments */
|
||||
char *args; /* the args */
|
||||
} cmdloop_commands;
|
||||
|
||||
/*
|
||||
@ -417,7 +417,7 @@ device_main( int argc, char **argv )
|
||||
|
||||
SampleUtil_Initialize( linux_print );
|
||||
|
||||
// Parse options
|
||||
/* Parse options */
|
||||
for( i = 1; i < argc; i++ ) {
|
||||
if( strcmp( argv[i], "-ip" ) == 0 ) {
|
||||
ip_address = argv[++i];
|
||||
|
@ -125,7 +125,7 @@ TvCtrlPointDeleteNode( struct TvDeviceNode *node )
|
||||
}
|
||||
}
|
||||
|
||||
//Notify New Device Added
|
||||
/*Notify New Device Added */
|
||||
SampleUtil_StateUpdate( NULL, NULL, node->device.UDN, DEVICE_REMOVED );
|
||||
free( node );
|
||||
node = NULL;
|
||||
@ -374,7 +374,7 @@ TvCtrlPointSendAction( int service,
|
||||
param_val[param] ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "ERROR: TvCtrlPointSendAction: Trying to add action param" );
|
||||
//return -1; // TBD - BAD! leaves mutex locked
|
||||
/*return -1; // TBD - BAD! leaves mutex locked */
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -716,7 +716,7 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
if( strcmp( deviceType, TvDeviceType ) == 0 ) {
|
||||
SampleUtil_Print( "Found Tv device" );
|
||||
|
||||
// Check if this device is already in the list
|
||||
/* Check if this device is already in the list */
|
||||
tmpdevnode = GlobalDeviceList;
|
||||
while( tmpdevnode ) {
|
||||
if( strcmp( tmpdevnode->device.UDN, UDN ) == 0 ) {
|
||||
@ -727,8 +727,8 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
}
|
||||
|
||||
if( found ) {
|
||||
// The device is already there, so just update
|
||||
// the advertisement timeout field
|
||||
/* The device is already there, so just update */
|
||||
/* the advertisement timeout field */
|
||||
tmpdevnode->device.AdvrTimeOut = expires;
|
||||
} else {
|
||||
for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) {
|
||||
@ -794,7 +794,7 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
|
||||
deviceNode->next = NULL;
|
||||
|
||||
// Insert the new device node in the list
|
||||
/* Insert the new device node in the list */
|
||||
if( ( tmpdevnode = GlobalDeviceList ) ) {
|
||||
|
||||
while( tmpdevnode ) {
|
||||
@ -809,7 +809,7 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
GlobalDeviceList = deviceNode;
|
||||
}
|
||||
|
||||
//Notify New Device Added
|
||||
/*Notify New Device Added */
|
||||
SampleUtil_StateUpdate( NULL, NULL, deviceNode->device.UDN,
|
||||
DEVICE_ADDED );
|
||||
}
|
||||
@ -1219,7 +1219,7 @@ TvCtrlPointVerifyTimeouts( int incr )
|
||||
|
||||
while( curdevnode ) {
|
||||
curdevnode->device.AdvrTimeOut -= incr;
|
||||
//SampleUtil_Print("Advertisement Timeout: %d\n", curdevnode->device.AdvrTimeOut);
|
||||
/*SampleUtil_Print("Advertisement Timeout: %d\n", curdevnode->device.AdvrTimeOut); */
|
||||
|
||||
if( curdevnode->device.AdvrTimeOut <= 0 ) {
|
||||
/*
|
||||
@ -1275,7 +1275,7 @@ TvCtrlPointVerifyTimeouts( int incr )
|
||||
static int TvCtrlPointTimerLoopRun = 1;
|
||||
void *TvCtrlPointTimerLoop(void *args)
|
||||
{
|
||||
int incr = 30; // how often to verify the timeouts, in seconds
|
||||
int incr = 30; /* how often to verify the timeouts, in seconds */
|
||||
|
||||
while (TvCtrlPointTimerLoopRun) {
|
||||
isleep( incr );
|
||||
|
@ -168,4 +168,5 @@ int TvCtrlPointProcessCommand(char *cmdline);
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif //UPNP_TV_CTRLPT_H
|
||||
#endif /*UPNP_TV_CTRLPT_H */
|
||||
|
||||
|
@ -92,31 +92,31 @@ UpnpDevice_Handle device_handle = -1;
|
||||
*/
|
||||
ithread_mutex_t TVDevMutex;
|
||||
|
||||
//Color constants
|
||||
/*Color constants */
|
||||
#define MAX_COLOR 10
|
||||
#define MIN_COLOR 1
|
||||
|
||||
//Brightness constants
|
||||
/*Brightness constants */
|
||||
#define MAX_BRIGHTNESS 10
|
||||
#define MIN_BRIGHTNESS 1
|
||||
|
||||
//Power constants
|
||||
/*Power constants */
|
||||
#define POWER_ON 1
|
||||
#define POWER_OFF 0
|
||||
|
||||
//Tint constants
|
||||
/*Tint constants */
|
||||
#define MAX_TINT 10
|
||||
#define MIN_TINT 1
|
||||
|
||||
//Volume constants
|
||||
/*Volume constants */
|
||||
#define MAX_VOLUME 10
|
||||
#define MIN_VOLUME 1
|
||||
|
||||
//Contrast constants
|
||||
/*Contrast constants */
|
||||
#define MAX_CONTRAST 10
|
||||
#define MIN_CONTRAST 1
|
||||
|
||||
//Channel constants
|
||||
/*Channel constants */
|
||||
#define MAX_CHANNEL 100
|
||||
#define MIN_CHANNEL 1
|
||||
|
||||
@ -287,7 +287,7 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
*ctrlurl_pict = NULL;
|
||||
char *udn = NULL;
|
||||
|
||||
//Download description document
|
||||
/*Download description document */
|
||||
if( UpnpDownloadXmlDoc( DescDocURL, &DescDoc ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "TvDeviceStateTableInit -- Error Parsing %s\n",
|
||||
DescDocURL );
|
||||
@ -312,7 +312,7 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
goto error_handler;
|
||||
}
|
||||
|
||||
//set control service table
|
||||
/*set control service table */
|
||||
SetServiceTable( TV_SERVICE_CONTROL, udn, servid_ctrl,
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
&tv_service_table[TV_SERVICE_CONTROL] );
|
||||
@ -331,14 +331,14 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
ret = UPNP_E_INVALID_DESC;
|
||||
goto error_handler;
|
||||
}
|
||||
//set picture service table
|
||||
/*set picture service table */
|
||||
SetServiceTable( TV_SERVICE_PICTURE, udn, servid_pict,
|
||||
TvServiceType[TV_SERVICE_PICTURE],
|
||||
&tv_service_table[TV_SERVICE_PICTURE] );
|
||||
|
||||
error_handler:
|
||||
|
||||
//clean up
|
||||
/*clean up */
|
||||
if( udn )
|
||||
free( udn );
|
||||
if( servid_ctrl )
|
||||
@ -380,7 +380,7 @@ int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_ev
|
||||
const char *l_udn = NULL;
|
||||
const char *l_sid = NULL;
|
||||
|
||||
// lock state mutex
|
||||
/* lock state mutex */
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
|
||||
l_serviceId = sr_event->ServiceId;
|
||||
@ -394,22 +394,22 @@ int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_ev
|
||||
PropSet = NULL;
|
||||
|
||||
for (j = 0; j< tv_service_table[i].VariableCount; ++j) {
|
||||
// add each variable to the property set
|
||||
// for initial state dump
|
||||
/* add each variable to the property set */
|
||||
/* for initial state dump */
|
||||
UpnpAddToPropertySet(
|
||||
&PropSet,
|
||||
tv_service_table[i].VariableName[j],
|
||||
tv_service_table[i].VariableStrVal[j]);
|
||||
}
|
||||
|
||||
// dump initial state
|
||||
/* dump initial state */
|
||||
UpnpAcceptSubscriptionExt(
|
||||
device_handle,
|
||||
l_udn,
|
||||
l_serviceId,
|
||||
PropSet,
|
||||
l_sid);
|
||||
// free document
|
||||
/* free document */
|
||||
Document_free(PropSet);
|
||||
#endif
|
||||
UpnpAcceptSubscription(
|
||||
@ -454,14 +454,14 @@ int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
|
||||
for (i = 0; i < TV_SERVICE_SERVCOUNT; i++) {
|
||||
// check udn and service id
|
||||
/* check udn and service id */
|
||||
const char *devUDN =
|
||||
cgv_event->DevUDN;
|
||||
const char *serviceID =
|
||||
cgv_event->ServiceID;
|
||||
if (strcmp(devUDN, tv_service_table[i].UDN) == 0 &&
|
||||
strcmp(serviceID, tv_service_table[i].ServiceId) == 0) {
|
||||
// check variable name
|
||||
/* check variable name */
|
||||
for (j = 0; j < tv_service_table[i].VariableCount; j++) {
|
||||
const char *stateVarName =
|
||||
cgv_event->StateVarName;
|
||||
@ -561,7 +561,7 @@ int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||
if (retCode == UPNP_E_SUCCESS) {
|
||||
ca_event->ErrCode = UPNP_E_SUCCESS;
|
||||
} else {
|
||||
// copy the error string
|
||||
/* copy the error string */
|
||||
strcpy(ca_event->ErrStr, errorString);
|
||||
switch (retCode) {
|
||||
case UPNP_E_INVALID_PARAM:
|
||||
@ -601,7 +601,7 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
IN unsigned int variable,
|
||||
IN char *value )
|
||||
{
|
||||
//IXML_Document *PropSet= NULL;
|
||||
/*IXML_Document *PropSet= NULL; */
|
||||
|
||||
if( ( service >= TV_SERVICE_SERVCOUNT )
|
||||
|| ( variable >= tv_service_table[service].VariableCount )
|
||||
@ -613,8 +613,8 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
|
||||
strcpy( tv_service_table[service].VariableStrVal[variable], value );
|
||||
|
||||
/*
|
||||
//Using utility api
|
||||
#if 0
|
||||
/*Using utility api */
|
||||
PropSet= UpnpCreatePropertySet(1,tv_service_table[service].
|
||||
VariableName[variable],
|
||||
tv_service_table[service].
|
||||
@ -623,9 +623,9 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
UpnpNotifyExt(device_handle, tv_service_table[service].UDN,
|
||||
tv_service_table[service].ServiceId,PropSet);
|
||||
|
||||
//Free created property set
|
||||
/*Free created property set */
|
||||
Document_free(PropSet);
|
||||
*/
|
||||
#endif
|
||||
|
||||
UpnpNotify( device_handle,
|
||||
tv_service_table[service].UDN,
|
||||
@ -694,7 +694,7 @@ TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
( *errorString ) = NULL;
|
||||
|
||||
if( TvDeviceSetPower( POWER_ON ) ) {
|
||||
//create a response
|
||||
/*create a response */
|
||||
|
||||
if( UpnpAddToActionResponse( out, "PowerOn",
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
@ -731,7 +731,7 @@ TvDevicePowerOff( IN IXML_Document * in,
|
||||
( *out ) = NULL;
|
||||
( *errorString ) = NULL;
|
||||
if( TvDeviceSetPower( POWER_OFF ) ) {
|
||||
//create a response
|
||||
/*create a response */
|
||||
|
||||
if( UpnpAddToActionResponse( out, "PowerOff",
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
|
@ -61,74 +61,74 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//Color constants
|
||||
/*Color constants */
|
||||
#define MAX_COLOR 10
|
||||
#define MIN_COLOR 1
|
||||
|
||||
//Brightness constants
|
||||
/*Brightness constants */
|
||||
#define MAX_BRIGHTNESS 10
|
||||
#define MIN_BRIGHTNESS 1
|
||||
|
||||
//Power constants
|
||||
/*Power constants */
|
||||
#define POWER_ON 1
|
||||
#define POWER_OFF 0
|
||||
|
||||
//Tint constants
|
||||
/*Tint constants */
|
||||
#define MAX_TINT 10
|
||||
#define MIN_TINT 1
|
||||
|
||||
//Volume constants
|
||||
/*Volume constants */
|
||||
#define MAX_VOLUME 10
|
||||
#define MIN_VOLUME 1
|
||||
|
||||
//Contrast constants
|
||||
/*Contrast constants */
|
||||
#define MAX_CONTRAST 10
|
||||
#define MIN_CONTRAST 1
|
||||
|
||||
//Channel constants
|
||||
/*Channel constants */
|
||||
#define MAX_CHANNEL 100
|
||||
#define MIN_CHANNEL 1
|
||||
|
||||
//Number of services.
|
||||
/*Number of services. */
|
||||
#define TV_SERVICE_SERVCOUNT 2
|
||||
|
||||
//Index of control service
|
||||
/*Index of control service */
|
||||
#define TV_SERVICE_CONTROL 0
|
||||
|
||||
//Index of picture service
|
||||
/*Index of picture service */
|
||||
#define TV_SERVICE_PICTURE 1
|
||||
|
||||
//Number of control variables
|
||||
/*Number of control variables */
|
||||
#define TV_CONTROL_VARCOUNT 3
|
||||
|
||||
//Index of power variable
|
||||
/*Index of power variable */
|
||||
#define TV_CONTROL_POWER 0
|
||||
|
||||
//Index of channel variable
|
||||
/*Index of channel variable */
|
||||
#define TV_CONTROL_CHANNEL 1
|
||||
|
||||
//Index of volume variable
|
||||
/*Index of volume variable */
|
||||
#define TV_CONTROL_VOLUME 2
|
||||
|
||||
//Number of picture variables
|
||||
/*Number of picture variables */
|
||||
#define TV_PICTURE_VARCOUNT 4
|
||||
|
||||
//Index of color variable
|
||||
/*Index of color variable */
|
||||
#define TV_PICTURE_COLOR 0
|
||||
|
||||
//Index of tint variable
|
||||
/*Index of tint variable */
|
||||
#define TV_PICTURE_TINT 1
|
||||
|
||||
//Index of contrast variable
|
||||
/*Index of contrast variable */
|
||||
#define TV_PICTURE_CONTRAST 2
|
||||
|
||||
//Index of brightness variable
|
||||
/*Index of brightness variable */
|
||||
#define TV_PICTURE_BRIGHTNESS 3
|
||||
|
||||
//Max value length
|
||||
/*Max value length */
|
||||
#define TV_MAX_VAL_LEN 5
|
||||
|
||||
//Max actions
|
||||
/*Max actions */
|
||||
#define TV_MAXACTIONS 12
|
||||
|
||||
/* This should be the maximum VARCOUNT from above */
|
||||
@ -177,10 +177,10 @@ struct TvService {
|
||||
unsigned int VariableCount;
|
||||
};
|
||||
|
||||
//Array of service structures
|
||||
/*Array of service structures */
|
||||
extern struct TvService tv_service_table[];
|
||||
|
||||
//Device handle returned from sdk
|
||||
/*Device handle returned from sdk */
|
||||
extern UpnpDevice_Handle device_handle;
|
||||
|
||||
|
||||
@ -310,7 +310,7 @@ int TvDeviceCallbackEventHandler(Upnp_EventType, void*, void*);
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*);
|
||||
|
||||
//Control Service Actions
|
||||
/*Control Service Actions */
|
||||
|
||||
/******************************************************************************
|
||||
* TvDevicePowerOn
|
||||
@ -436,7 +436,7 @@ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT ch
|
||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
|
||||
|
||||
//Picture Service Actions
|
||||
/*Picture Service Actions */
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetColor
|
||||
|
@ -51,10 +51,10 @@ enum cmdloop_tvcmds {
|
||||
Data structure for parsing commands from the command line
|
||||
*/
|
||||
struct cmdloop_commands {
|
||||
char *str; // the string
|
||||
int cmdnum; // the command
|
||||
int numargs; // the number of arguments
|
||||
char *args; // the args
|
||||
char *str; /* the string */
|
||||
int cmdnum; /* the command */
|
||||
int numargs; /* the number of arguments */
|
||||
char *args; /* the args */
|
||||
} cmdloop_commands;
|
||||
|
||||
/*
|
||||
|
@ -125,7 +125,7 @@ TvCtrlPointDeleteNode( struct TvDeviceNode *node )
|
||||
}
|
||||
}
|
||||
|
||||
//Notify New Device Added
|
||||
/*Notify New Device Added */
|
||||
SampleUtil_StateUpdate( NULL, NULL, node->device.UDN, DEVICE_REMOVED );
|
||||
free( node );
|
||||
node = NULL;
|
||||
@ -374,7 +374,7 @@ TvCtrlPointSendAction( int service,
|
||||
param_val[param] ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "ERROR: TvCtrlPointSendAction: Trying to add action param" );
|
||||
//return -1; // TBD - BAD! leaves mutex locked
|
||||
/*return -1; // TBD - BAD! leaves mutex locked */
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -716,7 +716,7 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
if( strcmp( deviceType, TvDeviceType ) == 0 ) {
|
||||
SampleUtil_Print( "Found Tv device" );
|
||||
|
||||
// Check if this device is already in the list
|
||||
/* Check if this device is already in the list */
|
||||
tmpdevnode = GlobalDeviceList;
|
||||
while( tmpdevnode ) {
|
||||
if( strcmp( tmpdevnode->device.UDN, UDN ) == 0 ) {
|
||||
@ -727,8 +727,8 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
}
|
||||
|
||||
if( found ) {
|
||||
// The device is already there, so just update
|
||||
// the advertisement timeout field
|
||||
/* The device is already there, so just update */
|
||||
/* the advertisement timeout field */
|
||||
tmpdevnode->device.AdvrTimeOut = expires;
|
||||
} else {
|
||||
for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) {
|
||||
@ -794,7 +794,7 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
|
||||
deviceNode->next = NULL;
|
||||
|
||||
// Insert the new device node in the list
|
||||
/* Insert the new device node in the list */
|
||||
if( ( tmpdevnode = GlobalDeviceList ) ) {
|
||||
|
||||
while( tmpdevnode ) {
|
||||
@ -809,7 +809,7 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
GlobalDeviceList = deviceNode;
|
||||
}
|
||||
|
||||
//Notify New Device Added
|
||||
/*Notify New Device Added */
|
||||
SampleUtil_StateUpdate( NULL, NULL, deviceNode->device.UDN,
|
||||
DEVICE_ADDED );
|
||||
}
|
||||
@ -1219,7 +1219,7 @@ TvCtrlPointVerifyTimeouts( int incr )
|
||||
|
||||
while( curdevnode ) {
|
||||
curdevnode->device.AdvrTimeOut -= incr;
|
||||
//SampleUtil_Print("Advertisement Timeout: %d\n", curdevnode->device.AdvrTimeOut);
|
||||
/*SampleUtil_Print("Advertisement Timeout: %d\n", curdevnode->device.AdvrTimeOut); */
|
||||
|
||||
if( curdevnode->device.AdvrTimeOut <= 0 ) {
|
||||
/*
|
||||
@ -1275,7 +1275,7 @@ TvCtrlPointVerifyTimeouts( int incr )
|
||||
static int TvCtrlPointTimerLoopRun = 1;
|
||||
void *TvCtrlPointTimerLoop(void *args)
|
||||
{
|
||||
int incr = 30; // how often to verify the timeouts, in seconds
|
||||
int incr = 30; /* how often to verify the timeouts, in seconds */
|
||||
|
||||
while (TvCtrlPointTimerLoopRun) {
|
||||
isleep( incr );
|
||||
|
@ -79,7 +79,7 @@ TvDeviceCommandLoop( void *args )
|
||||
|
||||
SampleUtil_Print( "\n>> " );
|
||||
|
||||
// Get a command line
|
||||
/* Get a command line */
|
||||
fgets( cmdline, 100, stdin );
|
||||
|
||||
sscanf( cmdline, "%s", cmd );
|
||||
@ -141,7 +141,7 @@ int main( IN int argc, IN char **argv )
|
||||
|
||||
SampleUtil_Initialize( linux_print );
|
||||
|
||||
// Parse options
|
||||
/* Parse options */
|
||||
for( i = 1; i < argc; i++ ) {
|
||||
if( strcmp( argv[i], "-ip" ) == 0 ) {
|
||||
ip_address = argv[++i];
|
||||
|
@ -94,31 +94,31 @@ UpnpDevice_Handle device_handle = -1;
|
||||
*/
|
||||
ithread_mutex_t TVDevMutex;
|
||||
|
||||
//Color constants
|
||||
/*Color constants */
|
||||
#define MAX_COLOR 10
|
||||
#define MIN_COLOR 1
|
||||
|
||||
//Brightness constants
|
||||
/*Brightness constants */
|
||||
#define MAX_BRIGHTNESS 10
|
||||
#define MIN_BRIGHTNESS 1
|
||||
|
||||
//Power constants
|
||||
/*Power constants */
|
||||
#define POWER_ON 1
|
||||
#define POWER_OFF 0
|
||||
|
||||
//Tint constants
|
||||
/*Tint constants */
|
||||
#define MAX_TINT 10
|
||||
#define MIN_TINT 1
|
||||
|
||||
//Volume constants
|
||||
/*Volume constants */
|
||||
#define MAX_VOLUME 10
|
||||
#define MIN_VOLUME 1
|
||||
|
||||
//Contrast constants
|
||||
/*Contrast constants */
|
||||
#define MAX_CONTRAST 10
|
||||
#define MIN_CONTRAST 1
|
||||
|
||||
//Channel constants
|
||||
/*Channel constants */
|
||||
#define MAX_CHANNEL 100
|
||||
#define MIN_CHANNEL 1
|
||||
|
||||
@ -289,7 +289,7 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
*ctrlurl_pict = NULL;
|
||||
char *udn = NULL;
|
||||
|
||||
//Download description document
|
||||
/*Download description document */
|
||||
if( UpnpDownloadXmlDoc( DescDocURL, &DescDoc ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "TvDeviceStateTableInit -- Error Parsing %s\n",
|
||||
DescDocURL );
|
||||
@ -314,7 +314,7 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
goto error_handler;
|
||||
}
|
||||
|
||||
//set control service table
|
||||
/*set control service table */
|
||||
SetServiceTable( TV_SERVICE_CONTROL, udn, servid_ctrl,
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
&tv_service_table[TV_SERVICE_CONTROL] );
|
||||
@ -333,14 +333,14 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
ret = UPNP_E_INVALID_DESC;
|
||||
goto error_handler;
|
||||
}
|
||||
//set picture service table
|
||||
/*set picture service table */
|
||||
SetServiceTable( TV_SERVICE_PICTURE, udn, servid_pict,
|
||||
TvServiceType[TV_SERVICE_PICTURE],
|
||||
&tv_service_table[TV_SERVICE_PICTURE] );
|
||||
|
||||
error_handler:
|
||||
|
||||
//clean up
|
||||
/*clean up */
|
||||
if( udn )
|
||||
free( udn );
|
||||
if( servid_ctrl )
|
||||
@ -382,7 +382,7 @@ int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_ev
|
||||
const char *l_udn = NULL;
|
||||
const char *l_sid = NULL;
|
||||
|
||||
// lock state mutex
|
||||
/* lock state mutex */
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
|
||||
l_serviceId = sr_event->ServiceId;
|
||||
@ -396,22 +396,22 @@ int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_ev
|
||||
PropSet = NULL;
|
||||
|
||||
for (j = 0; j< tv_service_table[i].VariableCount; ++j) {
|
||||
// add each variable to the property set
|
||||
// for initial state dump
|
||||
/* add each variable to the property set */
|
||||
/* for initial state dump */
|
||||
UpnpAddToPropertySet(
|
||||
&PropSet,
|
||||
tv_service_table[i].VariableName[j],
|
||||
tv_service_table[i].VariableStrVal[j]);
|
||||
}
|
||||
|
||||
// dump initial state
|
||||
/* dump initial state */
|
||||
UpnpAcceptSubscriptionExt(
|
||||
device_handle,
|
||||
l_udn,
|
||||
l_serviceId,
|
||||
PropSet,
|
||||
l_sid);
|
||||
// free document
|
||||
/* free document */
|
||||
Document_free(PropSet);
|
||||
#endif
|
||||
UpnpAcceptSubscription(
|
||||
@ -456,14 +456,14 @@ int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
|
||||
for (i = 0; i < TV_SERVICE_SERVCOUNT; i++) {
|
||||
// check udn and service id
|
||||
/* check udn and service id */
|
||||
const char *devUDN =
|
||||
cgv_event->DevUDN;
|
||||
const char *serviceID =
|
||||
cgv_event->ServiceID;
|
||||
if (strcmp(devUDN, tv_service_table[i].UDN) == 0 &&
|
||||
strcmp(serviceID, tv_service_table[i].ServiceId) == 0) {
|
||||
// check variable name
|
||||
/* check variable name */
|
||||
for (j = 0; j < tv_service_table[i].VariableCount; j++) {
|
||||
const char *stateVarName =
|
||||
cgv_event->StateVarName;
|
||||
@ -563,7 +563,7 @@ int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||
if (retCode == UPNP_E_SUCCESS) {
|
||||
ca_event->ErrCode = UPNP_E_SUCCESS;
|
||||
} else {
|
||||
// copy the error string
|
||||
/* copy the error string */
|
||||
strcpy(ca_event->ErrStr, errorString);
|
||||
switch (retCode) {
|
||||
case UPNP_E_INVALID_PARAM:
|
||||
@ -603,7 +603,7 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
IN unsigned int variable,
|
||||
IN char *value )
|
||||
{
|
||||
//IXML_Document *PropSet= NULL;
|
||||
/*IXML_Document *PropSet= NULL; */
|
||||
|
||||
if( ( service >= TV_SERVICE_SERVCOUNT )
|
||||
|| ( variable >= tv_service_table[service].VariableCount )
|
||||
@ -615,8 +615,8 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
|
||||
strcpy( tv_service_table[service].VariableStrVal[variable], value );
|
||||
|
||||
/*
|
||||
//Using utility api
|
||||
#if 0
|
||||
/*Using utility api */
|
||||
PropSet= UpnpCreatePropertySet(1,tv_service_table[service].
|
||||
VariableName[variable],
|
||||
tv_service_table[service].
|
||||
@ -625,9 +625,9 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
UpnpNotifyExt(device_handle, tv_service_table[service].UDN,
|
||||
tv_service_table[service].ServiceId,PropSet);
|
||||
|
||||
//Free created property set
|
||||
/*Free created property set */
|
||||
Document_free(PropSet);
|
||||
*/
|
||||
#endif
|
||||
|
||||
UpnpNotify( device_handle,
|
||||
tv_service_table[service].UDN,
|
||||
@ -696,7 +696,7 @@ TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
( *errorString ) = NULL;
|
||||
|
||||
if( TvDeviceSetPower( POWER_ON ) ) {
|
||||
//create a response
|
||||
/*create a response */
|
||||
|
||||
if( UpnpAddToActionResponse( out, "PowerOn",
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
@ -733,7 +733,7 @@ TvDevicePowerOff( IN IXML_Document * in,
|
||||
( *out ) = NULL;
|
||||
( *errorString ) = NULL;
|
||||
if( TvDeviceSetPower( POWER_OFF ) ) {
|
||||
//create a response
|
||||
/*create a response */
|
||||
|
||||
if( UpnpAddToActionResponse( out, "PowerOff",
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
|
@ -61,74 +61,74 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
//Color constants
|
||||
/*Color constants */
|
||||
#define MAX_COLOR 10
|
||||
#define MIN_COLOR 1
|
||||
|
||||
//Brightness constants
|
||||
/*Brightness constants */
|
||||
#define MAX_BRIGHTNESS 10
|
||||
#define MIN_BRIGHTNESS 1
|
||||
|
||||
//Power constants
|
||||
/*Power constants */
|
||||
#define POWER_ON 1
|
||||
#define POWER_OFF 0
|
||||
|
||||
//Tint constants
|
||||
/*Tint constants */
|
||||
#define MAX_TINT 10
|
||||
#define MIN_TINT 1
|
||||
|
||||
//Volume constants
|
||||
/*Volume constants */
|
||||
#define MAX_VOLUME 10
|
||||
#define MIN_VOLUME 1
|
||||
|
||||
//Contrast constants
|
||||
/*Contrast constants */
|
||||
#define MAX_CONTRAST 10
|
||||
#define MIN_CONTRAST 1
|
||||
|
||||
//Channel constants
|
||||
/*Channel constants */
|
||||
#define MAX_CHANNEL 100
|
||||
#define MIN_CHANNEL 1
|
||||
|
||||
//Number of services.
|
||||
/*Number of services. */
|
||||
#define TV_SERVICE_SERVCOUNT 2
|
||||
|
||||
//Index of control service
|
||||
/*Index of control service */
|
||||
#define TV_SERVICE_CONTROL 0
|
||||
|
||||
//Index of picture service
|
||||
/*Index of picture service */
|
||||
#define TV_SERVICE_PICTURE 1
|
||||
|
||||
//Number of control variables
|
||||
/*Number of control variables */
|
||||
#define TV_CONTROL_VARCOUNT 3
|
||||
|
||||
//Index of power variable
|
||||
/*Index of power variable */
|
||||
#define TV_CONTROL_POWER 0
|
||||
|
||||
//Index of channel variable
|
||||
/*Index of channel variable */
|
||||
#define TV_CONTROL_CHANNEL 1
|
||||
|
||||
//Index of volume variable
|
||||
/*Index of volume variable */
|
||||
#define TV_CONTROL_VOLUME 2
|
||||
|
||||
//Number of picture variables
|
||||
/*Number of picture variables */
|
||||
#define TV_PICTURE_VARCOUNT 4
|
||||
|
||||
//Index of color variable
|
||||
/*Index of color variable */
|
||||
#define TV_PICTURE_COLOR 0
|
||||
|
||||
//Index of tint variable
|
||||
/*Index of tint variable */
|
||||
#define TV_PICTURE_TINT 1
|
||||
|
||||
//Index of contrast variable
|
||||
/*Index of contrast variable */
|
||||
#define TV_PICTURE_CONTRAST 2
|
||||
|
||||
//Index of brightness variable
|
||||
/*Index of brightness variable */
|
||||
#define TV_PICTURE_BRIGHTNESS 3
|
||||
|
||||
//Max value length
|
||||
/*Max value length */
|
||||
#define TV_MAX_VAL_LEN 5
|
||||
|
||||
//Max actions
|
||||
/*Max actions */
|
||||
#define TV_MAXACTIONS 12
|
||||
|
||||
/* This should be the maximum VARCOUNT from above */
|
||||
@ -177,10 +177,10 @@ struct TvService {
|
||||
unsigned int VariableCount;
|
||||
};
|
||||
|
||||
//Array of service structures
|
||||
/*Array of service structures */
|
||||
extern struct TvService tv_service_table[];
|
||||
|
||||
//Device handle returned from sdk
|
||||
/*Device handle returned from sdk */
|
||||
extern UpnpDevice_Handle device_handle;
|
||||
|
||||
|
||||
@ -310,7 +310,7 @@ int TvDeviceCallbackEventHandler(Upnp_EventType, void*, void*);
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*);
|
||||
|
||||
//Control Service Actions
|
||||
/*Control Service Actions */
|
||||
|
||||
/******************************************************************************
|
||||
* TvDevicePowerOn
|
||||
@ -436,7 +436,7 @@ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT ch
|
||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
|
||||
|
||||
//Picture Service Actions
|
||||
/*Picture Service Actions */
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetColor
|
||||
|
@ -66,7 +66,7 @@ struct SUpnpString
|
||||
|
||||
UpnpString *UpnpString_new()
|
||||
{
|
||||
// All bytes are zero, and so is the length of the string.
|
||||
/* All bytes are zero, and so is the length of the string. */
|
||||
struct SUpnpString *p = calloc(1, sizeof (struct SUpnpString));
|
||||
if (p == NULL) {
|
||||
goto error_handler1;
|
||||
@ -75,7 +75,7 @@ UpnpString *UpnpString_new()
|
||||
p->m_length = 0;
|
||||
#endif
|
||||
|
||||
// This byte is zero, calloc does initialize it.
|
||||
/* This byte is zero, calloc does initialize it. */
|
||||
p->m_string = calloc(1, 1);
|
||||
if (p->m_string == NULL) {
|
||||
goto error_handler2;
|
||||
@ -83,7 +83,7 @@ UpnpString *UpnpString_new()
|
||||
|
||||
return (UpnpString *)p;
|
||||
|
||||
//free(p->m_string);
|
||||
/*free(p->m_string); */
|
||||
error_handler2:
|
||||
free(p);
|
||||
error_handler1:
|
||||
@ -120,7 +120,7 @@ UpnpString *UpnpString_dup(const UpnpString *p)
|
||||
|
||||
return (UpnpString *)q;
|
||||
|
||||
//free(q->m_string);
|
||||
/*free(q->m_string); */
|
||||
error_handler2:
|
||||
free(q);
|
||||
error_handler1:
|
||||
|
@ -925,7 +925,7 @@ int UpnpRegisterRootDevice2(
|
||||
}
|
||||
HandleTable[*Hnd] = HInfo;
|
||||
|
||||
// prevent accidental removal of a non-existent alias
|
||||
/* prevent accidental removal of a non-existent alias */
|
||||
HInfo->aliasInstalled = 0;
|
||||
|
||||
retVal = GetDescDocumentAndURL(
|
||||
@ -1189,7 +1189,7 @@ int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd)
|
||||
HandleUnlock();
|
||||
return UPNP_E_INVALID_HANDLE;
|
||||
}
|
||||
//info = (struct Handle_Info *) HandleTable[Hnd];
|
||||
/*info = (struct Handle_Info *) HandleTable[Hnd]; */
|
||||
ixmlNodeList_free( HInfo->DeviceList );
|
||||
ixmlNodeList_free( HInfo->ServiceList );
|
||||
ixmlDocument_free( HInfo->DescDocument );
|
||||
@ -1202,7 +1202,7 @@ int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd)
|
||||
if( HInfo->aliasInstalled ) {
|
||||
web_server_set_alias( NULL, NULL, 0, 0 );
|
||||
}
|
||||
#endif // INTERNAL_WEB_SERVER
|
||||
#endif /* INTERNAL_WEB_SERVER */
|
||||
|
||||
if( HInfo->DeviceAf == AF_INET ) {
|
||||
UpnpSdkDeviceRegisteredV4 = 0;
|
||||
@ -2973,9 +2973,9 @@ int UpnpDownloadXmlDoc(const char *url, IXML_Document **xmlDoc)
|
||||
int UpnpGetIfInfo(const char *IfName)
|
||||
{
|
||||
#ifdef WIN32
|
||||
// ----------------------------------------------------
|
||||
// WIN32 implementation will use the IpHlpAPI library.
|
||||
// ----------------------------------------------------
|
||||
/* ---------------------------------------------------- */
|
||||
/* WIN32 implementation will use the IpHlpAPI library. */
|
||||
/* ---------------------------------------------------- */
|
||||
PIP_ADAPTER_ADDRESSES adapts = NULL;
|
||||
PIP_ADAPTER_ADDRESSES adapts_item;
|
||||
PIP_ADAPTER_UNICAST_ADDRESS uni_addr;
|
||||
@ -2987,7 +2987,7 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
int ifname_found = 0;
|
||||
int valid_addr_found = 0;
|
||||
|
||||
// Get Adapters addresses required size.
|
||||
/* Get Adapters addresses required size. */
|
||||
ret = GetAdaptersAddresses(AF_UNSPEC,
|
||||
GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_DNS_SERVER,
|
||||
NULL, adapts, &adapts_sz );
|
||||
@ -2997,13 +2997,13 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
return UPNP_E_INIT;
|
||||
}
|
||||
|
||||
// Allocate enough memory.
|
||||
/* Allocate enough memory. */
|
||||
adapts = (PIP_ADAPTER_ADDRESSES)malloc( adapts_sz );
|
||||
if( adapts == NULL ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
|
||||
// Do the call that will actually return the info.
|
||||
/* Do the call that will actually return the info. */
|
||||
ret = GetAdaptersAddresses( AF_UNSPEC,
|
||||
GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_DNS_SERVER,
|
||||
NULL, adapts, &adapts_sz );
|
||||
@ -3014,7 +3014,7 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
return UPNP_E_INIT;
|
||||
}
|
||||
|
||||
// Copy interface name, if it was provided.
|
||||
/* Copy interface name, if it was provided. */
|
||||
if( IfName != NULL ) {
|
||||
if( strlen(IfName) > sizeof(gIF_NAME) )
|
||||
return UPNP_E_INVALID_INTERFACE;
|
||||
@ -3031,17 +3031,17 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
}
|
||||
|
||||
if( ifname_found == 0 ) {
|
||||
// We have found a valid interface name. Keep it.
|
||||
/* We have found a valid interface name. Keep it. */
|
||||
strncpy( gIF_NAME, adapts_item->FriendlyName, sizeof(gIF_NAME) );
|
||||
ifname_found = 1;
|
||||
} else {
|
||||
if( strncmp( gIF_NAME, adapts_item->FriendlyName, sizeof(gIF_NAME) ) != 0 ) {
|
||||
// This is not the interface we're looking for.
|
||||
/* This is not the interface we're looking for. */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Loop thru this adapter's unicast IP addresses.
|
||||
/* Loop thru this adapter's unicast IP addresses. */
|
||||
uni_addr = adapts_item->FirstUnicastAddress;
|
||||
while( uni_addr ) {
|
||||
ip_addr = uni_addr->Address.lpSockaddr;
|
||||
@ -3051,7 +3051,7 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
valid_addr_found = 1;
|
||||
break;
|
||||
case AF_INET6:
|
||||
// Only keep IPv6 link-local addresses.
|
||||
/* Only keep IPv6 link-local addresses. */
|
||||
if( IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6 *)ip_addr)->sin6_addr) ) {
|
||||
memcpy( &v6_addr, &((struct sockaddr_in6 *)ip_addr)->sin6_addr, sizeof(v6_addr) );
|
||||
valid_addr_found = 1;
|
||||
@ -3059,14 +3059,14 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
break;
|
||||
default:
|
||||
if( valid_addr_found == 0 ) {
|
||||
// Address is not IPv4 or IPv6 and no valid address has
|
||||
// yet been found for this interface. Discard interface name.
|
||||
/* Address is not IPv4 or IPv6 and no valid address has */
|
||||
/* yet been found for this interface. Discard interface name. */
|
||||
ifname_found = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Next address.
|
||||
/* Next address. */
|
||||
uni_addr = uni_addr->Next;
|
||||
}
|
||||
|
||||
@ -3075,11 +3075,11 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
break;
|
||||
}
|
||||
|
||||
// Next adapter.
|
||||
/* Next adapter. */
|
||||
adapts_item = adapts_item->Next;
|
||||
}
|
||||
|
||||
// Failed to find a valid interface, or valid address.
|
||||
/* Failed to find a valid interface, or valid address. */
|
||||
if( ifname_found == 0 || valid_addr_found == 0 ) {
|
||||
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"Failed to find an adapter with valid IP addresses for use.\n" );
|
||||
@ -3095,7 +3095,7 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
int ifname_found = 0;
|
||||
int valid_addr_found = 0;
|
||||
|
||||
// Copy interface name, if it was provided.
|
||||
/* Copy interface name, if it was provided. */
|
||||
if( IfName != NULL ) {
|
||||
if( strlen(IfName) > sizeof(gIF_NAME) )
|
||||
return UPNP_E_INVALID_INTERFACE;
|
||||
@ -3104,18 +3104,18 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
ifname_found = 1;
|
||||
}
|
||||
|
||||
// Get system interface addresses.
|
||||
/* Get system interface addresses. */
|
||||
if( getifaddrs(&ifap) != 0 ) {
|
||||
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"getifaddrs failed to find list of addresses\n" );
|
||||
return UPNP_E_INIT;
|
||||
}
|
||||
|
||||
// cycle through available interfaces and their addresses.
|
||||
/* cycle through available interfaces and their addresses. */
|
||||
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next)
|
||||
{
|
||||
// Skip LOOPBACK interfaces, DOWN interfaces and interfaces that
|
||||
// don't support MULTICAST.
|
||||
/* Skip LOOPBACK interfaces, DOWN interfaces and interfaces that */
|
||||
/* don't support MULTICAST. */
|
||||
if( ( ifa->ifa_flags & IFF_LOOPBACK )
|
||||
|| ( !( ifa->ifa_flags & IFF_UP ) )
|
||||
|| ( !( ifa->ifa_flags & IFF_MULTICAST ) ) ) {
|
||||
@ -3123,17 +3123,17 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
}
|
||||
|
||||
if( ifname_found == 0 ) {
|
||||
// We have found a valid interface name. Keep it.
|
||||
/* We have found a valid interface name. Keep it. */
|
||||
strncpy( gIF_NAME, ifa->ifa_name, sizeof(gIF_NAME) );
|
||||
ifname_found = 1;
|
||||
} else {
|
||||
if( strncmp( gIF_NAME, ifa->ifa_name, sizeof(gIF_NAME) ) != 0 ) {
|
||||
// This is not the interface we're looking for.
|
||||
/* This is not the interface we're looking for. */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Keep interface addresses for later.
|
||||
/* Keep interface addresses for later. */
|
||||
switch( ifa->ifa_addr->sa_family )
|
||||
{
|
||||
case AF_INET:
|
||||
@ -3141,7 +3141,7 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
valid_addr_found = 1;
|
||||
break;
|
||||
case AF_INET6:
|
||||
// Only keep IPv6 link-local addresses.
|
||||
/* Only keep IPv6 link-local addresses. */
|
||||
if( IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_addr) ) {
|
||||
memcpy( &v6_addr, &((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_addr, sizeof(v6_addr) );
|
||||
valid_addr_found = 1;
|
||||
@ -3149,8 +3149,8 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
break;
|
||||
default:
|
||||
if( valid_addr_found == 0 ) {
|
||||
// Address is not IPv4 or IPv6 and no valid address has
|
||||
// yet been found for this interface. Discard interface name.
|
||||
/* Address is not IPv4 or IPv6 and no valid address has */
|
||||
/* yet been found for this interface. Discard interface name. */
|
||||
ifname_found = 0;
|
||||
}
|
||||
break;
|
||||
@ -3158,7 +3158,7 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
}
|
||||
freeifaddrs(ifap);
|
||||
|
||||
// Failed to find a valid interface, or valid address.
|
||||
/* Failed to find a valid interface, or valid address. */
|
||||
if( ifname_found == 0 || valid_addr_found == 0 ) {
|
||||
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"Failed to find an adapter with valid IP addresses for use.\n" );
|
||||
@ -3178,11 +3178,11 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
struct in6_addr v6_addr;
|
||||
int if_idx;
|
||||
char addr6[8][5];
|
||||
char buf[65]; // INET6_ADDRSTRLEN
|
||||
char buf[65]; /* INET6_ADDRSTRLEN */
|
||||
int ifname_found = 0;
|
||||
int valid_addr_found = 0;
|
||||
|
||||
// Copy interface name, if it was provided.
|
||||
/* Copy interface name, if it was provided. */
|
||||
if( IfName != NULL ) {
|
||||
if( strlen(IfName) > sizeof(gIF_NAME) )
|
||||
return UPNP_E_INVALID_INTERFACE;
|
||||
@ -3191,14 +3191,14 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
ifname_found = 1;
|
||||
}
|
||||
|
||||
// Create an unbound datagram socket to do the SIOCGIFADDR ioctl on.
|
||||
/* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */
|
||||
if( ( LocalSock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) < 0 ) {
|
||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Can't create addrlist socket\n" );
|
||||
return UPNP_E_INIT;
|
||||
}
|
||||
|
||||
// Get the interface configuration information...
|
||||
/* Get the interface configuration information... */
|
||||
ifConf.ifc_len = sizeof szBuffer;
|
||||
ifConf.ifc_ifcu.ifcu_buf = ( caddr_t ) szBuffer;
|
||||
|
||||
@ -3208,13 +3208,13 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
return UPNP_E_INIT;
|
||||
}
|
||||
|
||||
// Cycle through the list of interfaces looking for IP addresses.
|
||||
/* Cycle through the list of interfaces looking for IP addresses. */
|
||||
for( i = 0; i < ifConf.ifc_len ; ) {
|
||||
struct ifreq *pifReq =
|
||||
( struct ifreq * )( ( caddr_t ) ifConf.ifc_req + i );
|
||||
i += sizeof *pifReq;
|
||||
|
||||
// See if this is the sort of interface we want to deal with.
|
||||
/* See if this is the sort of interface we want to deal with. */
|
||||
strcpy( ifReq.ifr_name, pifReq->ifr_name );
|
||||
if( ioctl( LocalSock, SIOCGIFFLAGS, &ifReq ) < 0 ) {
|
||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||
@ -3222,8 +3222,8 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
ifReq.ifr_name );
|
||||
}
|
||||
|
||||
// Skip LOOPBACK interfaces, DOWN interfaces and interfaces that
|
||||
// don't support MULTICAST.
|
||||
/* Skip LOOPBACK interfaces, DOWN interfaces and interfaces that */
|
||||
/* don't support MULTICAST. */
|
||||
if( ( ifReq.ifr_flags & IFF_LOOPBACK )
|
||||
|| ( !( ifReq.ifr_flags & IFF_UP ) )
|
||||
|| ( !( ifReq.ifr_flags & IFF_MULTICAST ) ) ) {
|
||||
@ -3231,19 +3231,19 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
}
|
||||
|
||||
if( ifname_found == 0 ) {
|
||||
// We have found a valid interface name. Keep it.
|
||||
/* We have found a valid interface name. Keep it. */
|
||||
strncpy( gIF_NAME, pifReq->ifr_name, sizeof(gIF_NAME) );
|
||||
ifname_found = 1;
|
||||
} else {
|
||||
if( strncmp( gIF_NAME, pifReq->ifr_name, sizeof(gIF_NAME) ) != 0 ) {
|
||||
// This is not the interface we're looking for.
|
||||
/* This is not the interface we're looking for. */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Check address family.
|
||||
/* Check address family. */
|
||||
if( pifReq->ifr_addr.sa_family == AF_INET ) {
|
||||
// Copy interface name, IPv4 address and interface index.
|
||||
/* Copy interface name, IPv4 address and interface index. */
|
||||
strncpy( gIF_NAME, pifReq->ifr_name, sizeof(gIF_NAME) );
|
||||
inet_ntop(AF_INET, &((struct sockaddr_in*)&pifReq->ifr_addr)->sin_addr, gIF_IPV4, sizeof(gIF_IPV4));
|
||||
gIF_INDEX = if_nametoindex(gIF_NAME);
|
||||
@ -3251,13 +3251,13 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
valid_addr_found = 1;
|
||||
break;
|
||||
} else {
|
||||
// Address is not IPv4
|
||||
/* Address is not IPv4 */
|
||||
ifname_found = 0;
|
||||
}
|
||||
}
|
||||
close( LocalSock );
|
||||
|
||||
// Failed to find a valid interface, or valid address.
|
||||
/* Failed to find a valid interface, or valid address. */
|
||||
if (ifname_found == 0 || valid_addr_found == 0) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"Failed to find an adapter with valid IP addresses for use.\n");
|
||||
@ -3265,31 +3265,31 @@ int UpnpGetIfInfo(const char *IfName)
|
||||
return UPNP_E_INVALID_INTERFACE;
|
||||
}
|
||||
|
||||
// Try to get the IPv6 address for the same interface
|
||||
// from "/proc/net/if_inet6", if possible.
|
||||
/* Try to get the IPv6 address for the same interface */
|
||||
/* from "/proc/net/if_inet6", if possible. */
|
||||
inet6_procfd = fopen("/proc/net/if_inet6", "r");
|
||||
if (inet6_procfd) {
|
||||
while (fscanf(inet6_procfd,
|
||||
"%4s%4s%4s%4s%4s%4s%4s%4s %02x %*02x %*02x %*02x %*20s\n",
|
||||
addr6[0],addr6[1],addr6[2],addr6[3],
|
||||
addr6[4],addr6[5],addr6[6],addr6[7], &if_idx) != EOF) {
|
||||
// Get same interface as IPv4 address retrieved.
|
||||
/* Get same interface as IPv4 address retrieved. */
|
||||
if( gIF_INDEX == if_idx ) {
|
||||
snprintf(buf, sizeof(buf), "%s:%s:%s:%s:%s:%s:%s:%s",
|
||||
addr6[0],addr6[1],addr6[2],addr6[3],
|
||||
addr6[4],addr6[5],addr6[6],addr6[7]);
|
||||
// Validate formed address and check for link-local.
|
||||
/* Validate formed address and check for link-local. */
|
||||
if (inet_pton(AF_INET6, buf, &v6_addr) > 0) {
|
||||
if (IN6_IS_ADDR_ULA(&v6_addr)) {
|
||||
// Got valid IPv6 ula.
|
||||
/* Got valid IPv6 ula. */
|
||||
strncpy(gIF_IPV6_ULA_GUA, buf, sizeof(gIF_IPV6_ULA_GUA));
|
||||
} else if (IN6_IS_ADDR_GLOBAL(&v6_addr) &&
|
||||
strlen(gIF_IPV6_ULA_GUA) == 0) {
|
||||
// got a GUA, should store it while no ULA is found
|
||||
/* got a GUA, should store it while no ULA is found */
|
||||
strncpy(gIF_IPV6_ULA_GUA, buf, sizeof(gIF_IPV6_ULA_GUA));
|
||||
} else if (IN6_IS_ADDR_LINKLOCAL(&v6_addr) &&
|
||||
strlen(gIF_IPV6) == 0) {
|
||||
// got a Link local IPv6 address.
|
||||
/* got a Link local IPv6 address. */
|
||||
strncpy(gIF_IPV6, buf, sizeof(gIF_IPV6));
|
||||
}
|
||||
}
|
||||
@ -3710,7 +3710,7 @@ int UpnpAddVirtualDir(const char *newDirName)
|
||||
char dirName[NAME_SIZE];
|
||||
|
||||
if( UpnpSdkInit != 1 ) {
|
||||
// SDK is not initialized
|
||||
/* SDK is not initialized */
|
||||
return UPNP_E_FINISH;
|
||||
}
|
||||
|
||||
@ -3727,7 +3727,7 @@ int UpnpAddVirtualDir(const char *newDirName)
|
||||
|
||||
pCurVirtualDir = pVirtualDirList;
|
||||
while( pCurVirtualDir != NULL ) {
|
||||
// already has this entry
|
||||
/* already has this entry */
|
||||
if( strcmp( pCurVirtualDir->dirName, dirName ) == 0 ) {
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
@ -3744,7 +3744,7 @@ int UpnpAddVirtualDir(const char *newDirName)
|
||||
strcpy( pNewVirtualDir->dirName, dirName );
|
||||
*( pNewVirtualDir->dirName + strlen( dirName ) ) = 0;
|
||||
|
||||
if( pVirtualDirList == NULL ) { // first virtual dir
|
||||
if( pVirtualDirList == NULL ) { /* first virtual dir */
|
||||
pVirtualDirList = pNewVirtualDir;
|
||||
} else {
|
||||
pLast = pVirtualDirList;
|
||||
@ -3775,11 +3775,8 @@ int UpnpRemoveVirtualDir(const char *dirName)
|
||||
if( pVirtualDirList == NULL ) {
|
||||
return UPNP_E_INVALID_PARAM;
|
||||
}
|
||||
//
|
||||
// Handle the special case where the directory that we are
|
||||
// removing is the first and only one in the list.
|
||||
//
|
||||
|
||||
/* Handle the special case where the directory that we are */
|
||||
/* removing is the first and only one in the list. */
|
||||
if( ( pVirtualDirList->next == NULL ) &&
|
||||
( strcmp( pVirtualDirList->dirName, dirName ) == 0 ) ) {
|
||||
free( pVirtualDirList );
|
||||
|
@ -314,7 +314,7 @@ static IXML_Document *makeAction(
|
||||
}
|
||||
|
||||
if (NumArg > 0) {
|
||||
//va_start(ArgList, Arg);
|
||||
/*va_start(ArgList, Arg); */
|
||||
ArgName = Arg;
|
||||
for ( ; ; ) {
|
||||
ArgValue = va_arg(ArgList, const char *);
|
||||
@ -333,7 +333,7 @@ static IXML_Document *makeAction(
|
||||
break;
|
||||
}
|
||||
}
|
||||
//va_end(ArgList);
|
||||
/*va_end(ArgList); */
|
||||
}
|
||||
|
||||
return ActionDoc;
|
||||
|
@ -1,33 +1,33 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#if EXCLUDE_GENA == 0
|
||||
@ -63,7 +63,7 @@ error_respond( IN SOCKINFO * info,
|
||||
int major,
|
||||
minor;
|
||||
|
||||
// retrieve the minor and major version from the GENA request
|
||||
/* retrieve the minor and major version from the GENA request */
|
||||
http_CalcResponseVersion( hmsg->major_version,
|
||||
hmsg->minor_version, &major, &minor );
|
||||
|
||||
@ -96,32 +96,32 @@ genaCallback( IN http_parser_t * parser,
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
found_function = TRUE;
|
||||
if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) {
|
||||
// renew subscription
|
||||
/* renew subscription */
|
||||
gena_process_subscription_renewal_request
|
||||
( info, request );
|
||||
} else {
|
||||
// subscribe
|
||||
/* subscribe */
|
||||
gena_process_subscription_request( info, request );
|
||||
}
|
||||
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
|
||||
"got subscription request\n" );
|
||||
} else if( request->method == HTTPMETHOD_UNSUBSCRIBE ) {
|
||||
found_function = TRUE;
|
||||
// unsubscribe
|
||||
/* unsubscribe */
|
||||
gena_process_unsubscribe_request( info, request );
|
||||
#endif
|
||||
} else if( request->method == HTTPMETHOD_NOTIFY ) {
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
found_function = TRUE;
|
||||
// notify
|
||||
/* notify */
|
||||
gena_process_notification_event( info, request );
|
||||
#endif
|
||||
}
|
||||
|
||||
if( !found_function ) {
|
||||
// handle missing functions of device or ctrl pt
|
||||
/* handle missing functions of device or ctrl pt */
|
||||
error_respond( info, HTTP_NOT_IMPLEMENTED, request );
|
||||
}
|
||||
}
|
||||
#endif // EXCLUDE_GENA
|
||||
#endif /* EXCLUDE_GENA */
|
||||
|
||||
|
@ -106,7 +106,7 @@ static void GenaAutoRenewSubscription(
|
||||
}
|
||||
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "HANDLE IS VALID");
|
||||
|
||||
// make callback
|
||||
/* make callback */
|
||||
callback_fun = handle_info->Callback;
|
||||
cookie = handle_info->Cookie;
|
||||
HandleUnlock();
|
||||
@ -160,14 +160,14 @@ static int ScheduleGenaAutoRenew(
|
||||
goto end_function;
|
||||
}
|
||||
|
||||
// schedule expire event
|
||||
/* schedule expire event */
|
||||
RenewEventStruct->ErrCode = UPNP_E_SUCCESS;
|
||||
RenewEventStruct->TimeOut = TimeOut;
|
||||
strcpy(RenewEventStruct->Sid, UpnpString_get_String(tmpSID));
|
||||
strncpy(RenewEventStruct->PublisherUrl,
|
||||
UpnpString_get_String(tmpEventURL), NAME_SIZE - 1);
|
||||
|
||||
// RenewEvent->EventType=UPNP_EVENT_SUBSCRIPTION_EXPIRE;
|
||||
/* RenewEvent->EventType=UPNP_EVENT_SUBSCRIPTION_EXPIRE; */
|
||||
RenewEvent->handle = client_handle;
|
||||
RenewEvent->Event = RenewEventStruct;
|
||||
|
||||
@ -175,7 +175,7 @@ static int ScheduleGenaAutoRenew(
|
||||
TPJobSetFreeFunction(&job, (free_routine)free_upnp_timeout);
|
||||
TPJobSetPriority(&job, MED_PRIORITY);
|
||||
|
||||
// Schedule the job
|
||||
/* Schedule the job */
|
||||
return_code = TimerThreadSchedule(
|
||||
&gTimerThread,
|
||||
TimeOut - AUTO_RENEW_TIME,
|
||||
@ -215,7 +215,7 @@ static int gena_unsubscribe(
|
||||
uri_type dest_url;
|
||||
membuffer request;
|
||||
|
||||
// parse url
|
||||
/* parse url */
|
||||
return_code = http_FixStrUrl(
|
||||
UpnpString_get_String(url),
|
||||
UpnpString_get_Length(url),
|
||||
@ -224,7 +224,7 @@ static int gena_unsubscribe(
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// make request msg
|
||||
/* make request msg */
|
||||
membuffer_init(&request);
|
||||
request.size_inc = 30;
|
||||
return_code = http_MakeMessage(
|
||||
@ -233,14 +233,14 @@ static int gena_unsubscribe(
|
||||
HTTPMETHOD_UNSUBSCRIBE, &dest_url,
|
||||
"SID: ", UpnpString_get_String(sid));
|
||||
|
||||
// Not able to make the message so destroy the existing buffer
|
||||
/* Not able to make the message so destroy the existing buffer */
|
||||
if (return_code != 0) {
|
||||
membuffer_destroy(&request);
|
||||
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// send request and get reply
|
||||
/* send request and get reply */
|
||||
return_code = http_RequestAndResponse(
|
||||
&dest_url, request.buf, request.length,
|
||||
HTTPMETHOD_UNSUBSCRIBE, HTTP_DEFAULT_TIMEOUT, response);
|
||||
@ -286,7 +286,7 @@ static int gena_subscribe(
|
||||
|
||||
UpnpString_clear(sid);
|
||||
|
||||
// request timeout to string
|
||||
/* request timeout to string */
|
||||
if (timeout == NULL) {
|
||||
timeout = &local_timeout;
|
||||
}
|
||||
@ -298,7 +298,7 @@ static int gena_subscribe(
|
||||
sprintf(timeout_str, "%d", *timeout);
|
||||
}
|
||||
|
||||
// parse url
|
||||
/* parse url */
|
||||
return_code = http_FixStrUrl(
|
||||
UpnpString_get_String(url),
|
||||
UpnpString_get_Length(url),
|
||||
@ -307,11 +307,11 @@ static int gena_subscribe(
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// make request msg
|
||||
/* make request msg */
|
||||
membuffer_init(&request);
|
||||
request.size_inc = 30;
|
||||
if (renewal_sid) {
|
||||
// renew subscription
|
||||
/* renew subscription */
|
||||
return_code = http_MakeMessage(
|
||||
&request, 1, 1,
|
||||
"q" "ssc" "sscc",
|
||||
@ -319,7 +319,7 @@ static int gena_subscribe(
|
||||
"SID: ", UpnpString_get_String(renewal_sid),
|
||||
"TIMEOUT: Second-", timeout_str );
|
||||
} else {
|
||||
// subscribe
|
||||
/* subscribe */
|
||||
if (dest_url.hostport.IPaddress.ss_family == AF_INET6) {
|
||||
struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&dest_url.hostport.IPaddress;
|
||||
return_code = http_MakeMessage(
|
||||
@ -346,7 +346,7 @@ static int gena_subscribe(
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// send request and get reply
|
||||
/* send request and get reply */
|
||||
return_code = http_RequestAndResponse(&dest_url, request.buf,
|
||||
request.length,
|
||||
HTTPMETHOD_SUBSCRIBE,
|
||||
@ -365,7 +365,7 @@ static int gena_subscribe(
|
||||
return UPNP_E_SUBSCRIBE_UNACCEPTED;
|
||||
}
|
||||
|
||||
// get SID and TIMEOUT
|
||||
/* get SID and TIMEOUT */
|
||||
if (httpmsg_find_hdr(&response.msg, HDR_SID, &sid_hdr) == NULL ||
|
||||
sid_hdr.length == 0 ||
|
||||
httpmsg_find_hdr( &response.msg, HDR_TIMEOUT, &timeout_hdr ) == NULL ||
|
||||
@ -375,10 +375,10 @@ static int gena_subscribe(
|
||||
return UPNP_E_BAD_RESPONSE;
|
||||
}
|
||||
|
||||
// save timeout
|
||||
/* save timeout */
|
||||
parse_ret = matchstr(timeout_hdr.buf, timeout_hdr.length, "%iSecond-%d%0", timeout);
|
||||
if (parse_ret == PARSE_OK) {
|
||||
// nothing to do
|
||||
/* nothing to do */
|
||||
} else if (memptr_cmp_nocase(&timeout_hdr, "Second-infinite") == 0) {
|
||||
*timeout = -1;
|
||||
} else {
|
||||
@ -387,7 +387,7 @@ static int gena_subscribe(
|
||||
return UPNP_E_BAD_RESPONSE;
|
||||
}
|
||||
|
||||
// save SID
|
||||
/* save SID */
|
||||
UpnpString_set_StringN(sid, sid_hdr.buf, sid_hdr.length);
|
||||
if (UpnpString_get_String(sid) == NULL) {
|
||||
httpmsg_destroy(&response.msg);
|
||||
@ -456,7 +456,7 @@ int genaUnSubscribe(
|
||||
ClientSubscription *sub_copy = UpnpClientSubscription_new();
|
||||
http_parser_t response;
|
||||
|
||||
// validate handle and sid
|
||||
/* validate handle and sid */
|
||||
HandleLock();
|
||||
if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) {
|
||||
HandleUnlock();
|
||||
@ -518,7 +518,7 @@ int genaSubscribe(
|
||||
UpnpString_clear(out_sid);
|
||||
|
||||
HandleReadLock();
|
||||
// validate handle
|
||||
/* validate handle */
|
||||
if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) {
|
||||
HandleUnlock();
|
||||
|
||||
@ -526,7 +526,7 @@ int genaSubscribe(
|
||||
}
|
||||
HandleUnlock();
|
||||
|
||||
// subscribe
|
||||
/* subscribe */
|
||||
SubscribeLock();
|
||||
return_code = gena_subscribe(PublisherURL, TimeOut, NULL, ActualSID);
|
||||
HandleLock();
|
||||
@ -542,16 +542,16 @@ int genaSubscribe(
|
||||
goto error_handler;
|
||||
}
|
||||
|
||||
// generate client SID
|
||||
/* generate client SID */
|
||||
uuid_create(&uid );
|
||||
uuid_unpack(&uid, temp_sid);
|
||||
sprintf(temp_sid2, "uuid:%s", temp_sid);
|
||||
UpnpString_set_String(out_sid, temp_sid2);
|
||||
|
||||
// create event url
|
||||
/* create event url */
|
||||
UpnpString_assign(EventURL, PublisherURL);
|
||||
|
||||
// fill subscription
|
||||
/* fill subscription */
|
||||
if (newSubscription == NULL) {
|
||||
return_code = UPNP_E_OUTOF_MEMORY;
|
||||
goto error_handler;
|
||||
@ -563,7 +563,7 @@ int genaSubscribe(
|
||||
UpnpClientSubscription_set_Next(newSubscription, handle_info->ClientSubList);
|
||||
handle_info->ClientSubList = newSubscription;
|
||||
|
||||
// schedule expiration event
|
||||
/* schedule expiration event */
|
||||
return_code = ScheduleGenaAutoRenew(client_handle, *TimeOut, newSubscription);
|
||||
|
||||
error_handler:
|
||||
@ -594,7 +594,7 @@ int genaRenewSubscription(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// validate handle and sid
|
||||
/* validate handle and sid */
|
||||
if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) {
|
||||
HandleUnlock();
|
||||
|
||||
@ -610,7 +610,7 @@ int genaRenewSubscription(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// remove old events
|
||||
/* remove old events */
|
||||
if (TimerThreadRemove(
|
||||
&gTimerThread,
|
||||
UpnpClientSubscription_get_RenewEventId(sub),
|
||||
@ -639,17 +639,17 @@ int genaRenewSubscription(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// we just called GetHandleInfo, so we don't check for return value
|
||||
//GetHandleInfo(client_handle, &handle_info);
|
||||
/* we just called GetHandleInfo, so we don't check for return value */
|
||||
/*GetHandleInfo(client_handle, &handle_info); */
|
||||
if (return_code != UPNP_E_SUCCESS) {
|
||||
// network failure (remove client sub)
|
||||
/* network failure (remove client sub) */
|
||||
RemoveClientSubClientSID(&handle_info->ClientSubList, in_sid);
|
||||
free_client_subscription(sub_copy);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// get subscription
|
||||
/* get subscription */
|
||||
sub = GetClientSubClientSID(handle_info->ClientSubList, in_sid);
|
||||
if (sub == NULL) {
|
||||
free_client_subscription(sub_copy);
|
||||
@ -658,10 +658,10 @@ int genaRenewSubscription(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// store actual sid
|
||||
/* store actual sid */
|
||||
UpnpClientSubscription_set_ActualSID(sub, ActualSID);
|
||||
|
||||
// start renew subscription timer
|
||||
/* start renew subscription timer */
|
||||
return_code = ScheduleGenaAutoRenew(client_handle, *TimeOut, sub);
|
||||
if (return_code != GENA_SUCCESS) {
|
||||
RemoveClientSubClientSID(
|
||||
@ -698,7 +698,7 @@ void gena_process_notification_event(
|
||||
nts_hdr;
|
||||
memptr seq_hdr;
|
||||
|
||||
// get SID
|
||||
/* get SID */
|
||||
if (httpmsg_find_hdr(event, HDR_SID, &sid_hdr) == NULL) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, event);
|
||||
goto exit_function;
|
||||
@ -706,28 +706,28 @@ void gena_process_notification_event(
|
||||
sid.buff = sid_hdr.buf;
|
||||
sid.size = sid_hdr.length;
|
||||
|
||||
// get event key
|
||||
/* get event key */
|
||||
if (httpmsg_find_hdr(event, HDR_SEQ, &seq_hdr) == NULL ||
|
||||
matchstr(seq_hdr.buf, seq_hdr.length, "%d%0", &eventKey) != PARSE_OK) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, event );
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// get NT and NTS headers
|
||||
/* get NT and NTS headers */
|
||||
if (httpmsg_find_hdr(event, HDR_NT, &nt_hdr) == NULL ||
|
||||
httpmsg_find_hdr(event, HDR_NTS, &nts_hdr) == NULL) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, event );
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// verify NT and NTS headers
|
||||
/* verify NT and NTS headers */
|
||||
if (memptr_cmp(&nt_hdr, "upnp:event") != 0 ||
|
||||
memptr_cmp(&nts_hdr, "upnp:propchange") != 0) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, event);
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// parse the content (should be XML)
|
||||
/* parse the content (should be XML) */
|
||||
if (!has_xml_content_type(event) ||
|
||||
event->msg.length == 0 ||
|
||||
ixmlParseBufferEx(event->entity.buf, &ChangedVars) != IXML_SUCCESS) {
|
||||
@ -737,28 +737,28 @@ void gena_process_notification_event(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// get client info
|
||||
/* get client info */
|
||||
if (GetClientHandleInfo(&client_handle, &handle_info) != HND_CLIENT) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, event);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// get subscription based on SID
|
||||
/* get subscription based on SID */
|
||||
subscription = GetClientSubActualSID(handle_info->ClientSubList, &sid);
|
||||
if (subscription == NULL) {
|
||||
if (eventKey == 0) {
|
||||
// wait until we've finished processing a subscription
|
||||
// (if we are in the middle)
|
||||
// this is to avoid mistakenly rejecting the first event if we
|
||||
// receive it before the subscription response
|
||||
/* wait until we've finished processing a subscription */
|
||||
/* (if we are in the middle) */
|
||||
/* this is to avoid mistakenly rejecting the first event if we */
|
||||
/* receive it before the subscription response */
|
||||
HandleUnlock();
|
||||
|
||||
// try and get Subscription Lock
|
||||
// (in case we are in the process of subscribing)
|
||||
/* try and get Subscription Lock */
|
||||
/* (in case we are in the process of subscribing) */
|
||||
SubscribeLock();
|
||||
|
||||
// get HandleLock again
|
||||
/* get HandleLock again */
|
||||
HandleLock();
|
||||
|
||||
if (GetClientHandleInfo(&client_handle, &handle_info) != HND_CLIENT) {
|
||||
@ -784,25 +784,25 @@ void gena_process_notification_event(
|
||||
}
|
||||
}
|
||||
|
||||
// success
|
||||
/* success */
|
||||
error_respond(info, HTTP_OK, event);
|
||||
|
||||
// fill event struct
|
||||
/* fill event struct */
|
||||
tmpSID = UpnpClientSubscription_get_SID(subscription);
|
||||
strcpy(event_struct.Sid, UpnpString_get_String(tmpSID));
|
||||
event_struct.EventKey = eventKey;
|
||||
event_struct.ChangedVariables = ChangedVars;
|
||||
|
||||
// copy callback
|
||||
/* copy callback */
|
||||
callback = handle_info->Callback;
|
||||
cookie = handle_info->Cookie;
|
||||
|
||||
HandleUnlock();
|
||||
|
||||
// make callback with event struct
|
||||
// In future, should find a way of mainting
|
||||
// that the handle is not unregistered in the middle of a
|
||||
// callback
|
||||
/* make callback with event struct */
|
||||
/* In future, should find a way of mainting */
|
||||
/* that the handle is not unregistered in the middle of a */
|
||||
/* callback */
|
||||
callback(UPNP_EVENT_RECEIVED, &event_struct, cookie);
|
||||
|
||||
exit_function:
|
||||
|
@ -280,7 +280,7 @@ static int genaNotify(
|
||||
|
||||
membuffer_init( &mid_msg );
|
||||
|
||||
// make 'end' msg (the part that won't vary with the destination)
|
||||
/* make 'end' msg (the part that won't vary with the destination) */
|
||||
endmsg.size_inc = 30;
|
||||
if( http_MakeMessage(
|
||||
&mid_msg, 1, 1,
|
||||
@ -291,7 +291,7 @@ static int genaNotify(
|
||||
membuffer_destroy( &mid_msg );
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
// send a notify to each url until one goes thru
|
||||
/* send a notify to each url until one goes thru */
|
||||
for( i = 0; i < sub->DeliveryURLs.size; i++ ) {
|
||||
url = &sub->DeliveryURLs.parsedURLs[i];
|
||||
return_code = notify_send_and_recv(
|
||||
@ -308,7 +308,7 @@ static int genaNotify(
|
||||
return_code = GENA_SUCCESS;
|
||||
} else {
|
||||
if( response.msg.status_code == HTTP_PRECONDITION_FAILED ) {
|
||||
//Invalid SID gets removed
|
||||
/*Invalid SID gets removed */
|
||||
return_code = GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB;
|
||||
} else {
|
||||
return_code = GENA_E_NOTIFY_UNACCEPTED;
|
||||
@ -345,9 +345,9 @@ static void genaNotifyThread(
|
||||
* is a lot of notifications, then multiple threads will acquire a read
|
||||
* lock and the thread which sends the notification will be blocked forever
|
||||
* on the HandleLock at the end of this function. */
|
||||
//HandleReadLock();
|
||||
/*HandleReadLock(); */
|
||||
HandleLock();
|
||||
//validate context
|
||||
/*validate context */
|
||||
|
||||
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
|
||||
free_notify_struct( in );
|
||||
@ -366,7 +366,7 @@ static void genaNotifyThread(
|
||||
}
|
||||
|
||||
#ifdef UPNP_ENABLE_NOTIFICATION_REORDERING
|
||||
//If the event is out of order push it back to the job queue
|
||||
/*If the event is out of order push it back to the job queue */
|
||||
if( in->eventKey != sub->ToSendEventKey ) {
|
||||
|
||||
TPJobInit( &job, ( start_routine ) genaNotifyThread, input );
|
||||
@ -388,7 +388,7 @@ static void genaNotifyThread(
|
||||
|
||||
HandleUnlock();
|
||||
|
||||
//send the notify
|
||||
/*send the notify */
|
||||
return_code = genaNotify( in->headers, in->propertySet, &sub_copy );
|
||||
|
||||
freeSubscription( &sub_copy );
|
||||
@ -400,7 +400,7 @@ static void genaNotifyThread(
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
//validate context
|
||||
/*validate context */
|
||||
if( ( ( service = FindServiceId( &handle_info->ServiceTable,
|
||||
in->servId, in->UDN ) ) == NULL )
|
||||
|| ( !service->active )
|
||||
@ -412,7 +412,7 @@ static void genaNotifyThread(
|
||||
|
||||
sub->ToSendEventKey++;
|
||||
|
||||
if( sub->ToSendEventKey < 0 ) //wrap to 1 for overflow
|
||||
if( sub->ToSendEventKey < 0 ) /*wrap to 1 for overflow */
|
||||
sub->ToSendEventKey = 1;
|
||||
|
||||
if( return_code == GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB ) {
|
||||
@ -1233,20 +1233,20 @@ void gena_process_subscription_request(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// check NT header
|
||||
// Windows Millenium Interoperability:
|
||||
// we accept either upnp:event, or upnp:propchange for the NT header
|
||||
/* check NT header */
|
||||
/* Windows Millenium Interoperability: */
|
||||
/* we accept either upnp:event, or upnp:propchange for the NT header */
|
||||
if (memptr_cmp_nocase(&nt_hdr, "upnp:event") != 0) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, request);
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// if a SID is present then the we have a bad request "incompatible headers"
|
||||
/* if a SID is present then the we have a bad request "incompatible headers" */
|
||||
if (httpmsg_find_hdr(request, HDR_SID, NULL) != NULL) {
|
||||
error_respond(info, HTTP_BAD_REQUEST, request);
|
||||
goto exit_function;
|
||||
}
|
||||
// look up service by eventURL
|
||||
/* look up service by eventURL */
|
||||
event_url_path = str_alloc(request->uri.pathquery.buff, request->uri.pathquery.size);
|
||||
if (event_url_path == NULL) {
|
||||
error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request);
|
||||
@ -1259,7 +1259,7 @@ void gena_process_subscription_request(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// CURRENTLY, ONLY ONE DEVICE
|
||||
/* CURRENTLY, ONLY ONE DEVICE */
|
||||
if (GetDeviceHandleInfo(info->foreign_sockaddr.ss_family ,
|
||||
&device_handle, &handle_info) != HND_DEVICE) {
|
||||
free(event_url_path);
|
||||
@ -1282,14 +1282,14 @@ void gena_process_subscription_request(
|
||||
service->TotalSubscriptions,
|
||||
handle_info->MaxSubscriptions);
|
||||
|
||||
// too many subscriptions
|
||||
/* too many subscriptions */
|
||||
if (handle_info->MaxSubscriptions != -1 &&
|
||||
service->TotalSubscriptions >= handle_info->MaxSubscriptions) {
|
||||
error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
// generate new subscription
|
||||
/* generate new subscription */
|
||||
sub = (subscription *)malloc(sizeof (subscription));
|
||||
if (sub == NULL) {
|
||||
error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request);
|
||||
@ -1304,7 +1304,7 @@ void gena_process_subscription_request(
|
||||
sub->DeliveryURLs.URLs = NULL;
|
||||
sub->DeliveryURLs.parsedURLs = NULL;
|
||||
|
||||
// check for valid callbacks
|
||||
/* check for valid callbacks */
|
||||
if (httpmsg_find_hdr( request, HDR_CALLBACK, &callback_hdr) == NULL) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, request);
|
||||
freeSubscriptionList(sub);
|
||||
@ -1324,20 +1324,20 @@ void gena_process_subscription_request(
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
// set the timeout
|
||||
/* set the timeout */
|
||||
if (httpmsg_find_hdr(request, HDR_TIMEOUT, &timeout_hdr) != NULL) {
|
||||
if (matchstr(timeout_hdr.buf, timeout_hdr.length,
|
||||
"%iSecond-%d%0", &time_out) == PARSE_OK) {
|
||||
// nothing
|
||||
/* nothing */
|
||||
} else if(memptr_cmp_nocase(&timeout_hdr, "Second-infinite") == 0) {
|
||||
// infinite timeout
|
||||
/* infinite timeout */
|
||||
time_out = -1;
|
||||
} else {
|
||||
// default is > 1800 seconds
|
||||
/* default is > 1800 seconds */
|
||||
time_out = DEFAULT_TIMEOUT;
|
||||
}
|
||||
}
|
||||
// replace infinite timeout with max timeout, if possible
|
||||
/* replace infinite timeout with max timeout, if possible */
|
||||
if (handle_info->MaxSubscriptionTimeOut != -1) {
|
||||
if (time_out == -1 ||
|
||||
time_out > handle_info->MaxSubscriptionTimeOut) {
|
||||
@ -1347,40 +1347,40 @@ void gena_process_subscription_request(
|
||||
if (time_out >= 0) {
|
||||
sub->expireTime = time(NULL) + time_out;
|
||||
} else {
|
||||
// infinite time
|
||||
/* infinite time */
|
||||
sub->expireTime = 0;
|
||||
}
|
||||
|
||||
// generate SID
|
||||
/* generate SID */
|
||||
uuid_create(&uid);
|
||||
uuid_unpack(&uid, temp_sid);
|
||||
sprintf(sub->sid, "uuid:%s", temp_sid);
|
||||
|
||||
// respond OK
|
||||
/* respond OK */
|
||||
if (respond_ok(info, time_out, sub, request) != UPNP_E_SUCCESS) {
|
||||
freeSubscriptionList(sub);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
// add to subscription list
|
||||
/* add to subscription list */
|
||||
sub->next = service->subscriptionList;
|
||||
service->subscriptionList = sub;
|
||||
service->TotalSubscriptions++;
|
||||
|
||||
// finally generate callback for init table dump
|
||||
/* finally generate callback for init table dump */
|
||||
request_struct.ServiceId = service->serviceId;
|
||||
request_struct.UDN = service->UDN;
|
||||
strcpy((char *)request_struct.Sid, sub->sid);
|
||||
|
||||
// copy callback
|
||||
/* copy callback */
|
||||
callback_fun = handle_info->Callback;
|
||||
cookie = handle_info->Cookie;
|
||||
|
||||
HandleUnlock();
|
||||
|
||||
// make call back with request struct
|
||||
// in the future should find a way of mainting that the handle
|
||||
// is not unregistered in the middle of a callback
|
||||
/* make call back with request struct */
|
||||
/* in the future should find a way of mainting that the handle */
|
||||
/* is not unregistered in the middle of a callback */
|
||||
callback_fun(UPNP_EVENT_SUBSCRIPTION_REQUEST, &request_struct, cookie);
|
||||
|
||||
exit_function:
|
||||
@ -1402,13 +1402,13 @@ void gena_process_subscription_renewal_request(
|
||||
membuffer event_url_path;
|
||||
memptr timeout_hdr;
|
||||
|
||||
// if a CALLBACK or NT header is present, then it is an error
|
||||
/* if a CALLBACK or NT header is present, then it is an error */
|
||||
if( httpmsg_find_hdr( request, HDR_CALLBACK, NULL ) != NULL ||
|
||||
httpmsg_find_hdr( request, HDR_NT, NULL ) != NULL ) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, request );
|
||||
return;
|
||||
}
|
||||
// get SID
|
||||
/* get SID */
|
||||
if( httpmsg_find_hdr( request, HDR_SID, &temp_hdr ) == NULL ||
|
||||
temp_hdr.length > SID_SIZE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@ -1417,7 +1417,7 @@ void gena_process_subscription_renewal_request(
|
||||
memcpy( sid, temp_hdr.buf, temp_hdr.length );
|
||||
sid[temp_hdr.length] = '\0';
|
||||
|
||||
// lookup service by eventURL
|
||||
/* lookup service by eventURL */
|
||||
membuffer_init( &event_url_path );
|
||||
if( membuffer_append( &event_url_path, request->uri.pathquery.buff,
|
||||
request->uri.pathquery.size ) != 0 ) {
|
||||
@ -1427,7 +1427,7 @@ void gena_process_subscription_renewal_request(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// CURRENTLY, ONLY SUPPORT ONE DEVICE
|
||||
/* CURRENTLY, ONLY SUPPORT ONE DEVICE */
|
||||
if( GetDeviceHandleInfo( info->foreign_sockaddr.ss_family,
|
||||
&device_handle, &handle_info ) != HND_DEVICE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@ -1439,7 +1439,7 @@ void gena_process_subscription_renewal_request(
|
||||
event_url_path.buf );
|
||||
membuffer_destroy( &event_url_path );
|
||||
|
||||
// get subscription
|
||||
/* get subscription */
|
||||
if( service == NULL ||
|
||||
!service->active ||
|
||||
( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ) {
|
||||
@ -1453,7 +1453,7 @@ void gena_process_subscription_renewal_request(
|
||||
"Max Subscriptions allowed:%d\n",
|
||||
service->TotalSubscriptions,
|
||||
handle_info->MaxSubscriptions );
|
||||
// too many subscriptions
|
||||
/* too many subscriptions */
|
||||
if( handle_info->MaxSubscriptions != -1 &&
|
||||
service->TotalSubscriptions > handle_info->MaxSubscriptions ) {
|
||||
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
|
||||
@ -1461,25 +1461,25 @@ void gena_process_subscription_renewal_request(
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
// set the timeout
|
||||
/* set the timeout */
|
||||
if( httpmsg_find_hdr( request, HDR_TIMEOUT, &timeout_hdr ) != NULL ) {
|
||||
if( matchstr( timeout_hdr.buf, timeout_hdr.length,
|
||||
"%iSecond-%d%0", &time_out ) == PARSE_OK ) {
|
||||
|
||||
//nothing
|
||||
/*nothing */
|
||||
|
||||
} else if( memptr_cmp_nocase( &timeout_hdr, "Second-infinite" ) ==
|
||||
0 ) {
|
||||
|
||||
time_out = -1; // inifinite timeout
|
||||
time_out = -1; /* inifinite timeout */
|
||||
|
||||
} else {
|
||||
time_out = DEFAULT_TIMEOUT; // default is > 1800 seconds
|
||||
time_out = DEFAULT_TIMEOUT; /* default is > 1800 seconds */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// replace infinite timeout with max timeout, if possible
|
||||
/* replace infinite timeout with max timeout, if possible */
|
||||
if( handle_info->MaxSubscriptionTimeOut != -1 ) {
|
||||
if( time_out == -1 ||
|
||||
time_out > handle_info->MaxSubscriptionTimeOut ) {
|
||||
@ -1513,13 +1513,13 @@ void gena_process_unsubscribe_request(
|
||||
memptr temp_hdr;
|
||||
membuffer event_url_path;
|
||||
|
||||
// if a CALLBACK or NT header is present, then it is an error
|
||||
/* if a CALLBACK or NT header is present, then it is an error */
|
||||
if( httpmsg_find_hdr( request, HDR_CALLBACK, NULL ) != NULL ||
|
||||
httpmsg_find_hdr( request, HDR_NT, NULL ) != NULL ) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, request );
|
||||
return;
|
||||
}
|
||||
// get SID
|
||||
/* get SID */
|
||||
if( httpmsg_find_hdr( request, HDR_SID, &temp_hdr ) == NULL ||
|
||||
temp_hdr.length > SID_SIZE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@ -1528,7 +1528,7 @@ void gena_process_unsubscribe_request(
|
||||
memcpy( sid, temp_hdr.buf, temp_hdr.length );
|
||||
sid[temp_hdr.length] = '\0';
|
||||
|
||||
// lookup service by eventURL
|
||||
/* lookup service by eventURL */
|
||||
membuffer_init( &event_url_path );
|
||||
if( membuffer_append( &event_url_path, request->uri.pathquery.buff,
|
||||
request->uri.pathquery.size ) != 0 ) {
|
||||
@ -1538,7 +1538,7 @@ void gena_process_unsubscribe_request(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// CURRENTLY, ONLY SUPPORT ONE DEVICE
|
||||
/* CURRENTLY, ONLY SUPPORT ONE DEVICE */
|
||||
if( GetDeviceHandleInfo( info->foreign_sockaddr.ss_family,
|
||||
&device_handle, &handle_info ) != HND_DEVICE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@ -1550,7 +1550,7 @@ void gena_process_unsubscribe_request(
|
||||
event_url_path.buf );
|
||||
membuffer_destroy( &event_url_path );
|
||||
|
||||
// validate service
|
||||
/* validate service */
|
||||
if( service == NULL ||
|
||||
!service->active || GetSubscriptionSID( sid, service ) == NULL )
|
||||
{
|
||||
@ -1560,7 +1560,7 @@ void gena_process_unsubscribe_request(
|
||||
}
|
||||
|
||||
RemoveSubscriptionSID(sid, service);
|
||||
error_respond(info, HTTP_OK, request); // success
|
||||
error_respond(info, HTTP_OK, request); /* success */
|
||||
|
||||
HandleUnlock();
|
||||
}
|
||||
|
@ -46,7 +46,7 @@
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
|
||||
|
||||
#include <stdlib.h> // for calloc(), free()
|
||||
#include <stdlib.h> /* for calloc(), free() */
|
||||
|
||||
|
||||
struct SClientSubscription {
|
||||
@ -113,12 +113,12 @@ ClientSubscription *UpnpClientSubscription_dup(const ClientSubscription *p)
|
||||
void UpnpClientSubscription_assign(ClientSubscription *q, const ClientSubscription *p)
|
||||
{
|
||||
if (q != p) {
|
||||
// Do not copy RenewEventId
|
||||
/* Do not copy RenewEventId */
|
||||
((struct SClientSubscription *)q)->m_renewEventId = -1;
|
||||
UpnpClientSubscription_set_SID(q, UpnpClientSubscription_get_SID(p));
|
||||
UpnpClientSubscription_set_ActualSID(q, UpnpClientSubscription_get_ActualSID(p));
|
||||
UpnpClientSubscription_set_EventURL(q, UpnpClientSubscription_get_EventURL(p));
|
||||
// Do not copy m_next
|
||||
/* Do not copy m_next */
|
||||
((struct SClientSubscription *)q)->m_next = NULL;
|
||||
}
|
||||
}
|
||||
@ -238,8 +238,8 @@ void free_client_subscription(ClientSubscription *sub)
|
||||
UpnpClientSubscription_strcpy_ActualSID(sub, "");
|
||||
UpnpClientSubscription_strcpy_EventURL(sub, "");
|
||||
if (renewEventId != -1) {
|
||||
// do not remove timer event of copy
|
||||
// invalid timer event id
|
||||
/* do not remove timer event of copy */
|
||||
/* invalid timer event id */
|
||||
if (TimerThreadRemove(&gTimerThread, renewEventId, &tempJob) == 0) {
|
||||
event = (upnp_timeout *)tempJob.arg;
|
||||
free_upnp_timeout(event);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -394,7 +394,7 @@ int http_RecvMessage(
|
||||
while (TRUE) {
|
||||
num_read = sock_read(info, buf, sizeof buf, timeout_secs);
|
||||
if (num_read > 0) {
|
||||
// got data
|
||||
/* got data */
|
||||
status = parser_append(parser, buf, num_read);
|
||||
if (status == PARSE_SUCCESS) {
|
||||
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
|
||||
@ -416,10 +416,10 @@ int http_RecvMessage(
|
||||
ret = UPNP_E_BAD_HTTPMSG;
|
||||
goto ExitFunction;
|
||||
} else if (status == PARSE_INCOMPLETE_ENTITY) {
|
||||
// read until close
|
||||
/* read until close */
|
||||
ok_on_close = TRUE;
|
||||
} else if (status == PARSE_CONTINUE_1) {
|
||||
// Web post request.
|
||||
/* Web post request. */
|
||||
line = __LINE__;
|
||||
ret = PARSE_SUCCESS;
|
||||
goto ExitFunction;
|
||||
@ -434,8 +434,8 @@ int http_RecvMessage(
|
||||
ret = 0;
|
||||
goto ExitFunction;
|
||||
} else {
|
||||
// partial msg
|
||||
*http_error_code = HTTP_BAD_REQUEST; // or response
|
||||
/* partial msg */
|
||||
*http_error_code = HTTP_BAD_REQUEST; /* or response */
|
||||
line = __LINE__;
|
||||
ret = UPNP_E_BAD_HTTPMSG;
|
||||
goto ExitFunction;
|
||||
@ -478,8 +478,8 @@ ExitFunction:
|
||||
* char *buf = "POST /xyz.cgi http/1.1\r\n\r\n";
|
||||
* char *filename = "foo.dat";
|
||||
* int status = http_SendMessage( tcpsock, "mf",
|
||||
* buf, strlen(buf), // args for memory buffer
|
||||
* filename ); // arg for file
|
||||
* buf, strlen(buf),
|
||||
* filename );
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
@ -507,7 +507,7 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
char Chunk_Header[CHUNK_HEADER_SIZE];
|
||||
int RetVal = 0;
|
||||
|
||||
// 10 byte allocated for chunk header.
|
||||
/* 10 byte allocated for chunk header. */
|
||||
int Data_Buf_Size = WEB_SERVER_BUF_SIZE;
|
||||
|
||||
va_start( argp, fmt );
|
||||
@ -536,7 +536,7 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
|
||||
file_buf = ChunkBuf + CHUNK_HEADER_SIZE;
|
||||
} else if( c == 'f' ) {
|
||||
// file name
|
||||
/* file name */
|
||||
filename = va_arg(argp, char *);
|
||||
if( Instr && Instr->IsVirtualFile ) {
|
||||
Fp = (virtualDirCallback.open)( filename, UPNP_READ );
|
||||
@ -572,7 +572,7 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
}
|
||||
amount_to_be_read = amount_to_be_read - num_read;
|
||||
if( Instr->ReadSendSize < 0 ) {
|
||||
// read until close
|
||||
/* read until close */
|
||||
amount_to_be_read = Data_Buf_Size;
|
||||
}
|
||||
} else {
|
||||
@ -580,7 +580,7 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
}
|
||||
|
||||
if( num_read == 0 ) {
|
||||
// EOF so no more to send.
|
||||
/* EOF so no more to send. */
|
||||
if( Instr && Instr->IsChunkActive ) {
|
||||
char *str = "0\r\n\r\n";
|
||||
num_written = sock_write(info, str, strlen(str), TimeOut);
|
||||
@ -589,45 +589,45 @@ http_SendMessage( IN SOCKINFO * info,
|
||||
}
|
||||
goto Cleanup_File;
|
||||
}
|
||||
// Create chunk for the current buffer.
|
||||
/* Create chunk for the current buffer. */
|
||||
if( Instr && Instr->IsChunkActive ) {
|
||||
// Copy CRLF at the end of the chunk
|
||||
/* Copy CRLF at the end of the chunk */
|
||||
memcpy( file_buf + num_read, "\r\n", 2 );
|
||||
|
||||
// Hex length for the chunk size.
|
||||
/* Hex length for the chunk size. */
|
||||
sprintf( Chunk_Header, "%x", num_read );
|
||||
|
||||
//itoa(num_read,Chunk_Header,16);
|
||||
/*itoa(num_read,Chunk_Header,16); */
|
||||
strcat( Chunk_Header, "\r\n" );
|
||||
|
||||
// Copy the chunk size header
|
||||
/* Copy the chunk size header */
|
||||
memcpy( file_buf - strlen( Chunk_Header ),
|
||||
Chunk_Header, strlen( Chunk_Header ) );
|
||||
|
||||
// on the top of the buffer.
|
||||
//file_buf[num_read+strlen(Chunk_Header)] = NULL;
|
||||
//printf("Sending %s\n",file_buf-strlen(Chunk_Header));
|
||||
/* on the top of the buffer. */
|
||||
/*file_buf[num_read+strlen(Chunk_Header)] = NULL; */
|
||||
/*printf("Sending %s\n",file_buf-strlen(Chunk_Header)); */
|
||||
num_written = sock_write(
|
||||
info, file_buf - strlen( Chunk_Header ),
|
||||
num_read + strlen( Chunk_Header ) + 2, TimeOut );
|
||||
|
||||
if( num_written !=
|
||||
num_read + ( int )strlen( Chunk_Header ) + 2 ) {
|
||||
// Send error nothing we can do.
|
||||
/* Send error nothing we can do. */
|
||||
goto Cleanup_File;
|
||||
}
|
||||
} else {
|
||||
// write data
|
||||
/* write data */
|
||||
num_written = sock_write( info, file_buf, num_read, TimeOut );
|
||||
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
|
||||
">>> (SENT) >>>\n%.*s\n------------\n",
|
||||
( int )num_written, file_buf );
|
||||
// Send error nothing we can do
|
||||
/* Send error nothing we can do */
|
||||
if( num_written != num_read ) {
|
||||
goto Cleanup_File;
|
||||
}
|
||||
}
|
||||
} // while
|
||||
} /* while */
|
||||
Cleanup_File:
|
||||
va_end( argp );
|
||||
if( Instr && Instr->IsVirtualFile ) {
|
||||
@ -639,7 +639,7 @@ Cleanup_File:
|
||||
return RetVal;
|
||||
|
||||
} else if( c == 'b' ) {
|
||||
// memory buffer
|
||||
/* memory buffer */
|
||||
buf = va_arg(argp, char *);
|
||||
buf_length = va_arg(argp, size_t);
|
||||
if( buf_length > 0 ) {
|
||||
@ -779,7 +779,7 @@ http_Download( IN const char *url_str,
|
||||
membuffer request;
|
||||
char *urlPath = alloca( strlen( url_str ) + 1 );
|
||||
|
||||
//ret_code = parse_uri( (char*)url_str, strlen(url_str), &url );
|
||||
/*ret_code = parse_uri( (char*)url_str, strlen(url_str), &url ); */
|
||||
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n",
|
||||
url_str );
|
||||
ret_code =
|
||||
@ -787,7 +787,7 @@ http_Download( IN const char *url_str,
|
||||
if( ret_code != UPNP_E_SUCCESS ) {
|
||||
return ret_code;
|
||||
}
|
||||
// make msg
|
||||
/* make msg */
|
||||
membuffer_init( &request );
|
||||
|
||||
strcpy( urlPath, url_str );
|
||||
@ -824,7 +824,7 @@ http_Download( IN const char *url_str,
|
||||
UpnpPrintf(UPNP_INFO, HTTP, __FILE__, __LINE__,
|
||||
"HTTP Buffer:\n%s\n" "----------END--------\n",
|
||||
request.buf);
|
||||
// get doc msg
|
||||
/* get doc msg */
|
||||
ret_code =
|
||||
http_RequestAndResponse( &url, request.buf, request.length,
|
||||
HTTPMETHOD_GET, timeout_secs, &response );
|
||||
@ -838,13 +838,13 @@ http_Download( IN const char *url_str,
|
||||
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" );
|
||||
print_http_headers( &response.msg );
|
||||
|
||||
// optional content-type
|
||||
/* optional content-type */
|
||||
if( content_type ) {
|
||||
if( httpmsg_find_hdr( &response.msg, HDR_CONTENT_TYPE, &ctype ) ==
|
||||
NULL ) {
|
||||
*content_type = '\0'; // no content-type
|
||||
*content_type = '\0'; /* no content-type */
|
||||
} else {
|
||||
// safety
|
||||
/* safety */
|
||||
copy_len = ctype.length < LINE_SIZE - 1 ?
|
||||
ctype.length : LINE_SIZE - 1;
|
||||
|
||||
@ -852,36 +852,36 @@ http_Download( IN const char *url_str,
|
||||
content_type[copy_len] = '\0';
|
||||
}
|
||||
}
|
||||
//
|
||||
// extract doc from msg
|
||||
//
|
||||
/* */
|
||||
/* extract doc from msg */
|
||||
/* */
|
||||
|
||||
if( ( *doc_length = ( int )response.msg.entity.length ) == 0 ) {
|
||||
// 0-length msg
|
||||
/* 0-length msg */
|
||||
*document = NULL;
|
||||
} else if( response.msg.status_code == HTTP_OK ) {
|
||||
//LEAK_FIX_MK
|
||||
// copy entity
|
||||
entity_start = response.msg.entity.buf; // what we want
|
||||
msg_length = response.msg.msg.length; // save for posterity
|
||||
msg_start = membuffer_detach( &response.msg.msg ); // whole msg
|
||||
/*LEAK_FIX_MK */
|
||||
/* copy entity */
|
||||
entity_start = response.msg.entity.buf; /* what we want */
|
||||
msg_length = response.msg.msg.length; /* save for posterity */
|
||||
msg_start = membuffer_detach( &response.msg.msg ); /* whole msg */
|
||||
|
||||
// move entity to the start; copy null-terminator too
|
||||
/* move entity to the start; copy null-terminator too */
|
||||
memmove( msg_start, entity_start, *doc_length + 1 );
|
||||
|
||||
// save mem for body only
|
||||
*document = realloc( msg_start, *doc_length + 1 ); //LEAK_FIX_MK
|
||||
// *document = Realloc( msg_start,msg_length, *doc_length + 1 );//LEAK_FIX_MK
|
||||
/* save mem for body only */
|
||||
*document = realloc( msg_start, *doc_length + 1 ); /*LEAK_FIX_MK */
|
||||
/* *document = Realloc( msg_start,msg_length, *doc_length + 1 ); LEAK_FIX_MK */
|
||||
|
||||
// shrink can't fail
|
||||
/* shrink can't fail */
|
||||
assert( ( int )msg_length > *doc_length );
|
||||
assert( *document != NULL );
|
||||
}
|
||||
|
||||
if( response.msg.status_code == HTTP_OK ) {
|
||||
ret_code = 0; // success
|
||||
ret_code = 0; /* success */
|
||||
} else {
|
||||
// server sent error msg (not requested doc)
|
||||
/* server sent error msg (not requested doc) */
|
||||
ret_code = response.msg.status_code;
|
||||
}
|
||||
|
||||
@ -935,7 +935,7 @@ MakePostMessage( const char *url_str,
|
||||
if( ret_code != UPNP_E_SUCCESS ) {
|
||||
return ret_code;
|
||||
}
|
||||
// make msg
|
||||
/* make msg */
|
||||
membuffer_init( request );
|
||||
|
||||
strcpy( urlPath, url_str );
|
||||
@ -1045,12 +1045,12 @@ http_WriteHttpPost( IN void *Handle,
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
|
||||
// begin chunk
|
||||
/* begin chunk */
|
||||
sprintf( tempbuf, "%x\r\n", ( *size ) );
|
||||
tempSize = strlen( tempbuf );
|
||||
memcpy( tempbuf + tempSize, buf, ( *size ) );
|
||||
memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 );
|
||||
// end of chunk
|
||||
/* end of chunk */
|
||||
tempbufSize = tempSize + ( *size ) + 2;
|
||||
freeTempbuf = 1;
|
||||
}
|
||||
@ -1061,7 +1061,7 @@ http_WriteHttpPost( IN void *Handle,
|
||||
|
||||
numWritten =
|
||||
sock_write( &handle->sock_info, tempbuf, tempbufSize, &timeout );
|
||||
//(*size) = sock_write(&handle->sock_info,tempbuf,tempbufSize,&timeout);
|
||||
/*(*size) = sock_write(&handle->sock_info,tempbuf,tempbufSize,&timeout); */
|
||||
|
||||
if( freeTempbuf ) {
|
||||
free( tempbuf );
|
||||
@ -1109,9 +1109,9 @@ http_CloseHttpPost( IN void *Handle,
|
||||
}
|
||||
|
||||
if( handle->contentLength == UPNP_USING_CHUNKED ) {
|
||||
retc = sock_write( &handle->sock_info, "0\r\n\r\n", strlen( "0\r\n\r\n" ), &timeout ); //send last chunk
|
||||
retc = sock_write( &handle->sock_info, "0\r\n\r\n", strlen( "0\r\n\r\n" ), &timeout ); /*send last chunk */
|
||||
}
|
||||
//read response
|
||||
/*read response */
|
||||
parser_response_init( &response, HTTPMETHOD_POST );
|
||||
|
||||
retc =
|
||||
@ -1120,7 +1120,7 @@ http_CloseHttpPost( IN void *Handle,
|
||||
|
||||
( *httpStatus ) = http_error_code;
|
||||
|
||||
sock_destroy( &handle->sock_info, SD_BOTH ); //should shutdown completely
|
||||
sock_destroy( &handle->sock_info, SD_BOTH ); /*should shutdown completely */
|
||||
|
||||
httpmsg_destroy( &response.msg );
|
||||
free( handle );
|
||||
@ -1262,7 +1262,7 @@ MakeGetMessage( const char *url_str,
|
||||
if( ret_code != UPNP_E_SUCCESS ) {
|
||||
return ret_code;
|
||||
}
|
||||
// make msg
|
||||
/* make msg */
|
||||
membuffer_init( request );
|
||||
|
||||
strcpy( urlPath, url_str );
|
||||
@ -1339,7 +1339,7 @@ static int ReadResponseLineAndHeaders(
|
||||
int done = 0;
|
||||
int ret_code = 0;
|
||||
|
||||
//read response line
|
||||
/*read response line */
|
||||
|
||||
status = parser_parse_responseline( parser );
|
||||
if( status == PARSE_OK ) {
|
||||
@ -1347,17 +1347,17 @@ static int ReadResponseLineAndHeaders(
|
||||
} else if( status == PARSE_INCOMPLETE ) {
|
||||
done = 0;
|
||||
} else {
|
||||
//error
|
||||
/*error */
|
||||
return status;
|
||||
}
|
||||
|
||||
while( !done ) {
|
||||
num_read = sock_read( info, buf, sizeof( buf ), timeout_secs );
|
||||
if( num_read > 0 ) {
|
||||
// append data to buffer
|
||||
/* append data to buffer */
|
||||
ret_code = membuffer_append( &parser->msg.msg, buf, num_read );
|
||||
if( ret_code != 0 ) {
|
||||
// set failure status
|
||||
/* set failure status */
|
||||
parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR;
|
||||
return PARSE_FAILURE;
|
||||
}
|
||||
@ -1367,13 +1367,13 @@ static int ReadResponseLineAndHeaders(
|
||||
} else if( status == PARSE_INCOMPLETE ) {
|
||||
done = 0;
|
||||
} else {
|
||||
//error
|
||||
/*error */
|
||||
return status;
|
||||
}
|
||||
} else if( num_read == 0 ) {
|
||||
|
||||
// partial msg
|
||||
*http_error_code = HTTP_BAD_REQUEST; // or response
|
||||
/* partial msg */
|
||||
*http_error_code = HTTP_BAD_REQUEST; /* or response */
|
||||
return UPNP_E_BAD_HTTPMSG;
|
||||
|
||||
} else {
|
||||
@ -1391,18 +1391,18 @@ static int ReadResponseLineAndHeaders(
|
||||
} else if( status == PARSE_INCOMPLETE ) {
|
||||
done = 0;
|
||||
} else {
|
||||
//error
|
||||
/*error */
|
||||
return status;
|
||||
}
|
||||
|
||||
//read headers
|
||||
/*read headers */
|
||||
while( !done ) {
|
||||
num_read = sock_read( info, buf, sizeof( buf ), timeout_secs );
|
||||
if( num_read > 0 ) {
|
||||
// append data to buffer
|
||||
/* append data to buffer */
|
||||
ret_code = membuffer_append( &parser->msg.msg, buf, num_read );
|
||||
if( ret_code != 0 ) {
|
||||
// set failure status
|
||||
/* set failure status */
|
||||
parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR;
|
||||
return PARSE_FAILURE;
|
||||
}
|
||||
@ -1414,13 +1414,13 @@ static int ReadResponseLineAndHeaders(
|
||||
} else if( status == PARSE_INCOMPLETE ) {
|
||||
done = 0;
|
||||
} else {
|
||||
//error
|
||||
/*error */
|
||||
return status;
|
||||
}
|
||||
} else if( num_read == 0 ) {
|
||||
|
||||
// partial msg
|
||||
*http_error_code = HTTP_BAD_REQUEST; // or response
|
||||
/* partial msg */
|
||||
*http_error_code = HTTP_BAD_REQUEST; /* or response */
|
||||
return UPNP_E_BAD_HTTPMSG;
|
||||
|
||||
} else {
|
||||
@ -1473,7 +1473,7 @@ int http_ReadHttpGet(
|
||||
}
|
||||
return UPNP_E_INVALID_PARAM;
|
||||
}
|
||||
//first parse what has already been gotten
|
||||
/*first parse what has already been gotten */
|
||||
if( handle->response.position != POS_COMPLETE ) {
|
||||
status = parser_parse_entity( &handle->response );
|
||||
} else {
|
||||
@ -1481,16 +1481,16 @@ int http_ReadHttpGet(
|
||||
}
|
||||
|
||||
if( status == PARSE_INCOMPLETE_ENTITY ) {
|
||||
// read until close
|
||||
/* read until close */
|
||||
ok_on_close = TRUE;
|
||||
} else if( ( status != PARSE_SUCCESS )
|
||||
&& ( status != PARSE_CONTINUE_1 )
|
||||
&& ( status != PARSE_INCOMPLETE ) ) {
|
||||
//error
|
||||
/*error */
|
||||
*size = 0;
|
||||
return UPNP_E_BAD_RESPONSE;
|
||||
}
|
||||
//read more if necessary entity
|
||||
/*read more if necessary entity */
|
||||
while( ( ( handle->response.msg.entity_offset + *size ) >
|
||||
handle->response.msg.entity.length )
|
||||
&& ( ! handle->cancel )
|
||||
@ -1499,11 +1499,11 @@ int http_ReadHttpGet(
|
||||
sock_read( &handle->sock_info, tempbuf, sizeof( tempbuf ),
|
||||
&timeout );
|
||||
if( num_read > 0 ) {
|
||||
// append data to buffer
|
||||
/* append data to buffer */
|
||||
ret_code = membuffer_append( &handle->response.msg.msg,
|
||||
tempbuf, num_read );
|
||||
if( ret_code != 0 ) {
|
||||
// set failure status
|
||||
/* set failure status */
|
||||
handle->response.http_error_code =
|
||||
HTTP_INTERNAL_SERVER_ERROR;
|
||||
*size = 0;
|
||||
@ -1511,12 +1511,12 @@ int http_ReadHttpGet(
|
||||
}
|
||||
status = parser_parse_entity( &handle->response );
|
||||
if( status == PARSE_INCOMPLETE_ENTITY ) {
|
||||
// read until close
|
||||
/* read until close */
|
||||
ok_on_close = TRUE;
|
||||
} else if( ( status != PARSE_SUCCESS )
|
||||
&& ( status != PARSE_CONTINUE_1 )
|
||||
&& ( status != PARSE_INCOMPLETE ) ) {
|
||||
//error
|
||||
/*error */
|
||||
*size = 0;
|
||||
return UPNP_E_BAD_RESPONSE;
|
||||
}
|
||||
@ -1527,9 +1527,9 @@ int http_ReadHttpGet(
|
||||
handle->response.msg.msg.buf );
|
||||
handle->response.position = POS_COMPLETE;
|
||||
} else {
|
||||
// partial msg
|
||||
/* partial msg */
|
||||
*size = 0;
|
||||
handle->response.http_error_code = HTTP_BAD_REQUEST; // or response
|
||||
handle->response.http_error_code = HTTP_BAD_REQUEST; /* or response */
|
||||
return UPNP_E_BAD_HTTPMSG;
|
||||
}
|
||||
} else {
|
||||
@ -1641,7 +1641,7 @@ http_CloseHttpGet( IN void *Handle )
|
||||
return UPNP_E_INVALID_PARAM;
|
||||
}
|
||||
|
||||
sock_destroy( &handle->sock_info, SD_BOTH ); //should shutdown completely
|
||||
sock_destroy( &handle->sock_info, SD_BOTH ); /*should shutdown completely */
|
||||
httpmsg_destroy( &handle->response.msg );
|
||||
free( handle );
|
||||
return UPNP_E_SUCCESS;
|
||||
@ -1864,8 +1864,8 @@ http_SendStatusResponse( IN SOCKINFO * info,
|
||||
ret = http_MakeMessage(
|
||||
&membuf, response_major, response_minor,
|
||||
"RSCB",
|
||||
http_status_code, // response start line
|
||||
http_status_code ); // body
|
||||
http_status_code, /* response start line */
|
||||
http_status_code ); /* body */
|
||||
if( ret == 0 ) {
|
||||
timeout = HTTP_DEFAULT_TIMEOUT;
|
||||
ret = http_SendMessage( info, &timeout, "b",
|
||||
@ -1903,25 +1903,25 @@ http_SendStatusResponse( IN SOCKINFO * info,
|
||||
* depending on major,minor version
|
||||
* 'c': (no args) appends CRLF "\r\n"
|
||||
* 'D': (no args) appends HTTP DATE: header
|
||||
* 'd': arg = int number // appends decimal number
|
||||
* 'G': arg = range information // add range header
|
||||
* 'h': arg = off_t number // appends off_t number
|
||||
* 'K': (no args) // add chunky header
|
||||
* 'L': arg = language information // add Content-Language header if
|
||||
* 'd': arg = int number -- appends decimal number
|
||||
* 'G': arg = range information -- add range header
|
||||
* 'h': arg = off_t number -- appends off_t number
|
||||
* 'K': (no args) -- add chunky header
|
||||
* 'L': arg = language information -- add Content-Language header if
|
||||
* Accept-Language header is not empty and if
|
||||
* WEB_SERVER_CONTENT_LANGUAGE is not empty
|
||||
* 'N': arg1 = off_t content_length // content-length header
|
||||
* 'q': arg1 = http_method_t // request start line and HOST header
|
||||
* 'N': arg1 = off_t content_length -- content-length header
|
||||
* 'q': arg1 = http_method_t -- request start line and HOST header
|
||||
* arg2 = (uri_type *)
|
||||
* 'Q': arg1 = http_method_t; // start line of request
|
||||
* 'Q': arg1 = http_method_t; -- start line of request
|
||||
* arg2 = char* url;
|
||||
* arg3 = size_t url_length
|
||||
* 'R': arg = int status_code // adds a response start line
|
||||
* 'R': arg = int status_code -- adds a response start line
|
||||
* 'S': (no args) appends HTTP SERVER: header
|
||||
* 's': arg = const char* C_string
|
||||
* 'T': arg = char * content_type; format
|
||||
* e.g: "text/html"; content-type header
|
||||
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
|
||||
* 't': arg = time_t * gmt_time -- appends time in RFC 1123 fmt
|
||||
* 'U': (no args) appends HTTP USER-AGENT: header
|
||||
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
|
||||
*
|
||||
@ -1967,7 +1967,7 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
|
||||
while( ( c = *fmt++ ) != 0 ) {
|
||||
if( c == 's' ) {
|
||||
// C string
|
||||
/* C string */
|
||||
s = ( char * )va_arg( argp, char * );
|
||||
assert( s );
|
||||
UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s);
|
||||
@ -1975,26 +1975,26 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'K' ) {
|
||||
// Add Chunky header
|
||||
/* Add Chunky header */
|
||||
if( membuffer_append
|
||||
( buf, "TRANSFER-ENCODING: chunked\r\n",
|
||||
strlen( "Transfer-Encoding: chunked\r\n" ) ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'G' ) {
|
||||
// Add Range header
|
||||
/* Add Range header */
|
||||
struct SendInstruction *RespInstr;
|
||||
RespInstr = (struct SendInstruction *)
|
||||
va_arg( argp, struct SendInstruction *);
|
||||
assert( RespInstr );
|
||||
// connection header
|
||||
/* connection header */
|
||||
if( membuffer_append
|
||||
( buf, RespInstr->RangeHeader,
|
||||
strlen( RespInstr->RangeHeader ) ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'b' ) {
|
||||
// mem buffer
|
||||
/* mem buffer */
|
||||
s = ( char * )va_arg( argp, char * );
|
||||
|
||||
UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,
|
||||
@ -2006,13 +2006,13 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
}
|
||||
}
|
||||
else if( c == 'c' ) {
|
||||
// crlf
|
||||
/* crlf */
|
||||
if( membuffer_append( buf, "\r\n", 2 ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
}
|
||||
else if( c == 'd' ) {
|
||||
// integer
|
||||
/* integer */
|
||||
num = ( int )va_arg( argp, int );
|
||||
sprintf( tempbuf, "%"PRIzu, num );
|
||||
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
|
||||
@ -2020,7 +2020,7 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
}
|
||||
}
|
||||
else if( c == 'h' ) {
|
||||
// off_t
|
||||
/* off_t */
|
||||
bignum = ( off_t )va_arg( argp, off_t );
|
||||
|
||||
sprintf( tempbuf, "%"PRId64, (int64_t)bignum );
|
||||
@ -2029,15 +2029,15 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
}
|
||||
}
|
||||
else if( c == 't' || c == 'D' ) {
|
||||
// date
|
||||
/* date */
|
||||
if( c == 'D' ) {
|
||||
// header
|
||||
/* header */
|
||||
start_str = "DATE: ";
|
||||
end_str = "\r\n";
|
||||
curr_time = time( NULL );
|
||||
date = gmtime( &curr_time );
|
||||
} else {
|
||||
// date value only
|
||||
/* date value only */
|
||||
start_str = end_str = "";
|
||||
loc_time = ( time_t * ) va_arg( argp, time_t * );
|
||||
assert( loc_time );
|
||||
@ -2054,8 +2054,8 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
goto error_handler;
|
||||
}
|
||||
} else if ( c == 'L' ) {
|
||||
// Add CONTENT-LANGUAGE header only if WEB_SERVER_CONTENT_LANGUAGE
|
||||
// is not empty and if Accept-Language header is not empty
|
||||
/* Add CONTENT-LANGUAGE header only if WEB_SERVER_CONTENT_LANGUAGE */
|
||||
/* is not empty and if Accept-Language header is not empty */
|
||||
struct SendInstruction *RespInstr;
|
||||
RespInstr = (struct SendInstruction *)
|
||||
va_arg( argp, struct SendInstruction *);
|
||||
@ -2071,14 +2071,14 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
if( ( http_major_version > 1 ) ||
|
||||
( http_major_version == 1 && http_minor_version == 1 )
|
||||
) {
|
||||
// connection header
|
||||
/* connection header */
|
||||
if( membuffer_append_str( buf, "CONNECTION: close\r\n" ) !=
|
||||
0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
}
|
||||
} else if( c == 'N' ) {
|
||||
// content-length header
|
||||
/* content-length header */
|
||||
bignum = ( off_t )va_arg( argp, off_t );
|
||||
|
||||
assert( bignum >= 0 );
|
||||
@ -2089,7 +2089,7 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'S' || c == 'U' ) {
|
||||
// SERVER or USER-AGENT header
|
||||
/* SERVER or USER-AGENT header */
|
||||
temp_str = ( c == 'S' ) ? "SERVER: " : "USER-AGENT: ";
|
||||
get_sdk_info( tempbuf );
|
||||
if (http_MakeMessage(
|
||||
@ -2099,7 +2099,7 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'X' ) {
|
||||
// C string
|
||||
/* C string */
|
||||
s = ( char * )va_arg( argp, char * );
|
||||
assert( s );
|
||||
if( membuffer_append_str( buf, "X-User-Agent: ") != 0 ) {
|
||||
@ -2109,15 +2109,15 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'R' ) {
|
||||
// response start line
|
||||
// e.g.: 'HTTP/1.1 200 OK'
|
||||
//
|
||||
// code
|
||||
/* response start line */
|
||||
/* e.g.: 'HTTP/1.1 200 OK' */
|
||||
/* */
|
||||
/* code */
|
||||
status_code = ( int )va_arg( argp, int );
|
||||
assert( status_code > 0 );
|
||||
sprintf( tempbuf, "HTTP/%d.%d %d ",
|
||||
http_major_version, http_minor_version, status_code );
|
||||
// str
|
||||
/* str */
|
||||
status_msg = http_get_code_text( status_code );
|
||||
if (http_MakeMessage(
|
||||
buf, http_major_version, http_minor_version,
|
||||
@ -2127,8 +2127,8 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'B' ) {
|
||||
// body of a simple reply
|
||||
//
|
||||
/* body of a simple reply */
|
||||
/* */
|
||||
status_code = ( int )va_arg( argp, int );
|
||||
sprintf( tempbuf, "%s%d %s%s",
|
||||
"<html><body><h1>",
|
||||
@ -2138,29 +2138,29 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
if (http_MakeMessage(
|
||||
buf, http_major_version, http_minor_version,
|
||||
"NTcs",
|
||||
bignum, // content-length
|
||||
"text/html", // content-type
|
||||
tempbuf ) != 0 // body
|
||||
bignum, /* content-length */
|
||||
"text/html", /* content-type */
|
||||
tempbuf ) != 0 /* body */
|
||||
) {
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'Q' ) {
|
||||
// request start line
|
||||
// GET /foo/bar.html HTTP/1.1\r\n
|
||||
/* request start line */
|
||||
/* GET /foo/bar.html HTTP/1.1\r\n */
|
||||
method = ( http_method_t ) va_arg( argp, http_method_t );
|
||||
method_str = method_to_str( method );
|
||||
url_str = ( const char * )va_arg( argp, const char * );
|
||||
num = ( size_t )va_arg( argp, size_t ); // length of url_str
|
||||
num = ( size_t )va_arg( argp, size_t ); /* length of url_str */
|
||||
if (http_MakeMessage(
|
||||
buf, http_major_version, http_minor_version,
|
||||
"ssbsdsdc",
|
||||
method_str, // method
|
||||
" ", url_str, num, // url
|
||||
method_str, /* method */
|
||||
" ", url_str, num, /* url */
|
||||
" HTTP/", http_major_version, ".", http_minor_version ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'q' ) {
|
||||
// request start line and HOST header
|
||||
/* request start line and HOST header */
|
||||
method = ( http_method_t ) va_arg( argp, http_method_t );
|
||||
uri_ptr = ( uri_type * ) va_arg( argp, uri_type * );
|
||||
assert( uri_ptr );
|
||||
@ -2176,8 +2176,8 @@ http_MakeMessage( INOUT membuffer * buf,
|
||||
goto error_handler;
|
||||
}
|
||||
} else if( c == 'T' ) {
|
||||
// content type header
|
||||
temp_str = ( const char * )va_arg( argp, const char * ); // type/subtype format
|
||||
/* content type header */
|
||||
temp_str = ( const char * )va_arg( argp, const char * ); /* type/subtype format */
|
||||
if (http_MakeMessage(
|
||||
buf, http_major_version, http_minor_version,
|
||||
"ssc",
|
||||
@ -2266,7 +2266,7 @@ MakeGetMessageEx( const char *url_str,
|
||||
strlen( url_str ), url ) ) != UPNP_E_SUCCESS ) {
|
||||
break;
|
||||
}
|
||||
// make msg
|
||||
/* make msg */
|
||||
membuffer_init( request );
|
||||
urlPath = alloca( strlen( url_str ) + 1 );
|
||||
if( !urlPath ) {
|
||||
@ -2483,7 +2483,7 @@ int http_OpenHttpGetEx(
|
||||
* Return:
|
||||
* UPNP_INLINE void
|
||||
************************************************************************/
|
||||
// 'info' should have a size of at least 100 bytes
|
||||
/* 'info' should have a size of at least 100 bytes */
|
||||
void
|
||||
get_sdk_info( OUT char *info )
|
||||
{
|
||||
|
@ -1,38 +1,40 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file a function to extract the header information from *
|
||||
* an http message and then matches the data with XML data. *
|
||||
************************************************************************/
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* Purpose: This file a function to extract the header information from
|
||||
* an http message and then matches the data with XML data.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
@ -42,30 +44,17 @@
|
||||
#include "statcodes.h"
|
||||
#include "parsetools.h"
|
||||
|
||||
/************************************************************************
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t* hmsg ; HTTP Message object
|
||||
*
|
||||
* Description: Find the header from the HTTP message and match the
|
||||
* header for xml data.
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
xboolean
|
||||
has_xml_content_type( IN http_message_t * hmsg )
|
||||
xboolean has_xml_content_type(http_message_t *hmsg)
|
||||
{
|
||||
memptr hdr_value;
|
||||
memptr hdr_value;
|
||||
|
||||
assert( hmsg );
|
||||
assert(hmsg);
|
||||
|
||||
// find 'content-type' header which must have text/xml
|
||||
if( httpmsg_find_hdr( hmsg, HDR_CONTENT_TYPE, &hdr_value ) != NULL &&
|
||||
matchstr( hdr_value.buf, hdr_value.length,
|
||||
"%itext%w/%wxml" ) == PARSE_OK ) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
/* find 'content-type' header which must have text/xml */
|
||||
if (httpmsg_find_hdr(hmsg, HDR_CONTENT_TYPE, &hdr_value) &&
|
||||
matchstr(hdr_value.buf, hdr_value.length, "%itext%w/%wxml" ) == PARSE_OK) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -1,33 +1,33 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file defines status codes, buffers to store the status *
|
||||
@ -128,7 +128,7 @@ init_table( IN const char *encoded_str,
|
||||
|
||||
for( i = 0; i < tbl_size; i++ ) {
|
||||
table[i] = s;
|
||||
s += strlen( s ) + 1; // next entry
|
||||
s += strlen( s ) + 1; /* next entry */
|
||||
}
|
||||
}
|
||||
|
||||
@ -153,7 +153,7 @@ init_tables( void )
|
||||
init_table( Http4xxStr, Http4xxCodes, NUM_4XX_CODES );
|
||||
init_table( Http5xxStr, Http5xxCodes, NUM_5XX_CODES );
|
||||
|
||||
gInitialized = TRUE; // mark only after complete
|
||||
gInitialized = TRUE; /* mark only after complete */
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
@ -315,7 +315,7 @@ static UPNP_INLINE int get_content_type(
|
||||
|
||||
(*content_type) = NULL;
|
||||
|
||||
// get ext
|
||||
/* get ext */
|
||||
extension = strrchr(filename, '.');
|
||||
if (extension != NULL) {
|
||||
if (search_extension(extension + 1, &type, &subtype) == 0) {
|
||||
@ -324,7 +324,7 @@ static UPNP_INLINE int get_content_type(
|
||||
}
|
||||
|
||||
if (!ctype_found) {
|
||||
// unknown content type
|
||||
/* unknown content type */
|
||||
type = gMediaTypes[APPLICATION_INDEX];
|
||||
subtype = "octet-stream";
|
||||
}
|
||||
@ -395,7 +395,7 @@ static void alias_release(
|
||||
struct xml_alias_t *alias)
|
||||
{
|
||||
ithread_mutex_lock(&gWebMutex);
|
||||
// ignore invalid alias
|
||||
/* ignore invalid alias */
|
||||
if (!is_valid_alias(alias)) {
|
||||
ithread_mutex_unlock(&gWebMutex);
|
||||
return;
|
||||
@ -419,7 +419,7 @@ int web_server_set_alias(const char *alias_name,
|
||||
|
||||
alias_release(&gAliasDoc);
|
||||
if (alias_name == NULL) {
|
||||
// don't serve aliased doc anymore
|
||||
/* don't serve aliased doc anymore */
|
||||
return 0;
|
||||
}
|
||||
assert(alias_content != NULL);
|
||||
@ -427,24 +427,24 @@ int web_server_set_alias(const char *alias_name,
|
||||
membuffer_init(&alias.name);
|
||||
alias.ct = NULL;
|
||||
do {
|
||||
// insert leading /, if missing
|
||||
/* insert leading /, if missing */
|
||||
if (*alias_name != '/') {
|
||||
if (membuffer_assign_str(&alias.name, "/") != 0) {
|
||||
break; // error; out of mem
|
||||
break; /* error; out of mem */
|
||||
}
|
||||
}
|
||||
ret_code = membuffer_append_str(&alias.name, alias_name);
|
||||
if (ret_code != 0) {
|
||||
break; // error
|
||||
break; /* error */
|
||||
}
|
||||
if ((alias.ct = (int *)malloc(sizeof(int))) == NULL) {
|
||||
break; // error
|
||||
break; /* error */
|
||||
}
|
||||
*alias.ct = 1;
|
||||
membuffer_attach(&alias.doc, (char *)alias_content,
|
||||
alias_content_length);
|
||||
alias.last_modified = last_modified;
|
||||
// save in module var
|
||||
/* save in module var */
|
||||
ithread_mutex_lock(&gWebMutex);
|
||||
gAliasDoc = alias;
|
||||
ithread_mutex_unlock(&gWebMutex);
|
||||
@ -452,8 +452,8 @@ int web_server_set_alias(const char *alias_name,
|
||||
return 0;
|
||||
} while (FALSE);
|
||||
|
||||
// error handler
|
||||
// free temp alias
|
||||
/* error handler */
|
||||
/* free temp alias */
|
||||
membuffer_destroy(&alias.name);
|
||||
membuffer_destroy(&alias.doc);
|
||||
free(alias.ct);
|
||||
@ -464,13 +464,13 @@ int web_server_init()
|
||||
{
|
||||
int ret = 0;
|
||||
if (bWebServerState == WEB_SERVER_DISABLED) {
|
||||
// decode media list
|
||||
/* decode media list */
|
||||
media_list_init();
|
||||
membuffer_init(&gDocumentRootDir);
|
||||
glob_alias_init();
|
||||
pVirtualDirList = NULL;
|
||||
|
||||
// Initialize callbacks
|
||||
/* Initialize callbacks */
|
||||
virtualDirCallback.get_info = NULL;
|
||||
virtualDirCallback.open = NULL;
|
||||
virtualDirCallback.read = NULL;
|
||||
@ -541,7 +541,7 @@ static int get_file_info(
|
||||
return -1;
|
||||
}
|
||||
|
||||
// check readable
|
||||
/* check readable */
|
||||
fp = fopen(filename, "r");
|
||||
info->is_readable = (fp != NULL);
|
||||
if (fp) {
|
||||
@ -570,9 +570,9 @@ int web_server_set_root_dir(const char *root_dir)
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
// remove trailing '/', if any
|
||||
/* remove trailing '/', if any */
|
||||
if (gDocumentRootDir.length > 0) {
|
||||
index = gDocumentRootDir.length - 1; // last char
|
||||
index = gDocumentRootDir.length - 1; /* last char */
|
||||
if (gDocumentRootDir.buf[index] == '/') {
|
||||
membuffer_delete(&gDocumentRootDir, index, 1);
|
||||
}
|
||||
@ -600,7 +600,7 @@ static UPNP_INLINE xboolean get_alias(
|
||||
{
|
||||
int cmp = strcmp(alias->name.buf, request_file);
|
||||
if (cmp == 0) {
|
||||
// fill up info
|
||||
/* fill up info */
|
||||
info->file_length = alias->doc.length;
|
||||
info->is_readable = TRUE;
|
||||
info->is_directory = FALSE;
|
||||
@ -896,7 +896,7 @@ static int CheckOtherHTTPHeaders(
|
||||
{
|
||||
http_header_t *header;
|
||||
ListNode *node;
|
||||
//NNS: dlist_node* node;
|
||||
/*NNS: dlist_node* node; */
|
||||
int index, RetCode = HTTP_OK;
|
||||
char *TmpBuf;
|
||||
|
||||
@ -906,7 +906,7 @@ static int CheckOtherHTTPHeaders(
|
||||
node = ListHead(&Req->headers);
|
||||
while (node != NULL) {
|
||||
header = (http_header_t *) node->item;
|
||||
// find header type.
|
||||
/* find header type. */
|
||||
index = map_str_to_int((const char *)header->name.buf,
|
||||
header->name.length, Http_Header_Names,
|
||||
NUM_HTTP_HEADER_NAMES, FALSE);
|
||||
@ -955,23 +955,23 @@ static int CheckOtherHTTPHeaders(
|
||||
header.value is the value.
|
||||
*/
|
||||
/*
|
||||
case HDR_CONTENT_TYPE: //return 1;
|
||||
case HDR_CONTENT_LANGUAGE://return 1;
|
||||
case HDR_LOCATION: //return 1;
|
||||
case HDR_CONTENT_LOCATION://return 1;
|
||||
case HDR_ACCEPT: //return 1;
|
||||
case HDR_ACCEPT_CHARSET://return 1;
|
||||
case HDR_USER_AGENT: break;//return 1;
|
||||
case HDR_CONTENT_TYPE: return 1;
|
||||
case HDR_CONTENT_LANGUAGE:return 1;
|
||||
case HDR_LOCATION: return 1;
|
||||
case HDR_CONTENT_LOCATION:return 1;
|
||||
case HDR_ACCEPT: return 1;
|
||||
case HDR_ACCEPT_CHARSET: return 1;
|
||||
case HDR_USER_AGENT: return 1;
|
||||
*/
|
||||
|
||||
//Header check for encoding
|
||||
/*Header check for encoding */
|
||||
/*
|
||||
case HDR_ACCEPT_RANGE: //Server capability.
|
||||
case HDR_CONTENT_RANGE://Response.
|
||||
case HDR_ACCEPT_RANGE:
|
||||
case HDR_CONTENT_RANGE:
|
||||
case HDR_IF_RANGE:
|
||||
*/
|
||||
|
||||
//Header check for encoding
|
||||
/*Header check for encoding */
|
||||
/*
|
||||
case HDR_ACCEPT_ENCODING:
|
||||
if(StrStr(TmpBuf, "identity"))
|
||||
@ -980,7 +980,7 @@ static int CheckOtherHTTPHeaders(
|
||||
}
|
||||
else return -1;
|
||||
case HDR_CONTENT_ENCODING:
|
||||
case HDR_TRANSFER_ENCODING: //Response
|
||||
case HDR_TRANSFER_ENCODING:
|
||||
*/
|
||||
break;
|
||||
}
|
||||
@ -1036,22 +1036,22 @@ static int process_request(
|
||||
req->method == HTTPMETHOD_HEAD ||
|
||||
req->method == HTTPMETHOD_POST ||
|
||||
req->method == HTTPMETHOD_SIMPLEGET);
|
||||
// init
|
||||
/* init */
|
||||
request_doc = NULL;
|
||||
finfo.content_type = NULL;
|
||||
alias_grabbed = FALSE;
|
||||
err_code = HTTP_INTERNAL_SERVER_ERROR; // default error
|
||||
err_code = HTTP_INTERNAL_SERVER_ERROR; /* default error */
|
||||
using_virtual_dir = FALSE;
|
||||
using_alias = FALSE;
|
||||
|
||||
http_CalcResponseVersion(req->major_version, req->minor_version,
|
||||
&resp_major, &resp_minor);
|
||||
//
|
||||
// remove dots
|
||||
//
|
||||
/* */
|
||||
/* remove dots */
|
||||
/* */
|
||||
request_doc = malloc(url->pathquery.size + 1);
|
||||
if (request_doc == NULL) {
|
||||
goto error_handler; // out of mem
|
||||
goto error_handler; /* out of mem */
|
||||
}
|
||||
memcpy(request_doc, url->pathquery.buff, url->pathquery.size);
|
||||
request_doc[url->pathquery.size] = '\0';
|
||||
@ -1063,7 +1063,7 @@ static int process_request(
|
||||
goto error_handler;
|
||||
}
|
||||
if (*request_doc != '/') {
|
||||
// no slash
|
||||
/* no slash */
|
||||
err_code = HTTP_BAD_REQUEST;
|
||||
goto error_handler;
|
||||
}
|
||||
@ -1092,13 +1092,13 @@ static int process_request(
|
||||
}
|
||||
if (using_virtual_dir) {
|
||||
if (req->method != HTTPMETHOD_POST) {
|
||||
// get file info
|
||||
/* get file info */
|
||||
if (virtualDirCallback.
|
||||
get_info(filename->buf, &finfo) != 0) {
|
||||
err_code = HTTP_NOT_FOUND;
|
||||
goto error_handler;
|
||||
}
|
||||
// try index.html if req is a dir
|
||||
/* try index.html if req is a dir */
|
||||
if (finfo.is_directory) {
|
||||
if (filename->buf[filename->length - 1] == '/') {
|
||||
temp_str = "index.html";
|
||||
@ -1109,7 +1109,7 @@ static int process_request(
|
||||
0) {
|
||||
goto error_handler;
|
||||
}
|
||||
// get info
|
||||
/* get info */
|
||||
if ((virtualDirCallback.
|
||||
get_info(filename->buf,
|
||||
&finfo) != UPNP_E_SUCCESS)
|
||||
@ -1118,42 +1118,42 @@ static int process_request(
|
||||
goto error_handler;
|
||||
}
|
||||
}
|
||||
// not readable
|
||||
/* not readable */
|
||||
if (!finfo.is_readable) {
|
||||
err_code = HTTP_FORBIDDEN;
|
||||
goto error_handler;
|
||||
}
|
||||
// finally, get content type
|
||||
// if ( get_content_type(filename->buf, &content_type) != 0 )
|
||||
//{
|
||||
// goto error_handler;
|
||||
// }
|
||||
/* finally, get content type */
|
||||
/* if ( get_content_type(filename->buf, &content_type) != 0 ) */
|
||||
/*{ */
|
||||
/* goto error_handler; */
|
||||
/* } */
|
||||
}
|
||||
} else if (!using_alias) {
|
||||
if (gDocumentRootDir.length == 0) {
|
||||
goto error_handler;
|
||||
}
|
||||
//
|
||||
// get file name
|
||||
//
|
||||
/* */
|
||||
/* get file name */
|
||||
/* */
|
||||
|
||||
// filename str
|
||||
/* filename str */
|
||||
if (membuffer_assign_str(filename, gDocumentRootDir.buf) != 0 ||
|
||||
membuffer_append_str(filename, request_doc) != 0) {
|
||||
goto error_handler; // out of mem
|
||||
goto error_handler; /* out of mem */
|
||||
}
|
||||
// remove trailing slashes
|
||||
/* remove trailing slashes */
|
||||
while (filename->length > 0 &&
|
||||
filename->buf[filename->length - 1] == '/') {
|
||||
membuffer_delete(filename, filename->length - 1, 1);
|
||||
}
|
||||
if (req->method != HTTPMETHOD_POST) {
|
||||
// get info on file
|
||||
/* get info on file */
|
||||
if (get_file_info(filename->buf, &finfo) != 0) {
|
||||
err_code = HTTP_NOT_FOUND;
|
||||
goto error_handler;
|
||||
}
|
||||
// try index.html if req is a dir
|
||||
/* try index.html if req is a dir */
|
||||
if (finfo.is_directory) {
|
||||
if (filename->buf[filename->length - 1] == '/') {
|
||||
temp_str = "index.html";
|
||||
@ -1164,27 +1164,27 @@ static int process_request(
|
||||
0) {
|
||||
goto error_handler;
|
||||
}
|
||||
// get info
|
||||
/* get info */
|
||||
if (get_file_info(filename->buf, &finfo) != 0 ||
|
||||
finfo.is_directory) {
|
||||
err_code = HTTP_NOT_FOUND;
|
||||
goto error_handler;
|
||||
}
|
||||
}
|
||||
// not readable
|
||||
/* not readable */
|
||||
if (!finfo.is_readable) {
|
||||
err_code = HTTP_FORBIDDEN;
|
||||
goto error_handler;
|
||||
}
|
||||
}
|
||||
// finally, get content type
|
||||
// if ( get_content_type(filename->buf, &content_type) != 0 )
|
||||
// {
|
||||
// goto error_handler;
|
||||
// }
|
||||
/* finally, get content type */
|
||||
/* if ( get_content_type(filename->buf, &content_type) != 0 ) */
|
||||
/* { */
|
||||
/* goto error_handler; */
|
||||
/* } */
|
||||
}
|
||||
RespInstr->ReadSendSize = finfo.file_length;
|
||||
// Check other header field.
|
||||
/* Check other header field. */
|
||||
if ((err_code =
|
||||
CheckOtherHTTPHeaders(req, RespInstr,
|
||||
finfo.file_length)) != HTTP_OK) {
|
||||
@ -1200,58 +1200,58 @@ static int process_request(
|
||||
extra_headers = "";
|
||||
}
|
||||
if (RespInstr->IsRangeActive && RespInstr->IsChunkActive) {
|
||||
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
|
||||
// Transfer-Encoding: chunked
|
||||
/* Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT */
|
||||
/* Transfer-Encoding: chunked */
|
||||
if (http_MakeMessage(headers, resp_major, resp_minor,
|
||||
"R" "T" "GKLD" "s" "tcS" "Xc" "sCc",
|
||||
HTTP_PARTIAL_CONTENT, // status code
|
||||
finfo.content_type, // content type
|
||||
RespInstr, // range info
|
||||
RespInstr, // language info
|
||||
HTTP_PARTIAL_CONTENT, /* status code */
|
||||
finfo.content_type, /* content type */
|
||||
RespInstr, /* range info */
|
||||
RespInstr, /* language info */
|
||||
"LAST-MODIFIED: ",
|
||||
&finfo.last_modified,
|
||||
X_USER_AGENT, extra_headers) != 0) {
|
||||
goto error_handler;
|
||||
}
|
||||
} else if (RespInstr->IsRangeActive && !RespInstr->IsChunkActive) {
|
||||
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
|
||||
// Transfer-Encoding: chunked
|
||||
/* Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT */
|
||||
/* Transfer-Encoding: chunked */
|
||||
if (http_MakeMessage(headers, resp_major, resp_minor,
|
||||
"R" "N" "T" "GLD" "s" "tcS" "Xc" "sCc",
|
||||
HTTP_PARTIAL_CONTENT, // status code
|
||||
RespInstr->ReadSendSize, // content length
|
||||
finfo.content_type, // content type
|
||||
RespInstr, // range info
|
||||
RespInstr, // language info
|
||||
HTTP_PARTIAL_CONTENT, /* status code */
|
||||
RespInstr->ReadSendSize, /* content length */
|
||||
finfo.content_type, /* content type */
|
||||
RespInstr, /* range info */
|
||||
RespInstr, /* language info */
|
||||
"LAST-MODIFIED: ",
|
||||
&finfo.last_modified,
|
||||
X_USER_AGENT, extra_headers) != 0) {
|
||||
goto error_handler;
|
||||
}
|
||||
} else if (!RespInstr->IsRangeActive && RespInstr->IsChunkActive) {
|
||||
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
|
||||
// Transfer-Encoding: chunked
|
||||
/* Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT */
|
||||
/* Transfer-Encoding: chunked */
|
||||
if (http_MakeMessage(headers, resp_major, resp_minor,
|
||||
"RK" "TLD" "s" "tcS" "Xc" "sCc",
|
||||
HTTP_OK, // status code
|
||||
finfo.content_type, // content type
|
||||
RespInstr, // language info
|
||||
HTTP_OK, /* status code */
|
||||
finfo.content_type, /* content type */
|
||||
RespInstr, /* language info */
|
||||
"LAST-MODIFIED: ",
|
||||
&finfo.last_modified,
|
||||
X_USER_AGENT, extra_headers) != 0) {
|
||||
goto error_handler;
|
||||
}
|
||||
} else {
|
||||
// !RespInstr->IsRangeActive && !RespInstr->IsChunkActive
|
||||
/* !RespInstr->IsRangeActive && !RespInstr->IsChunkActive */
|
||||
if (RespInstr->ReadSendSize >= 0) {
|
||||
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
|
||||
// Transfer-Encoding: chunked
|
||||
/* Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT */
|
||||
/* Transfer-Encoding: chunked */
|
||||
if (http_MakeMessage(headers, resp_major, resp_minor,
|
||||
"R" "N" "TLD" "s" "tcS" "Xc" "sCc",
|
||||
HTTP_OK, // status code
|
||||
RespInstr->ReadSendSize, // content length
|
||||
finfo.content_type, // content type
|
||||
RespInstr, // language info
|
||||
HTTP_OK, /* status code */
|
||||
RespInstr->ReadSendSize, /* content length */
|
||||
finfo.content_type, /* content type */
|
||||
RespInstr, /* language info */
|
||||
"LAST-MODIFIED: ",
|
||||
&finfo.last_modified,
|
||||
X_USER_AGENT,
|
||||
@ -1259,13 +1259,13 @@ static int process_request(
|
||||
goto error_handler;
|
||||
}
|
||||
} else {
|
||||
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
|
||||
// Transfer-Encoding: chunked
|
||||
/* Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT */
|
||||
/* Transfer-Encoding: chunked */
|
||||
if (http_MakeMessage(headers, resp_major, resp_minor,
|
||||
"R" "TLD" "s" "tcS" "b" "Xc" "sCc",
|
||||
HTTP_OK, // status code
|
||||
finfo.content_type, // content type
|
||||
RespInstr, // language info
|
||||
HTTP_OK, /* status code */
|
||||
finfo.content_type, /* content type */
|
||||
RespInstr, /* language info */
|
||||
"LAST-MODIFIED: ",
|
||||
&finfo.last_modified,
|
||||
X_USER_AGENT,
|
||||
@ -1277,16 +1277,16 @@ static int process_request(
|
||||
if (req->method == HTTPMETHOD_HEAD) {
|
||||
*rtype = RESP_HEADERS;
|
||||
} else if (using_alias) {
|
||||
// GET xml
|
||||
/* GET xml */
|
||||
*rtype = RESP_XMLDOC;
|
||||
} else if (using_virtual_dir) {
|
||||
*rtype = RESP_WEBDOC;
|
||||
} else {
|
||||
// GET filename
|
||||
/* GET filename */
|
||||
*rtype = RESP_FILEDOC;
|
||||
}
|
||||
// simple get http 0.9 as specified in http 1.0
|
||||
// don't send headers
|
||||
/* simple get http 0.9 as specified in http 1.0 */
|
||||
/* don't send headers */
|
||||
if (req->method == HTTPMETHOD_SIMPLEGET) {
|
||||
membuffer_destroy(headers);
|
||||
}
|
||||
@ -1346,37 +1346,37 @@ static int http_RecvPostMessage(
|
||||
}
|
||||
parser->position = POS_ENTITY;
|
||||
do {
|
||||
// first parse what has already been gotten
|
||||
/* first parse what has already been gotten */
|
||||
if (parser->position != POS_COMPLETE) {
|
||||
status = parser_parse_entity(parser);
|
||||
}
|
||||
if (status == PARSE_INCOMPLETE_ENTITY) {
|
||||
// read until close
|
||||
/* read until close */
|
||||
ok_on_close = TRUE;
|
||||
} else if ((status != PARSE_SUCCESS)
|
||||
&& (status != PARSE_CONTINUE_1)
|
||||
&& (status != PARSE_INCOMPLETE)) {
|
||||
// error
|
||||
/* error */
|
||||
fclose(Fp);
|
||||
return HTTP_BAD_REQUEST;
|
||||
}
|
||||
// read more if necessary entity
|
||||
/* read more if necessary entity */
|
||||
while (entity_offset + Data_Buf_Size > parser->msg.entity.length &&
|
||||
parser->position != POS_COMPLETE) {
|
||||
num_read = sock_read(info, Buf, sizeof(Buf), &Timeout);
|
||||
if (num_read > 0) {
|
||||
// append data to buffer
|
||||
/* append data to buffer */
|
||||
ret_code = membuffer_append(&parser->msg.msg,
|
||||
Buf, num_read);
|
||||
if (ret_code != 0) {
|
||||
// set failure status
|
||||
/* set failure status */
|
||||
parser->http_error_code =
|
||||
HTTP_INTERNAL_SERVER_ERROR;
|
||||
return HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
status = parser_parse_entity(parser);
|
||||
if (status == PARSE_INCOMPLETE_ENTITY) {
|
||||
// read until close
|
||||
/* read until close */
|
||||
ok_on_close = TRUE;
|
||||
} else if ((status != PARSE_SUCCESS)
|
||||
&& (status != PARSE_CONTINUE_1)
|
||||
@ -1391,7 +1391,7 @@ static int http_RecvPostMessage(
|
||||
print_http_headers(&parser->msg);
|
||||
parser->position = POS_COMPLETE;
|
||||
} else {
|
||||
// partial msg or response
|
||||
/* partial msg or response */
|
||||
parser->http_error_code = HTTP_BAD_REQUEST;
|
||||
return HTTP_BAD_REQUEST;
|
||||
}
|
||||
@ -1442,36 +1442,36 @@ void web_server_callback(http_parser_t *parser, INOUT http_message_t *req,
|
||||
struct xml_alias_t xmldoc;
|
||||
struct SendInstruction RespInstr;
|
||||
|
||||
//Initialize instruction header.
|
||||
/*Initialize instruction header. */
|
||||
RespInstr.IsVirtualFile = 0;
|
||||
RespInstr.IsChunkActive = 0;
|
||||
RespInstr.IsRangeActive = 0;
|
||||
RespInstr.IsTrailers = 0;
|
||||
memset(RespInstr.AcceptLanguageHeader, 0,
|
||||
sizeof(RespInstr.AcceptLanguageHeader));
|
||||
// init
|
||||
/* init */
|
||||
membuffer_init(&headers);
|
||||
membuffer_init(&filename);
|
||||
|
||||
//Process request should create the different kind of header depending on the
|
||||
//the type of request.
|
||||
/*Process request should create the different kind of header depending on the */
|
||||
/*the type of request. */
|
||||
ret = process_request(req, &rtype, &headers, &filename, &xmldoc,
|
||||
&RespInstr);
|
||||
if (ret != UPNP_E_SUCCESS) {
|
||||
// send error code
|
||||
/* send error code */
|
||||
http_SendStatusResponse(info, ret, req->major_version,
|
||||
req->minor_version);
|
||||
} else {
|
||||
// send response
|
||||
/* send response */
|
||||
switch (rtype) {
|
||||
case RESP_FILEDOC:
|
||||
// send file, I = further instruction to send data.
|
||||
/* send file, I = further instruction to send data. */
|
||||
http_SendMessage(info, &timeout, "Ibf", &RespInstr,
|
||||
headers.buf, headers.length,
|
||||
filename.buf);
|
||||
break;
|
||||
case RESP_XMLDOC:
|
||||
// send xmldoc , I = further instruction to send data.
|
||||
/* send xmldoc , I = further instruction to send data. */
|
||||
http_SendMessage(info, &timeout,
|
||||
"Ibb", &RespInstr,
|
||||
headers.buf, headers.length,
|
||||
@ -1479,7 +1479,7 @@ void web_server_callback(http_parser_t *parser, INOUT http_message_t *req,
|
||||
alias_release(&xmldoc);
|
||||
break;
|
||||
case RESP_WEBDOC:
|
||||
//, I = further instruction to send data.
|
||||
/*, I = further instruction to send data. */
|
||||
/*
|
||||
http_SendVirtualDirDoc( info, &timeout, "Ibf",&RespInstr,
|
||||
headers.buf, headers.length,
|
||||
@ -1491,16 +1491,16 @@ void web_server_callback(http_parser_t *parser, INOUT http_message_t *req,
|
||||
filename.buf);
|
||||
break;
|
||||
case RESP_HEADERS:
|
||||
// headers only
|
||||
/* headers only */
|
||||
http_SendMessage(info, &timeout,
|
||||
"b",
|
||||
headers.buf, headers.length);
|
||||
break;
|
||||
case RESP_POST:
|
||||
// headers only
|
||||
/* headers only */
|
||||
ret = http_RecvPostMessage(parser, info, filename.buf,
|
||||
&RespInstr);
|
||||
// Send response.
|
||||
/* Send response. */
|
||||
http_MakeMessage(&headers, 1, 1,
|
||||
"RTLSXcCc",
|
||||
ret, "text/html", X_USER_AGENT);
|
||||
|
@ -228,7 +228,7 @@ int copy_URL_list(URL_list *in, URL_list *out)
|
||||
memcpy( out->URLs, in->URLs, len );
|
||||
|
||||
for( i = 0; i < in->size; i++ ) {
|
||||
//copy the parsed uri
|
||||
/*copy the parsed uri */
|
||||
out->parsedURLs[i].type = in->parsedURLs[i].type;
|
||||
copy_token( &in->parsedURLs[i].scheme, in->URLs,
|
||||
&out->parsedURLs[i].scheme, out->URLs );
|
||||
@ -343,22 +343,22 @@ int parse_hostport(
|
||||
|
||||
memset( out, 0, sizeof(hostport_type) );
|
||||
|
||||
// Work on a copy of the input string.
|
||||
/* Work on a copy of the input string. */
|
||||
strncpy( workbuf, in, sizeof(workbuf) );
|
||||
|
||||
c = workbuf;
|
||||
if( *c == '[' ) {
|
||||
// IPv6 addresses are enclosed in square brackets.
|
||||
/* IPv6 addresses are enclosed in square brackets. */
|
||||
srvname = ++c;
|
||||
while( *c != '\0' && *c != ']' ) {
|
||||
c++;
|
||||
}
|
||||
if( *c == '\0' ) {
|
||||
// did not find closing bracket.
|
||||
/* did not find closing bracket. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
// NULL terminate the srvname and then increment c.
|
||||
*c++ = '\0'; // overwrite the ']'
|
||||
/* NULL terminate the srvname and then increment c. */
|
||||
*c++ = '\0'; /* overwrite the ']' */
|
||||
if( *c == ':' ) {
|
||||
has_port = 1;
|
||||
c++;
|
||||
@ -366,7 +366,7 @@ int parse_hostport(
|
||||
af = AF_INET6;
|
||||
}
|
||||
else {
|
||||
// IPv4 address -OR- host name.
|
||||
/* IPv4 address -OR- host name. */
|
||||
srvname = c;
|
||||
while( (*c != ':') && (*c != '/') && ( (isalnum(*c)) || (*c == '.') || (*c == '-') ) ) {
|
||||
if( *c == '.' )
|
||||
@ -374,17 +374,17 @@ int parse_hostport(
|
||||
c++;
|
||||
}
|
||||
has_port = (*c == ':') ? 1 : 0;
|
||||
// NULL terminate the srvname
|
||||
/* NULL terminate the srvname */
|
||||
*c = '\0';
|
||||
if( has_port == 1 )
|
||||
c++;
|
||||
|
||||
if( last_dot != NULL && isdigit(*(last_dot+1)) ) {
|
||||
// Must be an IPv4 address.
|
||||
/* Must be an IPv4 address. */
|
||||
af = AF_INET;
|
||||
}
|
||||
else {
|
||||
// Must be a host name.
|
||||
/* Must be a host name. */
|
||||
struct addrinfo hints, *res, *res0;
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
@ -396,7 +396,7 @@ int parse_hostport(
|
||||
for (res = res0; res; res = res->ai_next) {
|
||||
if( res->ai_family == AF_INET ||
|
||||
res->ai_family == AF_INET6 ) {
|
||||
// Found a valid IPv4 or IPv6 address.
|
||||
/* Found a valid IPv4 or IPv6 address. */
|
||||
memcpy( &out->IPaddress, res->ai_addr,
|
||||
res->ai_addrlen );
|
||||
break;
|
||||
@ -405,40 +405,40 @@ int parse_hostport(
|
||||
freeaddrinfo(res0);
|
||||
|
||||
if( res == NULL ) {
|
||||
// Didn't find an AF_INET or AF_INET6 address.
|
||||
/* Didn't find an AF_INET or AF_INET6 address. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// getaddrinfo failed.
|
||||
/* getaddrinfo failed. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if a port is specified.
|
||||
/* Check if a port is specified. */
|
||||
if( has_port == 1 ) {
|
||||
// Port is specified.
|
||||
/* Port is specified. */
|
||||
srvport = c;
|
||||
while( *c != '\0' && isdigit(*c) ) {
|
||||
c++;
|
||||
}
|
||||
port = (unsigned short int)atoi(srvport);
|
||||
if( port == 0 ) {
|
||||
// Bad port number.
|
||||
/* Bad port number. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Port was not specified, use default port.
|
||||
/* Port was not specified, use default port. */
|
||||
port = 80;
|
||||
}
|
||||
|
||||
// The length of the host and port string can be calculated by
|
||||
// subtracting pointers.
|
||||
/* The length of the host and port string can be calculated by */
|
||||
/* subtracting pointers. */
|
||||
hostport_size = (int)(c - workbuf);
|
||||
|
||||
// Fill in the 'out' information.
|
||||
/* Fill in the 'out' information. */
|
||||
if( af == AF_INET ) {
|
||||
sai4->sin_family = AF_INET;
|
||||
sai4->sin_port = htons(port);
|
||||
@ -450,8 +450,8 @@ int parse_hostport(
|
||||
sai6->sin6_scope_id = gIF_INDEX;
|
||||
ret = inet_pton(AF_INET6, srvname, &sai6->sin6_addr);
|
||||
} else {
|
||||
// IP address was set by the hostname (getaddrinfo).
|
||||
// Override port:
|
||||
/* IP address was set by the hostname (getaddrinfo). */
|
||||
/* Override port: */
|
||||
if( out->IPaddress.ss_family == AF_INET )
|
||||
sai4->sin_port = htons(port);
|
||||
else
|
||||
@ -562,7 +562,7 @@ int remove_dots(char *in, size_t size)
|
||||
copyTo = Segments[--lastSegment];
|
||||
} else {
|
||||
free( Segments );
|
||||
//TRACE("ERROR RESOLVING URL, ../ at ROOT");
|
||||
/*TRACE("ERROR RESOLVING URL, ../ at ROOT"); */
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
continue;
|
||||
|
@ -135,7 +135,7 @@ subscription *GetSubscriptionSID(const Upnp_SID sid, service_info *service)
|
||||
}
|
||||
}
|
||||
if( found ) {
|
||||
//get the current_time
|
||||
/*get the current_time */
|
||||
time( ¤t_time );
|
||||
if( ( found->expireTime != 0 )
|
||||
&& ( found->expireTime < current_time ) ) {
|
||||
@ -161,7 +161,7 @@ subscription *GetNextSubscription(service_info *service, subscription *current)
|
||||
subscription *previous = NULL;
|
||||
int notDone = 1;
|
||||
|
||||
// get the current_time
|
||||
/* get the current_time */
|
||||
time( ¤t_time );
|
||||
while( ( notDone ) && ( current ) ) {
|
||||
previous = current;
|
||||
@ -195,7 +195,7 @@ subscription *GetFirstSubscription(service_info *service)
|
||||
temp.next = service->subscriptionList;
|
||||
next = GetNextSubscription(service, &temp);
|
||||
service->subscriptionList = temp.next;
|
||||
// service->subscriptionList = next;
|
||||
/* service->subscriptionList = next; */
|
||||
|
||||
return next;
|
||||
}
|
||||
@ -980,9 +980,9 @@ removeServiceTable( IXML_Node * node,
|
||||
&& ( ( getSubElement( "UDN", node, ¤tUDN ) )
|
||||
&& ( UDN = getElementValue( currentUDN ) ) ) ) {
|
||||
current_service = start_search;
|
||||
//Services are put in the service table in the order in which they appear in the
|
||||
//description document, therefore we go through the list only once to remove a particular
|
||||
//root device
|
||||
/*Services are put in the service table in the order in which they appear in the */
|
||||
/*description document, therefore we go through the list only once to remove a particular */
|
||||
/*root device */
|
||||
while( ( current_service )
|
||||
&& ( strcmp( current_service->UDN, UDN ) ) ) {
|
||||
current_service = current_service->next;
|
||||
@ -1108,4 +1108,5 @@ getServiceTable( IXML_Node * node,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // INCLUDE_DEVICE_APIS
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
|
@ -70,7 +70,7 @@ str_alloc( IN const char *str,
|
||||
|
||||
s = ( char * )malloc( str_len + 1 );
|
||||
if( s == NULL ) {
|
||||
return NULL; // no mem
|
||||
return NULL; /* no mem */
|
||||
}
|
||||
|
||||
memcpy( s, str, str_len );
|
||||
@ -111,8 +111,8 @@ memptr_cmp( IN memptr * m,
|
||||
cmp = strncmp( m->buf, s, m->length );
|
||||
|
||||
if( cmp == 0 && m->length < strlen( s ) ) {
|
||||
// both strings equal for 'm->length' chars
|
||||
// if m is shorter than s, then s is greater
|
||||
/* both strings equal for 'm->length' chars */
|
||||
/* if m is shorter than s, then s is greater */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -147,8 +147,8 @@ memptr_cmp_nocase( IN memptr * m,
|
||||
|
||||
cmp = strncasecmp( m->buf, s, m->length );
|
||||
if( cmp == 0 && m->length < strlen( s ) ) {
|
||||
// both strings equal for 'm->length' chars
|
||||
// if m is shorter than s, then s is greater
|
||||
/* both strings equal for 'm->length' chars */
|
||||
/* if m is shorter than s, then s is greater */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -204,20 +204,20 @@ membuffer_set_size( INOUT membuffer * m,
|
||||
size_t alloc_len;
|
||||
char *temp_buf;
|
||||
|
||||
if( new_length >= m->length ) // increase length
|
||||
if( new_length >= m->length ) /* increase length */
|
||||
{
|
||||
// need more mem?
|
||||
/* need more mem? */
|
||||
if( new_length <= m->capacity ) {
|
||||
return 0; // have enough mem; done
|
||||
return 0; /* have enough mem; done */
|
||||
}
|
||||
|
||||
diff = new_length - m->length;
|
||||
alloc_len = MAXVAL( m->size_inc, diff ) + m->capacity;
|
||||
} else // decrease length
|
||||
} else /* decrease length */
|
||||
{
|
||||
assert( new_length <= m->length );
|
||||
|
||||
// if diff is 0..m->size_inc, don't free
|
||||
/* if diff is 0..m->size_inc, don't free */
|
||||
if( ( m->capacity - new_length ) <= m->size_inc ) {
|
||||
return 0;
|
||||
}
|
||||
@ -227,21 +227,21 @@ membuffer_set_size( INOUT membuffer * m,
|
||||
|
||||
assert( alloc_len >= new_length );
|
||||
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); //LEAK_FIX_MK
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); /*LEAK_FIX_MK */
|
||||
|
||||
//temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );//LEAK_FIX_MK
|
||||
/*temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );LEAK_FIX_MK */
|
||||
|
||||
if( temp_buf == NULL ) {
|
||||
// try smaller size
|
||||
/* try smaller size */
|
||||
alloc_len = new_length;
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); //LEAK_FIX_MK
|
||||
//temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );//LEAK_FIX_MK
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); /*LEAK_FIX_MK */
|
||||
/*temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );LEAK_FIX_MK */
|
||||
|
||||
if( temp_buf == NULL ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
}
|
||||
// save
|
||||
/* save */
|
||||
m->buf = temp_buf;
|
||||
m->capacity = alloc_len;
|
||||
return 0;
|
||||
@ -320,20 +320,20 @@ membuffer_assign( INOUT membuffer * m,
|
||||
|
||||
assert( m != NULL );
|
||||
|
||||
// set value to null
|
||||
/* set value to null */
|
||||
if( buf == NULL ) {
|
||||
membuffer_destroy( m );
|
||||
return 0;
|
||||
}
|
||||
// alloc mem
|
||||
/* alloc mem */
|
||||
return_code = membuffer_set_size( m, buf_len );
|
||||
if( return_code != 0 ) {
|
||||
return return_code;
|
||||
}
|
||||
// copy
|
||||
/* copy */
|
||||
if( buf_len ) {
|
||||
memcpy( m->buf, buf, buf_len );
|
||||
m->buf[buf_len] = 0; // null-terminate
|
||||
m->buf[buf_len] = 0; /* null-terminate */
|
||||
}
|
||||
m->length = buf_len;
|
||||
|
||||
@ -446,18 +446,18 @@ membuffer_insert( INOUT membuffer * m,
|
||||
if( buf == NULL || buf_len == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
// alloc mem
|
||||
/* alloc mem */
|
||||
return_code = membuffer_set_size( m, m->length + buf_len );
|
||||
if( return_code != 0 ) {
|
||||
return return_code;
|
||||
}
|
||||
// insert data
|
||||
/* insert data */
|
||||
|
||||
// move data to right of insertion point
|
||||
/* move data to right of insertion point */
|
||||
memmove( m->buf + index + buf_len, m->buf + index, m->length - index );
|
||||
memcpy( m->buf + index, buf, buf_len );
|
||||
m->length += buf_len;
|
||||
m->buf[m->length] = 0; // null-terminate
|
||||
m->buf[m->length] = 0; /* null-terminate */
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -499,22 +499,22 @@ membuffer_delete( INOUT membuffer * m,
|
||||
|
||||
assert( index >= 0 && index < ( int )m->length );
|
||||
|
||||
// shrink count if it goes beyond buffer
|
||||
/* shrink count if it goes beyond buffer */
|
||||
if( index + num_bytes > m->length ) {
|
||||
num_bytes = m->length - ( size_t ) index;
|
||||
copy_len = 0; // every thing at and after index purged
|
||||
copy_len = 0; /* every thing at and after index purged */
|
||||
} else {
|
||||
// calc num bytes after deleted string
|
||||
/* calc num bytes after deleted string */
|
||||
copy_len = m->length - ( index + num_bytes );
|
||||
}
|
||||
|
||||
memmove( m->buf + index, m->buf + index + num_bytes, copy_len );
|
||||
|
||||
new_length = m->length - num_bytes;
|
||||
return_value = membuffer_set_size( m, new_length ); // trim buffer
|
||||
assert( return_value == 0 ); // shrinking should always work
|
||||
return_value = membuffer_set_size( m, new_length ); /* trim buffer */
|
||||
assert( return_value == 0 ); /* shrinking should always work */
|
||||
|
||||
// don't modify until buffer is set
|
||||
/* don't modify until buffer is set */
|
||||
m->length = new_length;
|
||||
m->buf[new_length] = 0;
|
||||
}
|
||||
@ -543,7 +543,7 @@ membuffer_detach( INOUT membuffer * m )
|
||||
|
||||
buf = m->buf;
|
||||
|
||||
// free all
|
||||
/* free all */
|
||||
membuffer_initialize( m );
|
||||
|
||||
return buf;
|
||||
|
@ -1,33 +1,33 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file contains string to integer and integer to string
|
||||
@ -82,24 +82,24 @@ map_str_to_int( IN const char *name,
|
||||
while( top <= bot ) {
|
||||
mid = ( top + bot ) / 2;
|
||||
if( case_sensitive ) {
|
||||
//cmp = strcmp( name, table[mid].name );
|
||||
/*cmp = strcmp( name, table[mid].name ); */
|
||||
cmp = memptr_cmp( &name_ptr, table[mid].name );
|
||||
} else {
|
||||
//cmp = strcasecmp( name, table[mid].name );
|
||||
/*cmp = strcasecmp( name, table[mid].name ); */
|
||||
cmp = memptr_cmp_nocase( &name_ptr, table[mid].name );
|
||||
}
|
||||
|
||||
if( cmp > 0 ) {
|
||||
top = mid + 1; // look below mid
|
||||
top = mid + 1; /* look below mid */
|
||||
} else if( cmp < 0 ) {
|
||||
bot = mid - 1; // look above mid
|
||||
} else // cmp == 0
|
||||
bot = mid - 1; /* look above mid */
|
||||
} else /* cmp == 0 */
|
||||
{
|
||||
return mid; // match; return table index
|
||||
return mid; /* match; return table index */
|
||||
}
|
||||
}
|
||||
|
||||
return -1; // header name not found
|
||||
return -1; /* header name not found */
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
@ -29,90 +29,39 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file contains functions for copying strings based on
|
||||
* different options.
|
||||
************************************************************************/
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* Purpose: This file contains functions for copying strings based on
|
||||
* different options.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "upnp.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function : linecopy
|
||||
*
|
||||
* Parameters :
|
||||
* OUT char dest[LINE_SIZE] ; output buffer
|
||||
* IN const char* src ; input buffer
|
||||
*
|
||||
* Description : Copy no of bytes spcified by the LINE_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
linecopy( OUT char dest[LINE_SIZE],
|
||||
IN const char *src )
|
||||
void linecopy(char dest[LINE_SIZE], const char *src)
|
||||
{
|
||||
strncpy( dest, src, LINE_SIZE - 1 );
|
||||
dest[LINE_SIZE - 1] = '\0'; // null-terminate if len(src) >= LINE_SIZE
|
||||
strncpy(dest, src, LINE_SIZE - 1);
|
||||
/* null-terminate if len(src) >= LINE_SIZE. */
|
||||
dest[LINE_SIZE - 1] = '\0';
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : namecopy
|
||||
*
|
||||
* Parameters :
|
||||
* OUT char dest[NAME_SIZE] ; output buffer
|
||||
* IN const char* src ; input buffer
|
||||
*
|
||||
* Description : Copy no of bytes spcified by the NAME_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
namecopy( OUT char dest[NAME_SIZE],
|
||||
IN const char *src )
|
||||
void namecopy(char dest[NAME_SIZE], const char *src)
|
||||
{
|
||||
strncpy( dest, src, NAME_SIZE - 1 );
|
||||
dest[NAME_SIZE - 1] = '\0'; // null-terminate if len(src) >= NAME_SIZE
|
||||
strncpy(dest, src, NAME_SIZE - 1);
|
||||
/* null-terminate if len(src) >= NAME_SIZE. */
|
||||
dest[NAME_SIZE - 1] = '\0';
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : linecopylen
|
||||
*
|
||||
* Parameters :
|
||||
* OUT char dest[LINE_SIZE] ; output buffer
|
||||
* IN const char* src ; input buffer
|
||||
* IN size_t srclen ; bytes to be copied.
|
||||
*
|
||||
* Description : Determine if the srclen passed in paramter is less than
|
||||
* the permitted LINE_SIZE. If it is use the passed parameter, if not
|
||||
* use the permitted LINE_SIZE as the length parameter
|
||||
* Copy no of bytes spcified by the LINE_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
linecopylen( OUT char dest[LINE_SIZE],
|
||||
IN const char *src,
|
||||
IN size_t srclen )
|
||||
void linecopylen(char dest[LINE_SIZE], const char *src, size_t srclen)
|
||||
{
|
||||
int len;
|
||||
int len;
|
||||
|
||||
len = srclen < ( LINE_SIZE - 1 ) ? srclen : ( LINE_SIZE - 1 );
|
||||
strncpy( dest, src, len );
|
||||
dest[len] = '\0';
|
||||
len = srclen < (LINE_SIZE - 1) ? srclen : (LINE_SIZE - 1);
|
||||
strncpy(dest, src, len);
|
||||
dest[len] = '\0';
|
||||
}
|
||||
|
||||
|
@ -29,11 +29,9 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef GLOBAL_H
|
||||
#define GLOBAL_H
|
||||
|
||||
|
||||
/* GLOBAL.H - RSAREF types and constants */
|
||||
/* PROTOTYPES should be set to one if and only if the compiler supports
|
||||
function argument prototyping.
|
||||
@ -42,7 +40,6 @@
|
||||
been defined with C compiler flags.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef PROTOTYPES
|
||||
#define PROTOTYPES 1
|
||||
#endif
|
||||
|
@ -29,49 +29,45 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef GENLIB_NET_HTTP_HTTPPARSER_H
|
||||
#define GENLIB_NET_HTTP_HTTPPARSER_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "LinkedList.h"
|
||||
#include "membuffer.h"
|
||||
#include "uri.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
/* private types */
|
||||
|
||||
////// private types ////////////
|
||||
/* scanner */
|
||||
|
||||
|
||||
//////////////////////
|
||||
// scanner
|
||||
///////////////////////
|
||||
// Used to represent different types of tokens in input
|
||||
typedef enum // token_type_t
|
||||
/* Used to represent different types of tokens in input. */
|
||||
typedef enum
|
||||
{
|
||||
TT_IDENTIFIER,
|
||||
TT_WHITESPACE,
|
||||
TT_CRLF,
|
||||
TT_CTRL, // needed ??
|
||||
TT_SEPARATOR, // ??
|
||||
TT_QUOTEDSTRING, // ??
|
||||
TT_CTRL,
|
||||
TT_SEPARATOR,
|
||||
TT_QUOTEDSTRING,
|
||||
} token_type_t;
|
||||
|
||||
typedef struct // scanner_t
|
||||
typedef struct
|
||||
{
|
||||
membuffer* msg; // raw http msg
|
||||
size_t cursor; // current position in buffer
|
||||
xboolean entire_msg_loaded; // set this to TRUE if the entire msg is loaded in
|
||||
// in 'msg'; else FALSE if only partial msg in 'msg'
|
||||
// (default is FALSE)
|
||||
/*! raw http msg. */
|
||||
membuffer* msg;
|
||||
/*! current position in buffer. */
|
||||
size_t cursor;
|
||||
/*! set this to TRUE if the entire msg is loaded in 'msg';
|
||||
* else FALSE if only partial msg in 'msg' (default is FALSE). */
|
||||
xboolean entire_msg_loaded;
|
||||
} scanner_t;
|
||||
|
||||
typedef enum // parser_pos_t
|
||||
typedef enum
|
||||
{
|
||||
POS_REQUEST_LINE,
|
||||
POS_RESPONSE_LINE,
|
||||
@ -80,21 +76,17 @@ typedef enum // parser_pos_t
|
||||
POS_COMPLETE,
|
||||
} parser_pos_t;
|
||||
|
||||
|
||||
#define ENTREAD_DETERMINE_READ_METHOD 1
|
||||
#define ENTREAD_USING_CLEN 2
|
||||
#define ENTREAD_USING_CHUNKED 3
|
||||
#define ENTREAD_UNTIL_CLOSE 4
|
||||
#define ENTREAD_CHUNKY_BODY 5
|
||||
#define ENTREAD_CHUNKY_HEADERS 6
|
||||
#define ENTREAD_USING_CLEN 2
|
||||
#define ENTREAD_USING_CHUNKED 3
|
||||
#define ENTREAD_UNTIL_CLOSE 4
|
||||
#define ENTREAD_CHUNKY_BODY 5
|
||||
#define ENTREAD_CHUNKY_HEADERS 6
|
||||
|
||||
/* end of private section. */
|
||||
|
||||
// end of private section
|
||||
//////////////////
|
||||
// ##################################################################################
|
||||
|
||||
// method in a HTTP request
|
||||
typedef enum // http_method_t
|
||||
/* method in a HTTP request. */
|
||||
typedef enum
|
||||
{
|
||||
HTTPMETHOD_POST,
|
||||
HTTPMETHOD_MPOST,
|
||||
@ -105,116 +97,121 @@ typedef enum // http_method_t
|
||||
HTTPMETHOD_HEAD,
|
||||
HTTPMETHOD_MSEARCH,
|
||||
HTTPMETHOD_UNKNOWN,
|
||||
SOAPMETHOD_POST, //murari
|
||||
SOAPMETHOD_POST,
|
||||
HTTPMETHOD_SIMPLEGET
|
||||
} http_method_t;
|
||||
|
||||
// different types of HTTP headers
|
||||
#define HDR_UNKNOWN -1
|
||||
/* different types of HTTP headers */
|
||||
#define HDR_UNKNOWN -1
|
||||
#define HDR_CACHE_CONTROL 1
|
||||
#define HDR_CALLBACK 2
|
||||
#define HDR_CONTENT_LENGTH 3
|
||||
#define HDR_CONTENT_TYPE 4
|
||||
#define HDR_DATE 5
|
||||
#define HDR_EXT 6
|
||||
#define HDR_HOST 7
|
||||
//#define HDR_IF_MODIFIED_SINCE 8
|
||||
//#define HDR_IF_UNMODIFIED_SINCE 9
|
||||
//#define HDR_LAST_MODIFIED 10
|
||||
#define HDR_DATE 5
|
||||
#define HDR_EXT 6
|
||||
#define HDR_HOST 7
|
||||
/*define HDR_IF_MODIFIED_SINCE 8 */
|
||||
/*define HDR_IF_UNMODIFIED_SINCE 9 */
|
||||
/*define HDR_LAST_MODIFIED 10 */
|
||||
#define HDR_LOCATION 11
|
||||
#define HDR_MAN 12
|
||||
#define HDR_MX 13
|
||||
#define HDR_NT 14
|
||||
#define HDR_NTS 15
|
||||
#define HDR_SERVER 16
|
||||
#define HDR_SEQ 17
|
||||
#define HDR_SID 18
|
||||
#define HDR_MAN 12
|
||||
#define HDR_MX 13
|
||||
#define HDR_NT 14
|
||||
#define HDR_NTS 15
|
||||
#define HDR_SERVER 16
|
||||
#define HDR_SEQ 17
|
||||
#define HDR_SID 18
|
||||
#define HDR_SOAPACTION 19
|
||||
#define HDR_ST 20
|
||||
#define HDR_TIMEOUT 21
|
||||
#define HDR_TRANSFER_ENCODING 22
|
||||
#define HDR_USN 23
|
||||
#define HDR_ST 20
|
||||
#define HDR_TIMEOUT 21
|
||||
#define HDR_TRANSFER_ENCODING 22
|
||||
#define HDR_USN 23
|
||||
#define HDR_USER_AGENT 24
|
||||
|
||||
//Adding new header difinition//Beg_Murari
|
||||
#define HDR_ACCEPT 25
|
||||
#define HDR_ACCEPT_ENCODING 26
|
||||
#define HDR_ACCEPT_CHARSET 27
|
||||
#define HDR_ACCEPT_LANGUAGE 28
|
||||
#define HDR_ACCEPT_RANGE 29
|
||||
#define HDR_CONTENT_ENCODING 30
|
||||
#define HDR_CONTENT_LANGUAGE 31
|
||||
#define HDR_CONTENT_LOCATION 32
|
||||
#define HDR_CONTENT_RANGE 33
|
||||
#define HDR_IF_RANGE 34
|
||||
#define HDR_RANGE 35
|
||||
#define HDR_TE 36
|
||||
//End_Murari
|
||||
/* Adding new header difinition */
|
||||
#define HDR_ACCEPT 25
|
||||
#define HDR_ACCEPT_ENCODING 26
|
||||
#define HDR_ACCEPT_CHARSET 27
|
||||
#define HDR_ACCEPT_LANGUAGE 28
|
||||
#define HDR_ACCEPT_RANGE 29
|
||||
#define HDR_CONTENT_ENCODING 30
|
||||
#define HDR_CONTENT_LANGUAGE 31
|
||||
#define HDR_CONTENT_LOCATION 32
|
||||
#define HDR_CONTENT_RANGE 33
|
||||
#define HDR_IF_RANGE 34
|
||||
#define HDR_RANGE 35
|
||||
#define HDR_TE 36
|
||||
|
||||
// status of parsing
|
||||
typedef enum // parse_status_t
|
||||
{
|
||||
PARSE_SUCCESS = 0, // msg was parsed successfully
|
||||
PARSE_INCOMPLETE, // need more data to continue
|
||||
PARSE_INCOMPLETE_ENTITY, // for responses that don't have length specified
|
||||
PARSE_FAILURE, // parse failed; check status code for details
|
||||
PARSE_OK, // done partial
|
||||
PARSE_NO_MATCH, // token not matched
|
||||
|
||||
// private
|
||||
/*! status of parsing */
|
||||
typedef enum {
|
||||
/*! msg was parsed successfully. */
|
||||
PARSE_SUCCESS = 0,
|
||||
/*! need more data to continue. */
|
||||
PARSE_INCOMPLETE,
|
||||
/*! for responses that don't have length specified. */
|
||||
PARSE_INCOMPLETE_ENTITY,
|
||||
/*! parse failed; check status code for details. */
|
||||
PARSE_FAILURE,
|
||||
/*! done partial. */
|
||||
PARSE_OK,
|
||||
/*! token not matched. */
|
||||
PARSE_NO_MATCH,
|
||||
/*! private. */
|
||||
PARSE_CONTINUE_1
|
||||
} parse_status_t;
|
||||
|
||||
typedef struct // http_header_t
|
||||
{
|
||||
memptr name; // header name as a string
|
||||
int name_id; // header name id (for a selective group of headers only)
|
||||
membuffer value; // raw-value; could be multi-lined; min-length = 0
|
||||
|
||||
// private
|
||||
membuffer name_buf;
|
||||
typedef struct {
|
||||
/*! header name as a string. */
|
||||
memptr name;
|
||||
/*! header name id (for a selective group of headers only). */
|
||||
int name_id;
|
||||
/*! raw-value; could be multi-lined; min-length = 0. */
|
||||
membuffer value;
|
||||
/* private. */
|
||||
membuffer name_buf;
|
||||
} http_header_t;
|
||||
|
||||
typedef struct // http_message_t
|
||||
{
|
||||
int initialized;
|
||||
// request only
|
||||
typedef struct {
|
||||
int initialized;
|
||||
/*! request only. */
|
||||
http_method_t method;
|
||||
/*! request only. */
|
||||
uri_type uri;
|
||||
|
||||
// response only
|
||||
/*! response only. */
|
||||
http_method_t request_method;
|
||||
/*! response only. */
|
||||
int status_code;
|
||||
/*! response only. */
|
||||
membuffer status_msg;
|
||||
|
||||
// fields used in both request or response messages
|
||||
xboolean is_request; // if TRUE, msg is a request, else response
|
||||
|
||||
int major_version; // http major.minor version
|
||||
/* fields used in both request or response messages. */
|
||||
/*! if TRUE, msg is a request, else response. */
|
||||
xboolean is_request;
|
||||
/* http major version. */
|
||||
int major_version;
|
||||
/* http minor version. */
|
||||
int minor_version;
|
||||
|
||||
|
||||
/*! . */
|
||||
LinkedList headers;
|
||||
//NNS: dlist headers; // dlist<http_header_t *>
|
||||
memptr entity; // message body(entity)
|
||||
|
||||
// private fields
|
||||
membuffer msg; // entire raw message
|
||||
char *urlbuf; // storage for url string
|
||||
/*! message body(entity). */
|
||||
memptr entity;
|
||||
/* private fields. */
|
||||
/*! entire raw message. */
|
||||
membuffer msg;
|
||||
/*! storage for url string. */
|
||||
char *urlbuf;
|
||||
/*! . */
|
||||
size_t entity_offset;
|
||||
} http_message_t;
|
||||
|
||||
typedef struct // http_parser_t
|
||||
{
|
||||
typedef struct {
|
||||
http_message_t msg;
|
||||
int http_error_code; // read-only; in case of parse error, this
|
||||
// contains the HTTP error code (4XX or 5XX)
|
||||
|
||||
// read-only; this is set to true if a NOTIFY request has no content-length.
|
||||
// used to read valid sspd notify msg.
|
||||
xboolean valid_ssdp_notify_hack;
|
||||
|
||||
// private data -- don't touch
|
||||
/*! read-only; in case of parse error, this
|
||||
* contains the HTTP error code (4XX or 5XX). */
|
||||
int http_error_code;
|
||||
/*! read-only; this is set to true if a NOTIFY request has no
|
||||
* content-length. used to read valid sspd notify msg. */
|
||||
xboolean valid_ssdp_notify_hack;
|
||||
/* private data -- don't touch. */
|
||||
parser_pos_t position;
|
||||
int ent_position;
|
||||
unsigned int content_length;
|
||||
@ -223,15 +220,9 @@ typedef struct // http_parser_t
|
||||
scanner_t scanner;
|
||||
} http_parser_t;
|
||||
|
||||
|
||||
//--------------------------------------------------
|
||||
//////////////// functions /////////////////////////
|
||||
//--------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/************************************************************************
|
||||
* Function : httpmsg_init
|
||||
@ -272,8 +263,7 @@ void httpmsg_destroy( INOUT http_message_t* msg );
|
||||
* in the linked list of messages
|
||||
*
|
||||
* Return : http_header_t* - Pointer to a header on success;
|
||||
* NULL on failure
|
||||
*
|
||||
* NULL on failure
|
||||
* Note :
|
||||
************************************************************************/
|
||||
http_header_t* httpmsg_find_hdr_str( IN http_message_t* msg,
|
||||
@ -289,8 +279,8 @@ http_header_t* httpmsg_find_hdr_str( IN http_message_t* msg,
|
||||
*
|
||||
* Description : Finds header from a list, with the given 'name_id'.
|
||||
*
|
||||
* Return : http_header_t* - Pointer to a header on success; *
|
||||
* NULL on failure
|
||||
* Return : http_header_t* - Pointer to a header on success;
|
||||
* NULL on failure
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
@ -404,9 +394,9 @@ parse_status_t parser_get_entity_read_method( INOUT http_parser_t* parser );
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT http_parser_t* parser ; HTTP Parser Object
|
||||
* IN const char* buf ; buffer to be appended to the parser
|
||||
* buffer
|
||||
* IN size_t buf_length ; Size of the buffer
|
||||
* IN const char* buf ; buffer to be appended to the parser
|
||||
* buffer
|
||||
* IN size_t buf_length ; Size of the buffer
|
||||
*
|
||||
* Description: The parser function. Depending on the position of the
|
||||
* parser object the actual parsing function is invoked
|
||||
@ -422,8 +412,8 @@ parse_status_t parser_append( INOUT http_parser_t* parser,
|
||||
* Function: matchstr
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *str ; String to be matched
|
||||
* IN size_t slen ; Length of the string
|
||||
* IN char *str ; String to be matched
|
||||
* IN size_t slen ; Length of the string
|
||||
* IN const char* fmt ; Pattern format
|
||||
* ...
|
||||
*
|
||||
@ -437,10 +427,6 @@ parse_status_t parser_append( INOUT http_parser_t* parser,
|
||||
************************************************************************/
|
||||
int matchstr( IN char *str, IN size_t slen, IN const char* fmt, ... );
|
||||
|
||||
// ====================================================
|
||||
// misc functions
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: raw_to_int
|
||||
*
|
||||
@ -481,26 +467,28 @@ int raw_find_str( IN memptr* raw_value, IN const char* str );
|
||||
* nameConverts a http_method id stored in the HTTP Method
|
||||
*
|
||||
* Returns:
|
||||
* const char* ptr - Ptr to the HTTP Method *
|
||||
* const char* ptr - Ptr to the HTTP Method
|
||||
************************************************************************/
|
||||
const char* method_to_str( IN http_method_t method );
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Print the HTTP headers.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void print_http_headers(
|
||||
/*! [in] HTTP Message object. */
|
||||
http_message_t *hmsg );
|
||||
http_message_t *hmsg);
|
||||
#else
|
||||
static UPNP_INLINE void print_http_headers(http_message_t *hmsg) {}
|
||||
static UPNP_INLINE void print_http_headers(http_message_t *hmsg)
|
||||
{
|
||||
return;
|
||||
hmsg = hmsg;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif /* GENLIB_NET_HTTP_HTTPPARSER_H */
|
||||
|
||||
|
@ -1,33 +1,33 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
#define GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
@ -37,17 +37,14 @@
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
// timeout in secs
|
||||
/*! timeout in secs. */
|
||||
#define HTTP_DEFAULT_TIMEOUT 30
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
#extern "C" {
|
||||
#endif
|
||||
|
||||
int
|
||||
http_CancelHttpGet( IN void *Handle );
|
||||
int http_CancelHttpGet(IN void *Handle);
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_FixUrl
|
||||
@ -65,7 +62,6 @@ http_CancelHttpGet( IN void *Handle );
|
||||
************************************************************************/
|
||||
int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_FixStrUrl
|
||||
*
|
||||
@ -597,9 +593,9 @@ int http_OpenHttpGetEx(IN const char *url_str,
|
||||
void get_sdk_info( OUT char *info );
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // #extern "C"
|
||||
} /* #extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif // GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
#endif /* GENLIB_NET_HTTP_HTTPREADWRITE_H */
|
||||
|
||||
|
@ -1,72 +1,72 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef GENLIB_UTIL_MEMBUFFER_H
|
||||
#define GENLIB_UTIL_MEMBUFFER_H
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "upnputil.h"
|
||||
|
||||
#define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) )
|
||||
#define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) )
|
||||
|
||||
// pointer to a chunk of memory
|
||||
typedef struct // memptr
|
||||
/*! pointer to a chunk of memory. */
|
||||
typedef struct
|
||||
{
|
||||
char *buf; // start of memory (read/write)
|
||||
size_t length; // length of memory (read-only)
|
||||
/*! start of memory (read/write). */
|
||||
char *buf;
|
||||
/*! length of memory (read-only). */
|
||||
size_t length;
|
||||
} memptr;
|
||||
|
||||
|
||||
// maintains a block of dynamically allocated memory
|
||||
// note: Total length/capacity should not exceed MAX_INT
|
||||
typedef struct // membuffer
|
||||
/*! Maintains a block of dynamically allocated memory
|
||||
* note: Total length/capacity should not exceed MAX_INT */
|
||||
typedef struct
|
||||
{
|
||||
char *buf; // mem buffer; must not write beyond buf[length-1] (read/write)
|
||||
size_t length; // length of buffer (read-only)
|
||||
size_t capacity; // total allocated memory (read-only)
|
||||
size_t size_inc; // used to increase size; MUST be > 0; (read/write)
|
||||
|
||||
// default value of size_inc
|
||||
#define MEMBUF_DEF_SIZE_INC 5
|
||||
/*! mem buffer; must not write beyond buf[length-1] (read/write). */
|
||||
char *buf;
|
||||
/*! length of buffer (read-only). */
|
||||
size_t length;
|
||||
/*! total allocated memory (read-only). */
|
||||
size_t capacity;
|
||||
/*! used to increase size; MUST be > 0; (read/write). */
|
||||
size_t size_inc;
|
||||
/*! default value of size_inc. */
|
||||
#define MEMBUF_DEF_SIZE_INC 5
|
||||
} membuffer;
|
||||
|
||||
//--------------------------------------------------
|
||||
//////////////// functions /////////////////////////
|
||||
//--------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/************************************************************************
|
||||
* Function : str_alloc
|
||||
@ -84,7 +84,7 @@ extern "C" {
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
char* str_alloc( IN const char* str, IN size_t str_len );
|
||||
char *str_alloc( IN const char* str, IN size_t str_len );
|
||||
|
||||
/************************************************************************
|
||||
* Function : memptr_cmp
|
||||
@ -332,7 +332,8 @@ char* membuffer_detach( INOUT membuffer* m );
|
||||
************************************************************************/
|
||||
void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len );
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif // __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* GENLIB_UTIL_H */
|
||||
|
||||
#endif // GENLIB_UTIL_H
|
||||
|
@ -1,63 +1,61 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
#define GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "upnputil.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t* hmsg ; HTTP Message object
|
||||
*
|
||||
* Description: Find the header from the HTTP message and match the
|
||||
* header for xml data.
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
xboolean has_xml_content_type( IN http_message_t* hmsg );
|
||||
/*!
|
||||
* \brief Find the header from the HTTP message and match the header for
|
||||
* xml data.
|
||||
*
|
||||
* \return boolean.
|
||||
*/
|
||||
xboolean has_xml_content_type(
|
||||
/*! HTTP Message object. */
|
||||
IN http_message_t *hmsg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern C
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
#endif /* GENLIB_NET_HTTP_PARSETOOLS_H */
|
||||
|
||||
#endif // GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
|
@ -29,38 +29,30 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef SERVICE_TABLE_H
|
||||
#define SERVICE_TABLE_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "uri.h"
|
||||
#include "ixml.h"
|
||||
#include "upnp.h"
|
||||
#include "upnpdebug.h"
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#define SID_SIZE 41
|
||||
|
||||
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
|
||||
|
||||
typedef struct SUBSCRIPTION {
|
||||
Upnp_SID sid;
|
||||
int eventKey;
|
||||
@ -71,7 +63,6 @@ typedef struct SUBSCRIPTION {
|
||||
struct SUBSCRIPTION *next;
|
||||
} subscription;
|
||||
|
||||
|
||||
typedef struct SERVICE_INFO {
|
||||
DOMString serviceType;
|
||||
DOMString serviceId;
|
||||
@ -85,17 +76,14 @@ typedef struct SERVICE_INFO {
|
||||
struct SERVICE_INFO *next;
|
||||
} service_info;
|
||||
|
||||
|
||||
typedef struct SERVICE_TABLE {
|
||||
DOMString URLBase;
|
||||
service_info *serviceList;
|
||||
service_info *endServiceList;
|
||||
} service_table;
|
||||
|
||||
|
||||
/* Functions for Subscriptions */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Makes a copy of the subscription.
|
||||
*
|
||||
@ -107,7 +95,6 @@ int copy_subscription(
|
||||
/*! [in] Destination subscription. */
|
||||
subscription *out);
|
||||
|
||||
|
||||
/*
|
||||
* \brief Remove the subscription represented by the const Upnp_SID sid parameter
|
||||
* from the service table and update the service table.
|
||||
@ -118,7 +105,6 @@ void RemoveSubscriptionSID(
|
||||
/*! [in] Service object providing the list of subscriptions. */
|
||||
service_info *service);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Return the subscription from the service table that matches
|
||||
* const Upnp_SID sid value.
|
||||
@ -130,7 +116,6 @@ subscription *GetSubscriptionSID(
|
||||
const Upnp_SID sid,
|
||||
/*! [in] Service object providing the list of subscriptions. */
|
||||
service_info *service);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Gets pointer to the first subscription node in the service table.
|
||||
@ -141,7 +126,6 @@ subscription *GetFirstSubscription(
|
||||
/*! [in] Service object providing the list of subscriptions. */
|
||||
service_info *service);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Get current and valid subscription from the service table.
|
||||
*
|
||||
@ -153,7 +137,6 @@ subscription *GetNextSubscription(
|
||||
/*! [in] Current subscription object. */
|
||||
subscription *current);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's the memory allocated for storing the URL of the subscription.
|
||||
*/
|
||||
@ -161,7 +144,6 @@ void freeSubscription(
|
||||
/*! [in] Subscription object to be freed. */
|
||||
subscription *sub);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's memory allocated for all the subscriptions in the service table.
|
||||
*/
|
||||
@ -169,7 +151,6 @@ void freeSubscriptionList(
|
||||
/*! [in] Head of the subscription list. */
|
||||
subscription * head);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses through the service table and returns a pointer to the
|
||||
* service node that matches a known service id and a known UDN.
|
||||
@ -186,7 +167,6 @@ service_info *FindServiceId(
|
||||
* table. */
|
||||
const char *UDN);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses the service table and finds the node whose event URL Path
|
||||
* matches a know value.
|
||||
@ -200,7 +180,6 @@ service_info *FindServiceEventURLPath(
|
||||
/*! [in] Event URL path used to find a service from the table. */
|
||||
char *eventURLPath);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses the service table and finds the node whose control URL Path
|
||||
* matches a know value.
|
||||
@ -214,7 +193,6 @@ service_info * FindServiceControlURLPath(
|
||||
/*! [in] Control URL path used to find a service from the table. */
|
||||
const char *controlURLPath);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief For debugging purposes prints information from the service passed
|
||||
* into the function.
|
||||
@ -231,10 +209,15 @@ void printService(
|
||||
static UPNP_INLINE void printService(
|
||||
service_info *service,
|
||||
Upnp_LogLevel level,
|
||||
Dbg_Module module) {}
|
||||
Dbg_Module module)
|
||||
{
|
||||
return;
|
||||
service = service;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief For debugging purposes prints information of each service from the
|
||||
* service table passed into the function.
|
||||
@ -251,10 +234,15 @@ void printServiceList(
|
||||
static UPNP_INLINE void printServiceList(
|
||||
service_info *service,
|
||||
Upnp_LogLevel level,
|
||||
Dbg_Module module) {}
|
||||
Dbg_Module module)
|
||||
{
|
||||
return;
|
||||
service = service;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief For debugging purposes prints the URL base of the table and information
|
||||
* of each service from the service table passed into the function.
|
||||
@ -271,10 +259,15 @@ void printServiceTable(
|
||||
static UPNP_INLINE void printServiceTable(
|
||||
service_table *table,
|
||||
Upnp_LogLevel level,
|
||||
Dbg_Module module) {}
|
||||
Dbg_Module module)
|
||||
{
|
||||
return;
|
||||
table = table;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's memory allocated for the various components of the service
|
||||
* entry in the service table.
|
||||
@ -283,7 +276,6 @@ void freeService(
|
||||
/*! [in] Service information that is to be freed. */
|
||||
service_info *in);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's memory allocated for the various components of each service
|
||||
* entry in the service table.
|
||||
@ -292,7 +284,6 @@ void freeServiceList(
|
||||
/*! [in] Head of the service list to be freed. */
|
||||
service_info *head);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's dynamic memory in table (does not free table, only memory
|
||||
* within the structure).
|
||||
@ -301,7 +292,6 @@ void freeServiceTable(
|
||||
/*! [in] Service table whose internal memory needs to be freed. */
|
||||
service_table *table);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief This function assumes that services for a particular root device are
|
||||
* placed linearly in the service table, and in the order in which they are
|
||||
@ -316,7 +306,6 @@ int removeServiceTable(
|
||||
/*! [in] Service table from which services will be removed. */
|
||||
service_table *in);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Add Service to the table.
|
||||
*/
|
||||
@ -329,7 +318,6 @@ int addServiceTable(
|
||||
* service list. */
|
||||
const char *DefaultURLBase);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Retrieve service from the table.
|
||||
*
|
||||
@ -343,10 +331,8 @@ int getServiceTable(
|
||||
/*! [in] Default base URL on which the URL will be returned. */
|
||||
const char *DefaultURLBase);
|
||||
|
||||
|
||||
/* Misc helper functions */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Returns the clone of the element value.
|
||||
*
|
||||
@ -358,7 +344,6 @@ DOMString getElementValue(
|
||||
/*! [in] Input node which provides the list of child nodes. */
|
||||
IXML_Node *node);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses through a list of XML nodes to find the node with the
|
||||
* known element name.
|
||||
@ -375,7 +360,6 @@ int getSubElement(
|
||||
/*! [out] Ouput node to which the matched child node is returned. */
|
||||
IXML_Node **out);
|
||||
|
||||
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -29,7 +29,6 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef SSDPLIB_H
|
||||
#define SSDPLIB_H
|
||||
|
||||
@ -113,11 +112,8 @@ typedef enum SsdpCmdType{
|
||||
#define E_SOCKET -7
|
||||
#define RQST_TIMEOUT 20
|
||||
|
||||
|
||||
|
||||
/* Structure to store the SSDP information */
|
||||
typedef struct SsdpEventStruct
|
||||
{
|
||||
/*! Structure to store the SSDP information */
|
||||
typedef struct SsdpEventStruct {
|
||||
enum SsdpCmdType Cmd;
|
||||
enum SsdpSearchType RequestType;
|
||||
int ErrCode;
|
||||
@ -125,7 +121,8 @@ typedef struct SsdpEventStruct
|
||||
int Mx;
|
||||
char UDN[LINE_SIZE];
|
||||
char DeviceType[LINE_SIZE];
|
||||
char ServiceType[LINE_SIZE]; //NT or ST
|
||||
/* NT or ST */
|
||||
char ServiceType[LINE_SIZE];
|
||||
char Location[LINE_SIZE];
|
||||
char HostAddr[LINE_SIZE];
|
||||
char Os[LINE_SIZE];
|
||||
@ -139,13 +136,13 @@ typedef void (* SsdpFunPtr)(Event *);
|
||||
|
||||
typedef Event SsdpEvent ;
|
||||
|
||||
// Structure to contain Discovery response
|
||||
/*! Structure to contain Discovery response. */
|
||||
typedef struct resultData
|
||||
{
|
||||
struct Upnp_Discovery param;
|
||||
void *cookie;
|
||||
Upnp_FunPtr ctrlpt_callback;
|
||||
}ResultData;
|
||||
} ResultData;
|
||||
|
||||
|
||||
typedef struct TData
|
||||
@ -155,7 +152,7 @@ typedef struct TData
|
||||
char * Data;
|
||||
struct sockaddr_storage DestAddr;
|
||||
|
||||
}ThreadData;
|
||||
} ThreadData;
|
||||
|
||||
typedef struct ssdpsearchreply
|
||||
{
|
||||
@ -164,7 +161,7 @@ typedef struct ssdpsearchreply
|
||||
struct sockaddr_storage dest_addr;
|
||||
SsdpEvent event;
|
||||
|
||||
}SsdpSearchReply;
|
||||
} SsdpSearchReply;
|
||||
|
||||
typedef struct ssdpsearcharg
|
||||
{
|
||||
|
@ -1,38 +1,38 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef GENLIB_NET_HTTP_STATCODES_H
|
||||
#define GENLIB_NET_HTTP_STATCODES_H
|
||||
|
||||
// HTTP response status codes
|
||||
/* HTTP response status codes */
|
||||
|
||||
#define HTTP_CONTINUE 100
|
||||
#define HTTP_SWITCHING_PROCOTOLS 101
|
||||
@ -80,15 +80,13 @@
|
||||
#define HTTP_GATEWAY_TIMEOUT 504
|
||||
#define HTTP_HTTP_VERSION_NOT_SUPPORTED 505
|
||||
|
||||
// *********** HTTP lib error codes **********
|
||||
/* HTTP lib error codes */
|
||||
|
||||
#define HTTP_E_OUT_OF_MEMORY -2
|
||||
#define HTTP_E_BAD_MSG_FORMAT -3
|
||||
#define HTTP_E_TIMEDOUT -4
|
||||
#define HTTP_E_FILE_READ -5
|
||||
|
||||
// *******************************************
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@ -109,7 +107,8 @@ extern "C" {
|
||||
const char* http_get_code_text( int statusCode );
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern C
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
#endif /* GENLIB_NET_HTTP_STATCODES_H */
|
||||
|
||||
|
@ -1,33 +1,33 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef GENLIB_UTIL_STRINTMAP_H
|
||||
#define GENLIB_UTIL_STRINTMAP_H
|
||||
@ -35,12 +35,12 @@
|
||||
#include <stdlib.h>
|
||||
#include "upnputil.h"
|
||||
|
||||
// Util to map from a string to an integer and vice versa
|
||||
/* Util to map from a string to an integer and vice versa */
|
||||
|
||||
typedef struct // str_int_entry
|
||||
typedef struct /* str_int_entry */
|
||||
{
|
||||
char *name; // a value in string form
|
||||
int id; // same value in integer form
|
||||
char *name; /* a value in string form */
|
||||
int id; /* same value in integer form */
|
||||
} str_int_entry;
|
||||
|
||||
#ifdef __cplusplus
|
||||
@ -95,8 +95,9 @@ int map_int_to_str( IN int id, IN str_int_entry* table,
|
||||
IN int num_entries );
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern C
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
|
||||
#endif // GENLIB_UTIL_STRINTMAP_H
|
||||
#endif /* GENLIB_UTIL_STRINTMAP_H */
|
||||
|
||||
|
@ -1,42 +1,44 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 UTIL_H
|
||||
#define UTIL_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "upnp.h"
|
||||
|
||||
|
||||
// usually used to specify direction of parameters in functions
|
||||
/* usually used to specify direction of parameters in functions */
|
||||
#ifndef IN
|
||||
#define IN
|
||||
#endif
|
||||
@ -55,7 +57,7 @@
|
||||
#define EVENT_TERMINATE -3
|
||||
|
||||
|
||||
// boolean type in C
|
||||
/*! boolean type in C. */
|
||||
typedef char xboolean;
|
||||
|
||||
#ifndef TRUE
|
||||
@ -66,108 +68,73 @@ typedef char xboolean;
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
|
||||
///////////////////////////
|
||||
// funcs
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/************************************************************************
|
||||
* Function: logerror
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *fmt; format string
|
||||
*
|
||||
* Description: Log an error message.
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void log_error( IN const char *fmt, ... );
|
||||
/*!
|
||||
* \brief Copy no of bytes spcified by the LINE_SIZE constant, from the
|
||||
* source buffer. Null terminate the destination buffer.
|
||||
*/
|
||||
void linecopy(
|
||||
/*! [out] output buffer. */
|
||||
char dest[LINE_SIZE],
|
||||
/*! [in] input buffer. */
|
||||
const char *src);
|
||||
|
||||
/************************************************************************
|
||||
* Function: linecopy
|
||||
*
|
||||
* Parameters:
|
||||
* OUT char dest[LINE_SIZE]; output buffer
|
||||
* IN const char *src; input buffer
|
||||
*
|
||||
* Description: Copy no of bytes spcified by the LINE_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer.
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void linecopy( OUT char dest[LINE_SIZE], IN const char* src );
|
||||
/*!
|
||||
* \brief Copy no of bytes spcified by the NAME_SIZE constant, from the
|
||||
* source buffer. Null terminate the destination buffer
|
||||
*/
|
||||
void namecopy(
|
||||
/*! [out] output buffer. */
|
||||
char dest[NAME_SIZE],
|
||||
/*! [in] input buffer. */
|
||||
const char *src);
|
||||
|
||||
/************************************************************************
|
||||
* Function: namecopy
|
||||
/*!
|
||||
* \brief Determine if the srclen passed in paramter is less than the
|
||||
* permitted LINE_SIZE. If it is use the passed parameter, if not
|
||||
* use the permitted LINE_SIZE as the length parameter.
|
||||
*
|
||||
* Parameters:
|
||||
* OUT char dest[NAME_SIZE]; output buffer
|
||||
* IN const char *src; input buffer
|
||||
*
|
||||
* Description: Copy no of bytes spcified by the NAME_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void namecopy( OUT char dest[NAME_SIZE], IN const char* src );
|
||||
|
||||
/************************************************************************
|
||||
* Function: linecopylen
|
||||
*
|
||||
* Parameters:
|
||||
* OUT char dest[LINE_SIZE]; output buffer
|
||||
* IN const char *src; input buffer
|
||||
* IN size_t srclen; bytes to be copied.
|
||||
*
|
||||
* Description : Determine if the srclen passed in paramter is less than
|
||||
* the permitted LINE_SIZE. If it is use the passed parameter, if not
|
||||
* use the permitted LINE_SIZE as the length parameter
|
||||
* Copy no of bytes spcified by the LINE_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen );
|
||||
|
||||
* Copy no of bytes spcified by the LINE_SIZE constant, from the source
|
||||
* buffer. Null terminate the destination buffer.
|
||||
*/
|
||||
void linecopylen(
|
||||
/*! [out] output buffer. */
|
||||
char dest[LINE_SIZE],
|
||||
/*! [in] input buffer. */
|
||||
const char *src,
|
||||
/*! [in] bytes to be copied. */
|
||||
size_t srclen);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern C
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Size of the errorBuffer variable, passed to the strerror_r() function */
|
||||
#define ERROR_BUFFER_LEN 256
|
||||
|
||||
//////////////////////////////////
|
||||
// C specific
|
||||
/* C specific */
|
||||
#ifndef __cplusplus
|
||||
|
||||
#ifdef WIN32
|
||||
#ifndef S_ISREG
|
||||
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#endif
|
||||
|
||||
#ifndef S_ISDIR
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
|
||||
#define EADDRINUSE WSAEADDRINUSE
|
||||
|
||||
#define strcasecmp stricmp
|
||||
#define strncasecmp strnicmp
|
||||
|
||||
#define sleep(a) Sleep((a)*1000)
|
||||
#define usleep(a) Sleep((a)/1000)
|
||||
|
||||
#define strerror_r(a,b,c) (strerror_s((b),(c),(a)))
|
||||
#else
|
||||
#define max(a, b) (((a)>(b))? (a):(b))
|
||||
#define min(a, b) (((a)<(b))? (a):(b))
|
||||
#endif /* WIN32 */
|
||||
|
||||
#endif // __cplusplus
|
||||
#ifdef WIN32
|
||||
#ifndef S_ISREG
|
||||
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#endif
|
||||
#ifndef S_ISDIR
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
#define EADDRINUSE WSAEADDRINUSE
|
||||
#define strcasecmp stricmp
|
||||
#define strncasecmp strnicmp
|
||||
#define sleep(a) Sleep((a)*1000)
|
||||
#define usleep(a) Sleep((a)/1000)
|
||||
#define strerror_r(a,b,c) (strerror_s((b),(c),(a)))
|
||||
#else
|
||||
#define max(a, b) (((a)>(b))? (a):(b))
|
||||
#define min(a, b) (((a)<(b))? (a):(b))
|
||||
#endif /* WIN32 */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* UTIL_H */
|
||||
|
||||
|
@ -29,11 +29,9 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef GENLIB_NET_URI_H
|
||||
#define GENLIB_NET_URI_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
@ -42,11 +40,9 @@
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include "UpnpGlobal.h" /* for */
|
||||
#include "UpnpInet.h"
|
||||
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
@ -58,7 +54,6 @@
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include "inet_pton.h"
|
||||
#else
|
||||
@ -66,49 +61,45 @@
|
||||
#include <netdb.h> /* for struct addrinfo */
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define strncasecmp strnicmp
|
||||
#else
|
||||
/* Other systems have strncasecmp */
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! length for HTTP DATE: "DATE: Sun, 01 Jul 2000 08:15:23 GMT<cr><lf>" */
|
||||
#define HTTP_DATE_LENGTH 37
|
||||
|
||||
#define HTTP_DATE_LENGTH 37 // length for HTTP DATE:
|
||||
//"DATE: Sun, 01 Jul 2000 08:15:23 GMT<cr><lf>"
|
||||
#define SEPARATORS "()<>@,;:\\\"/[]?={} \t"
|
||||
#define MARK "-_.!~*'()"
|
||||
#define RESERVED ";/?:@&=+$,{}" //added {} for compatibility
|
||||
|
||||
/*! added {} for compatibility */
|
||||
#define RESERVED ";/?:@&=+$,{}"
|
||||
|
||||
#define HTTP_SUCCESS 1
|
||||
|
||||
|
||||
#define FALSE 0
|
||||
#define TAB 9
|
||||
#define CR 13
|
||||
#define LF 10
|
||||
#define SOCKET_BUFFER_SIZE 5000
|
||||
|
||||
|
||||
enum hostType {
|
||||
HOSTNAME,
|
||||
IPv4address
|
||||
};
|
||||
|
||||
|
||||
enum pathType {
|
||||
ABS_PATH,
|
||||
REL_PATH,
|
||||
OPAQUE_PART
|
||||
};
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
/* there is a conflict in windows with other symbols */
|
||||
/* there is a conflict in windows with other symbols. */
|
||||
enum uriType {
|
||||
absolute,
|
||||
relative
|
||||
@ -120,7 +111,6 @@ enum pathType {
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Buffer used in parsinghttp messages, urls, etc. generally this simply
|
||||
* holds a pointer into a larger array.
|
||||
@ -130,7 +120,6 @@ typedef struct TOKEN {
|
||||
size_t size;
|
||||
} token;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Represents a host port: e.g. "127.127.0.1:80" text is a token
|
||||
* pointing to the full string representation.
|
||||
@ -142,7 +131,6 @@ typedef struct HOSTPORT {
|
||||
struct sockaddr_storage IPaddress;
|
||||
} hostport_type;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Represents a URI used in parse_uri and elsewhere
|
||||
*/
|
||||
@ -155,7 +143,6 @@ typedef struct URI{
|
||||
hostport_type hostport;
|
||||
} uri_type;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Represents a list of URLs as in the "callback" header of SUBSCRIBE
|
||||
* message in GENA. "char *" URLs holds dynamic memory.
|
||||
@ -169,7 +156,6 @@ typedef struct URL_LIST {
|
||||
uri_type *parsedURLs;
|
||||
} URL_list;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Replaces an escaped sequence with its unescaped version as in
|
||||
* http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs)
|
||||
@ -190,7 +176,6 @@ int replace_escaped(
|
||||
/*! [out] . */
|
||||
size_t *max);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Copies one URL_list into another.
|
||||
*
|
||||
@ -218,7 +203,6 @@ void free_URL_list(
|
||||
/*! [in] URL list object. */
|
||||
URL_list *list);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Function useful in debugging for printing a parsed uri.
|
||||
*/
|
||||
@ -227,10 +211,13 @@ void print_uri(
|
||||
/*! [in] URI object to print. */
|
||||
uri_type *in);
|
||||
#else
|
||||
static UPNP_INLINE void print_uri(uri_type *in) {}
|
||||
static UPNP_INLINE void print_uri(uri_type *in)
|
||||
{
|
||||
return;
|
||||
in = in;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Function useful in debugging for printing a token.
|
||||
*/
|
||||
@ -239,10 +226,15 @@ void print_token(
|
||||
/*! [in] Token object to print. */
|
||||
token *in);
|
||||
#else
|
||||
static UPNP_INLINE void print_token(token * in) {}
|
||||
static UPNP_INLINE void print_token(
|
||||
/*! [in] Token object to print. */
|
||||
token *in)
|
||||
{
|
||||
return;
|
||||
in = in;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compares buffer in the token object with the buffer in in2.
|
||||
*
|
||||
@ -257,7 +249,6 @@ int token_string_casecmp(
|
||||
/*! [in] String of characters to compare with. */
|
||||
char *in2);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compares a null terminated string to a token (exact).
|
||||
*
|
||||
@ -272,7 +263,6 @@ int token_string_cmp(
|
||||
/*! [in] String of characters to compare with. */
|
||||
char *in2);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compares two tokens.
|
||||
*
|
||||
@ -287,7 +277,6 @@ int token_cmp(
|
||||
/*! [in] Second token object used for the comparison. */
|
||||
token *in2);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Parses a string representing a host and port (e.g. "127.127.0.1:80"
|
||||
* or "localhost") and fills out a hostport_type struct with internet address
|
||||
@ -304,7 +293,6 @@ int parse_hostport(
|
||||
* an internet address. */
|
||||
hostport_type *out);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Removes http escaped characters such as: "%20" and replaces them with
|
||||
* their character representation. i.e. "hello%20foo" -> "hello foo".
|
||||
@ -320,7 +308,6 @@ int remove_escaped_chars(
|
||||
/*! [in,out] Size limit for the number of characters. */
|
||||
size_t *size);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Removes ".", and ".." from a path.
|
||||
*
|
||||
@ -349,7 +336,6 @@ int remove_dots(
|
||||
/*! [in] Size limit for the number of characters. */
|
||||
size_t size);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief resolves a relative url with a base url returning a NEW (dynamically
|
||||
* allocated with malloc) full url.
|
||||
@ -370,7 +356,6 @@ char *resolve_rel_url(
|
||||
/*! [in] Relative URL. */
|
||||
char *rel_url);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Parses a uri as defined in http://www.ietf.org/rfc/rfc2396.txt
|
||||
* (RFC explaining URIs).
|
||||
@ -391,7 +376,6 @@ int parse_uri(
|
||||
/*! [out] Output parameter which will have the parsed uri information. */
|
||||
uri_type *out);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Same as parse_uri(), except that all strings are unescaped
|
||||
* (%XX replaced by chars).
|
||||
@ -408,7 +392,6 @@ int parse_uri_and_unescape(
|
||||
/*! [out] Output parameter which will have the parsed uri information. */
|
||||
uri_type *out);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*
|
||||
@ -422,7 +405,6 @@ int parse_token(
|
||||
/*! [in] . */
|
||||
int max_size);
|
||||
|
||||
|
||||
/* Commented #defines, functions and typdefs */
|
||||
|
||||
#if 0
|
||||
|
@ -130,9 +130,9 @@ void web_server_callback(
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern C
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
|
||||
#endif // GENLIB_NET_HTTP_WEBSERVER_H
|
||||
#endif /* GENLIB_NET_HTTP_WEBSERVER_H */
|
||||
|
||||
|
@ -1,33 +1,33 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
@ -54,9 +54,9 @@
|
||||
|
||||
#define SOAP_ACTION_RESP 1
|
||||
#define SOAP_VAR_RESP 2
|
||||
//#define SOAP_ERROR_RESP 3
|
||||
/*#define SOAP_ERROR_RESP 3*/
|
||||
#define SOAP_ACTION_RESP_ERROR 3
|
||||
#define SOAP_VAR_RESP_ERROR 4
|
||||
#define SOAP_VAR_RESP_ERROR 4
|
||||
|
||||
/****************************************************************************
|
||||
* Function : dom_cmp_name
|
||||
@ -96,7 +96,7 @@ dom_cmp_name( IN char *name,
|
||||
strcmp( nameptr.buf, name ) == 0 ) {
|
||||
ret_code = 0;
|
||||
} else {
|
||||
ret_code = 1; // names are not the same
|
||||
ret_code = 1; /* names are not the same */
|
||||
}
|
||||
|
||||
return ret_code;
|
||||
@ -125,20 +125,20 @@ dom_find_node( IN char *node_name,
|
||||
{
|
||||
IXML_Node *node;
|
||||
|
||||
// invalid args
|
||||
/* invalid args */
|
||||
if( node_name == NULL || start_node == NULL ) {
|
||||
return UPNP_E_NOT_FOUND;
|
||||
}
|
||||
|
||||
node = ixmlNode_getFirstChild( start_node );
|
||||
while( node != NULL ) {
|
||||
// match name
|
||||
/* match name */
|
||||
if( dom_cmp_name( node_name, node ) == 0 ) {
|
||||
*matching_node = node;
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
// free and next node
|
||||
node = ixmlNode_getNextSibling( node ); // next node
|
||||
/* free and next node */
|
||||
node = ixmlNode_getNextSibling( node ); /* next node */
|
||||
}
|
||||
|
||||
return UPNP_E_NOT_FOUND;
|
||||
@ -193,10 +193,10 @@ dom_find_deep_node( IN char *names[],
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
node = match_node; // try again
|
||||
node = match_node; /* try again */
|
||||
}
|
||||
|
||||
return UPNP_E_NOT_FOUND; // this line not reached
|
||||
return UPNP_E_NOT_FOUND; /* this line not reached */
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -253,7 +253,7 @@ get_host_and_path( IN char *ctrl_url,
|
||||
if( parse_uri( ctrl_url, strlen( ctrl_url ), url ) != HTTP_SUCCESS ) {
|
||||
return -1;
|
||||
}
|
||||
// This is done to ensure that the buffer is kept const
|
||||
/* This is done to ensure that the buffer is kept const */
|
||||
((memptr *)host)->buf = (char *)url->hostport.text.buff;
|
||||
((memptr *)host)->length = url->hostport.text.size;
|
||||
|
||||
@ -310,15 +310,15 @@ add_man_header( INOUT membuffer * headers )
|
||||
char *man_hdr = "MAN: \"http://schemas.xmlsoap.org/soap/envelope/\"; "
|
||||
"ns=01\r\n01-";
|
||||
|
||||
// change POST to M-POST
|
||||
/* change POST to M-POST */
|
||||
if( membuffer_insert( headers, "M-", 2, 0 ) != 0 ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
|
||||
soap_action_hdr = strstr( headers->buf, "SOAPACTION:" );
|
||||
assert( soap_action_hdr != NULL ); // can't fail
|
||||
assert( soap_action_hdr != NULL ); /* can't fail */
|
||||
|
||||
// insert MAN header
|
||||
/* insert MAN header */
|
||||
if( membuffer_insert( headers, man_hdr, strlen( man_hdr ),
|
||||
soap_action_hdr - headers->buf ) != 0 ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
@ -357,16 +357,16 @@ soap_request_and_response( IN membuffer * request,
|
||||
httpmsg_destroy( &response->msg );
|
||||
return ret_code;
|
||||
}
|
||||
// method-not-allowed error
|
||||
/* method-not-allowed error */
|
||||
if( response->msg.status_code == HTTP_METHOD_NOT_ALLOWED ) {
|
||||
ret_code = add_man_header( request ); // change to M-POST msg
|
||||
ret_code = add_man_header( request ); /* change to M-POST msg */
|
||||
if( ret_code != 0 ) {
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
httpmsg_destroy( &response->msg ); // about to reuse response
|
||||
httpmsg_destroy( &response->msg ); /* about to reuse response */
|
||||
|
||||
// try again
|
||||
/* try again */
|
||||
ret_code = http_RequestAndResponse( destination_url, request->buf,
|
||||
request->length,
|
||||
HTTPMETHOD_MPOST,
|
||||
@ -423,9 +423,9 @@ get_response_value( IN http_message_t * hmsg,
|
||||
char *names[5];
|
||||
const DOMString nodeValue;
|
||||
|
||||
err_code = UPNP_E_BAD_RESPONSE; // default error
|
||||
err_code = UPNP_E_BAD_RESPONSE; /* default error */
|
||||
|
||||
// only 200 and 500 status codes are relevant
|
||||
/* only 200 and 500 status codes are relevant */
|
||||
if( ( hmsg->status_code != HTTP_OK &&
|
||||
hmsg->status_code != HTTP_INTERNAL_SERVER_ERROR ) ||
|
||||
!has_xml_content_type( hmsg ) ) {
|
||||
@ -445,9 +445,9 @@ get_response_value( IN http_message_t * hmsg,
|
||||
}
|
||||
|
||||
if( code == SOAP_ACTION_RESP ) {
|
||||
//
|
||||
// try reading soap action response
|
||||
//
|
||||
/* */
|
||||
/* try reading soap action response */
|
||||
/* */
|
||||
assert( action_value != NULL );
|
||||
|
||||
*action_value = NULL;
|
||||
@ -474,7 +474,7 @@ get_response_value( IN http_message_t * hmsg,
|
||||
done = TRUE;
|
||||
}
|
||||
} else if( code == SOAP_VAR_RESP ) {
|
||||
// try reading var response
|
||||
/* try reading var response */
|
||||
assert( str_value != NULL );
|
||||
*str_value = NULL;
|
||||
|
||||
@ -496,7 +496,7 @@ get_response_value( IN http_message_t * hmsg,
|
||||
}
|
||||
|
||||
if( !done ) {
|
||||
// not action or var resp; read error code and description
|
||||
/* not action or var resp; read error code and description */
|
||||
*str_value = NULL;
|
||||
|
||||
names[0] = "Envelope";
|
||||
@ -522,7 +522,7 @@ get_response_value( IN http_message_t * hmsg,
|
||||
*upnp_error_code = atoi( temp_str );
|
||||
if( *upnp_error_code < 400 ) {
|
||||
err_code = *upnp_error_code;
|
||||
goto error_handler; // bad SOAP error code
|
||||
goto error_handler; /* bad SOAP error code */
|
||||
}
|
||||
|
||||
if( code == SOAP_VAR_RESP ) {
|
||||
@ -616,27 +616,27 @@ SoapSendAction( IN char *action_url,
|
||||
size_t xml_end_len;
|
||||
size_t action_str_len;
|
||||
|
||||
*response_node = NULL; // init
|
||||
*response_node = NULL; /* init */
|
||||
|
||||
err_code = UPNP_E_OUTOF_MEMORY; // default error
|
||||
err_code = UPNP_E_OUTOF_MEMORY; /* default error */
|
||||
|
||||
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
|
||||
"Inside SoapSendAction():" );
|
||||
// init
|
||||
/* init */
|
||||
membuffer_init( &request );
|
||||
membuffer_init( &responsename );
|
||||
|
||||
// print action
|
||||
/* print action */
|
||||
action_str = ixmlPrintNode( ( IXML_Node * ) action_node );
|
||||
if( action_str == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// get action name
|
||||
/* get action name */
|
||||
if( get_action_name( action_str, &name ) != 0 ) {
|
||||
err_code = UPNP_E_INVALID_ACTION;
|
||||
goto error_handler;
|
||||
}
|
||||
// parse url
|
||||
/* parse url */
|
||||
if( http_FixStrUrl( action_url, strlen( action_url ), &url ) != 0 ) {
|
||||
err_code = UPNP_E_INVALID_URL;
|
||||
goto error_handler;
|
||||
@ -653,7 +653,7 @@ SoapSendAction( IN char *action_url,
|
||||
xml_end_len = strlen( xml_end );
|
||||
action_str_len = strlen( action_str );
|
||||
|
||||
// make request msg
|
||||
/* make request msg */
|
||||
request.size_inc = 50;
|
||||
content_length = xml_start_len + action_str_len + xml_end_len;
|
||||
if (http_MakeMessage(
|
||||
@ -680,7 +680,7 @@ SoapSendAction( IN char *action_url,
|
||||
membuffer_append_str( &responsename, "Response" ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// get action node from the response
|
||||
/* get action node from the response */
|
||||
ret_code = get_response_value( &response.msg, SOAP_ACTION_RESP,
|
||||
responsename.buf, &upnp_error_code,
|
||||
( IXML_Node ** ) response_node,
|
||||
@ -767,32 +767,32 @@ SoapSendActionEx( IN char *action_url,
|
||||
size_t xml_end_len;
|
||||
off_t content_length;
|
||||
|
||||
*response_node = NULL; // init
|
||||
*response_node = NULL; /* init */
|
||||
|
||||
err_code = UPNP_E_OUTOF_MEMORY; // default error
|
||||
err_code = UPNP_E_OUTOF_MEMORY; /* default error */
|
||||
|
||||
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
|
||||
"Inside SoapSendActionEx():" );
|
||||
// init
|
||||
/* init */
|
||||
membuffer_init( &request );
|
||||
membuffer_init( &responsename );
|
||||
|
||||
// header string
|
||||
/* header string */
|
||||
xml_header_str = ixmlPrintNode( ( IXML_Node * ) header );
|
||||
if( xml_header_str == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// print action
|
||||
/* print action */
|
||||
action_str = ixmlPrintNode( ( IXML_Node * ) action_node );
|
||||
if( action_str == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// get action name
|
||||
/* get action name */
|
||||
if( get_action_name( action_str, &name ) != 0 ) {
|
||||
err_code = UPNP_E_INVALID_ACTION;
|
||||
goto error_handler;
|
||||
}
|
||||
// parse url
|
||||
/* parse url */
|
||||
if( http_FixStrUrl( action_url, strlen( action_url ), &url ) != 0 ) {
|
||||
err_code = UPNP_E_INVALID_URL;
|
||||
goto error_handler;
|
||||
@ -814,7 +814,7 @@ SoapSendActionEx( IN char *action_url,
|
||||
xml_header_end_len = strlen( xml_header_end );
|
||||
xml_header_str_len = strlen( xml_header_str );
|
||||
|
||||
// make request msg
|
||||
/* make request msg */
|
||||
request.size_inc = 50;
|
||||
content_length =
|
||||
xml_start_len +
|
||||
@ -848,7 +848,7 @@ SoapSendActionEx( IN char *action_url,
|
||||
membuffer_append_str( &responsename, "Response" ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// get action node from the response
|
||||
/* get action node from the response */
|
||||
ret_code = get_response_value( &response.msg, SOAP_ACTION_RESP,
|
||||
responsename.buf, &upnp_error_code,
|
||||
( IXML_Node ** ) response_node,
|
||||
@ -896,8 +896,8 @@ SoapGetServiceVarStatus( IN char *action_url,
|
||||
IN char *var_name,
|
||||
OUT char **var_value )
|
||||
{
|
||||
const memptr host; // value for HOST header
|
||||
const memptr path; // ctrl path in first line in msg
|
||||
const memptr host; /* value for HOST header */
|
||||
const memptr path; /* ctrl path in first line in msg */
|
||||
uri_type url;
|
||||
membuffer request;
|
||||
int ret_code;
|
||||
@ -919,15 +919,15 @@ SoapGetServiceVarStatus( IN char *action_url,
|
||||
"</s:Body>\r\n"
|
||||
"</s:Envelope>\r\n";
|
||||
|
||||
*var_value = NULL; // return NULL in case of an error
|
||||
*var_value = NULL; /* return NULL in case of an error */
|
||||
|
||||
membuffer_init( &request );
|
||||
|
||||
// get host hdr and url path
|
||||
/* get host hdr and url path */
|
||||
if( get_host_and_path( action_url, &host, &path, &url ) == -1 ) {
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
// make headers
|
||||
/* make headers */
|
||||
request.size_inc = 50;
|
||||
content_length = strlen( xml_start ) + strlen( var_name ) + strlen( xml_end );
|
||||
if (http_MakeMessage(
|
||||
@ -941,13 +941,13 @@ SoapGetServiceVarStatus( IN char *action_url,
|
||||
xml_start, var_name, xml_end ) != 0 ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
// send msg and get reply
|
||||
/* send msg and get reply */
|
||||
ret_code = soap_request_and_response( &request, &url, &response );
|
||||
membuffer_destroy( &request );
|
||||
if( ret_code != UPNP_E_SUCCESS ) {
|
||||
return ret_code;
|
||||
}
|
||||
// get variable value from the response
|
||||
/* get variable value from the response */
|
||||
ret_code = get_response_value( &response.msg, SOAP_VAR_RESP, NULL,
|
||||
&upnp_error_code, NULL, var_value );
|
||||
|
||||
@ -962,5 +962,6 @@ SoapGetServiceVarStatus( IN char *action_url,
|
||||
}
|
||||
}
|
||||
|
||||
#endif // EXCLUDE_SOAP
|
||||
#endif // INCLUDE_CLIENT_APIS
|
||||
#endif /* EXCLUDE_SOAP */
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
|
||||
|
@ -29,19 +29,15 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
#if EXCLUDE_SOAP == 0
|
||||
|
||||
|
||||
#define SOAP_BODY "Body"
|
||||
#define SOAP_URN "http:/""/schemas.xmlsoap.org/soap/envelope/"
|
||||
|
||||
@ -56,12 +52,10 @@
|
||||
#include "unixutil.h"
|
||||
#include "upnpapi.h"
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define snprintf _snprintf
|
||||
#endif
|
||||
|
||||
|
||||
/*! timeout duration in secs for transmission/reception */
|
||||
#define SOAP_TIMEOUT UPNP_TIMEOUT
|
||||
|
||||
@ -83,23 +77,16 @@ static const char *Soap_Invalid_Var = "Invalid Var";
|
||||
const char *ContentTypeHeader =
|
||||
"CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n";
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function : get_request_type
|
||||
*
|
||||
* Parameters :
|
||||
* IN http_message_t* request : HTTP request
|
||||
* OUT memptr* action_name : SOAP action name
|
||||
*
|
||||
* Description : This function retrives the name of the SOAP action
|
||||
*
|
||||
* Return : int
|
||||
* 0 if successful else returns appropriate error.
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
static UPNP_INLINE int
|
||||
get_request_type( IN http_message_t * request,
|
||||
OUT memptr * action_name )
|
||||
/*!
|
||||
* \brief This function retrives the name of the SOAP action.
|
||||
*
|
||||
* \return 0 if successful else returns appropriate error.
|
||||
*/
|
||||
static UPNP_INLINE int get_request_type(
|
||||
/*! [in] HTTP request. */
|
||||
http_message_t *request,
|
||||
/*! [out] SOAP action name. */
|
||||
memptr *action_name)
|
||||
{
|
||||
memptr value;
|
||||
memptr ns_value,
|
||||
@ -109,16 +96,15 @@ get_request_type( IN http_message_t * request,
|
||||
char *s;
|
||||
membuffer soap_action_name;
|
||||
|
||||
// find soapaction header
|
||||
//
|
||||
/* find soapaction header */
|
||||
if( request->method == SOAPMETHOD_POST ) {
|
||||
if( httpmsg_find_hdr( request, HDR_SOAPACTION, &value )
|
||||
== NULL ) {
|
||||
return SREQ_HDR_NOT_FOUND;
|
||||
}
|
||||
} else // M-POST
|
||||
{
|
||||
// get NS value from MAN header
|
||||
} else {
|
||||
/* M-POST */
|
||||
/* get NS value from MAN header */
|
||||
hdr = httpmsg_find_hdr( request, HDR_MAN, &value );
|
||||
if( hdr == NULL ) {
|
||||
return SREQ_HDR_NOT_FOUND;
|
||||
@ -128,7 +114,7 @@ get_request_type( IN http_message_t * request,
|
||||
&dummy_quote, &ns_value ) != 0 ) {
|
||||
return SREQ_BAD_HDR_FORMAT;
|
||||
}
|
||||
// create soapaction name header
|
||||
/* create soapaction name header */
|
||||
membuffer_init( &soap_action_name );
|
||||
if( ( membuffer_assign( &soap_action_name,
|
||||
ns_value.buf, ns_value.length )
|
||||
@ -151,8 +137,7 @@ get_request_type( IN http_message_t * request,
|
||||
value.length = hdr->value.length;
|
||||
}
|
||||
|
||||
// determine type
|
||||
//
|
||||
/* determine type */
|
||||
save_char = value.buf[value.length];
|
||||
value.buf[value.length] = '\0';
|
||||
|
||||
@ -162,21 +147,22 @@ get_request_type( IN http_message_t * request,
|
||||
return SREQ_BAD_HDR_FORMAT;
|
||||
}
|
||||
|
||||
s++; // move to value
|
||||
/* move to value */
|
||||
s++;
|
||||
|
||||
if( matchstr( s, value.length - ( s - value.buf ), "%s",
|
||||
action_name ) != PARSE_OK ) {
|
||||
value.buf[value.length] = save_char;
|
||||
return SREQ_BAD_HDR_FORMAT;
|
||||
}
|
||||
// action name or variable ?
|
||||
/* action name or variable ? */
|
||||
if( memptr_cmp( action_name, "QueryStateVariable" ) == 0 ) {
|
||||
// query variable
|
||||
/* query variable */
|
||||
action_name->buf = NULL;
|
||||
action_name->length = 0;
|
||||
}
|
||||
|
||||
value.buf[value.length] = save_char; // restore
|
||||
/* restore */
|
||||
value.buf[value.length] = save_char;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -206,7 +192,7 @@ send_error_response( IN SOCKINFO * info,
|
||||
int major,
|
||||
minor;
|
||||
const char *start_body =
|
||||
// "<?xml version=\"1.0\"?>\n" required??
|
||||
/* "<?xml version=\"1.0\"?>\n" required?? */
|
||||
"<s:Envelope "
|
||||
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
|
||||
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n"
|
||||
@ -231,14 +217,14 @@ send_error_response( IN SOCKINFO * info,
|
||||
|
||||
sprintf( err_code_str, "%d", error_code );
|
||||
|
||||
// calc body len
|
||||
/* calc body len */
|
||||
content_length = strlen( start_body ) + strlen( err_code_str ) +
|
||||
strlen( mid_body ) + strlen( err_msg ) + strlen( end_body );
|
||||
|
||||
http_CalcResponseVersion( hmsg->major_version, hmsg->minor_version,
|
||||
&major, &minor );
|
||||
|
||||
// make headers
|
||||
/* make headers */
|
||||
membuffer_init( &headers );
|
||||
if (http_MakeMessage(
|
||||
&headers, major, minor,
|
||||
@ -251,9 +237,9 @@ send_error_response( IN SOCKINFO * info,
|
||||
start_body, err_code_str, mid_body, err_msg,
|
||||
end_body ) != 0 ) {
|
||||
membuffer_destroy( &headers );
|
||||
return; // out of mem
|
||||
return; /* out of mem */
|
||||
}
|
||||
// send err msg
|
||||
/* send err msg */
|
||||
http_SendMessage( info, &timeout_secs, "b",
|
||||
headers.buf, headers.length );
|
||||
|
||||
@ -304,7 +290,7 @@ send_var_query_response( IN SOCKINFO * info,
|
||||
content_length = strlen( start_body ) + strlen( var_value ) +
|
||||
strlen( end_body );
|
||||
|
||||
// make headers
|
||||
/* make headers */
|
||||
membuffer_init( &response );
|
||||
|
||||
if (http_MakeMessage(
|
||||
@ -317,10 +303,10 @@ send_var_query_response( IN SOCKINFO * info,
|
||||
X_USER_AGENT,
|
||||
start_body, var_value, end_body ) != 0 ) {
|
||||
membuffer_destroy( &response );
|
||||
return; // out of mem
|
||||
return; /* out of mem */
|
||||
}
|
||||
|
||||
// send msg
|
||||
/* send msg */
|
||||
http_SendMessage( info, &timeout_secs, "b",
|
||||
response.buf, response.length );
|
||||
|
||||
@ -353,7 +339,7 @@ get_action_node( IN IXML_Document * TempDoc,
|
||||
IXML_Node *ActNode = NULL;
|
||||
DOMString ActNodeName = NULL;
|
||||
const DOMString nodeName;
|
||||
int ret_code = -1; // error, by default
|
||||
int ret_code = -1; /* error, by default */
|
||||
IXML_NodeList *nl = NULL;
|
||||
|
||||
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
|
||||
@ -361,7 +347,7 @@ get_action_node( IN IXML_Document * TempDoc,
|
||||
|
||||
*RespNode = NULL;
|
||||
|
||||
// Got the Envelope node here
|
||||
/* Got the Envelope node here */
|
||||
EnvpNode = ixmlNode_getFirstChild( ( IXML_Node * ) TempDoc );
|
||||
if( EnvpNode == NULL ) {
|
||||
goto error_handler;
|
||||
@ -379,12 +365,12 @@ get_action_node( IN IXML_Document * TempDoc,
|
||||
if( BodyNode == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// Got action node here
|
||||
/* Got action node here */
|
||||
ActNode = ixmlNode_getFirstChild( BodyNode );
|
||||
if( ActNode == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
//Test whether this is the action node
|
||||
/* Test whether this is the action node */
|
||||
nodeName = ixmlNode_getNodeName( ActNode );
|
||||
if( nodeName == NULL ) {
|
||||
goto error_handler;
|
||||
@ -406,7 +392,7 @@ get_action_node( IN IXML_Document * TempDoc,
|
||||
}
|
||||
}
|
||||
|
||||
ret_code = 0; // success
|
||||
ret_code = 0; /* success */
|
||||
|
||||
error_handler:
|
||||
|
||||
@ -498,8 +484,7 @@ check_soap_action_header( IN http_message_t * request,
|
||||
char *temp = NULL;
|
||||
char *temp2 = NULL;
|
||||
|
||||
//check soap action header
|
||||
|
||||
/* check soap action header */
|
||||
soap_action_header = httpmsg_find_hdr( request, HDR_SOAPACTION,
|
||||
&header_name );
|
||||
|
||||
@ -533,35 +518,28 @@ check_soap_action_header( IN http_message_t * request,
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
( *temp ) = 0; //temp make string
|
||||
|
||||
//check to see if it is Query State Variable or
|
||||
//Service Action
|
||||
( *temp ) = 0; /* temp make string */
|
||||
|
||||
/* check to see if it is Query State Variable or
|
||||
* Service Action */
|
||||
tempSize = strlen( urn ) + 2;
|
||||
|
||||
ns_compare = ( char * )malloc( tempSize );
|
||||
|
||||
if( !ns_compare ) {
|
||||
ret_code = UPNP_E_OUTOF_MEMORY;
|
||||
free( temp_header_value );
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
snprintf( ns_compare, tempSize, "\"%s", urn );
|
||||
|
||||
if( strcmp( temp_header_value, ns_compare ) ) {
|
||||
ret_code = UPNP_E_INVALID_ACTION;
|
||||
} else {
|
||||
ret_code = UPNP_E_SUCCESS;
|
||||
temp++;
|
||||
temp2 = strchr( temp, '\"' );
|
||||
|
||||
if( temp2 ) //remove ending " if present
|
||||
if( temp2 ) /* remove ending " if present */
|
||||
{
|
||||
( *temp2 ) = 0;
|
||||
}
|
||||
|
||||
if( *temp )
|
||||
( *actionName ) = strdup( temp );
|
||||
if( !*actionName ) {
|
||||
@ -611,11 +589,11 @@ get_device_info( IN http_message_t *request,
|
||||
int device_hnd;
|
||||
service_info *serv_info;
|
||||
char save_char;
|
||||
int ret_code = -1; // error by default
|
||||
int ret_code = -1; /* error by default */
|
||||
const char *control_url;
|
||||
char *actionName = NULL;
|
||||
|
||||
// null-terminate pathquery of url
|
||||
/* null-terminate pathquery of url */
|
||||
control_url = request->uri.pathquery.buff;
|
||||
save_char = control_url[request->uri.pathquery.size];
|
||||
((char *)control_url)[request->uri.pathquery.size] = '\0';
|
||||
@ -641,7 +619,7 @@ get_device_info( IN http_message_t *request,
|
||||
ret_code = UPNP_E_INVALID_ACTION;
|
||||
goto error_handler;
|
||||
}
|
||||
//check soap body
|
||||
/* check soap body */
|
||||
ret_code =
|
||||
check_soap_body( actionDoc, QUERY_STATE_VAR_URN, actionName );
|
||||
free( actionName );
|
||||
@ -657,7 +635,7 @@ get_device_info( IN http_message_t *request,
|
||||
ret_code = UPNP_E_INVALID_SERVICE;
|
||||
goto error_handler;
|
||||
}
|
||||
//check soap body
|
||||
/* check soap body */
|
||||
ret_code =
|
||||
check_soap_body( actionDoc, serv_info->serviceType,
|
||||
actionName );
|
||||
@ -675,8 +653,8 @@ get_device_info( IN http_message_t *request,
|
||||
|
||||
ret_code = 0;
|
||||
|
||||
error_handler:
|
||||
((char *)control_url)[request->uri.pathquery.size] = save_char; // restore
|
||||
error_handler:
|
||||
((char *)control_url)[request->uri.pathquery.size] = save_char; /* restore */
|
||||
HandleUnlock();
|
||||
return ret_code;
|
||||
}
|
||||
@ -709,19 +687,18 @@ send_action_response( IN SOCKINFO * info,
|
||||
int ret_code;
|
||||
int timeout_secs = SOAP_TIMEOUT;
|
||||
static char *start_body =
|
||||
// "<?xml version=\"1.0\"?>" required??
|
||||
/*"<?xml version=\"1.0\"?>" required?? */
|
||||
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap."
|
||||
"org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap."
|
||||
"org/soap/encoding/\"><s:Body>\n";
|
||||
static char *end_body = "</s:Body> </s:Envelope>";
|
||||
|
||||
// init
|
||||
/* init */
|
||||
http_CalcResponseVersion( request->major_version,
|
||||
request->minor_version, &major, &minor );
|
||||
membuffer_init( &headers );
|
||||
err_code = UPNP_E_OUTOF_MEMORY; // one error only
|
||||
|
||||
// get xml
|
||||
err_code = UPNP_E_OUTOF_MEMORY; /* one error only */
|
||||
/* get xml */
|
||||
xml_response = ixmlPrintNode( ( IXML_Node * ) action_resp );
|
||||
if( xml_response == NULL ) {
|
||||
goto error_handler;
|
||||
@ -731,20 +708,18 @@ send_action_response( IN SOCKINFO * info,
|
||||
strlen( start_body ) +
|
||||
strlen( xml_response ) +
|
||||
strlen( end_body );
|
||||
|
||||
// make headers
|
||||
/* make headers */
|
||||
if (http_MakeMessage(
|
||||
&headers, major, minor,
|
||||
"RNsDsSXcc",
|
||||
HTTP_OK, // status code
|
||||
HTTP_OK, /* status code */
|
||||
content_length,
|
||||
ContentTypeHeader,
|
||||
"EXT:\r\n",
|
||||
X_USER_AGENT) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
|
||||
// send whole msg
|
||||
/* send whole msg */
|
||||
ret_code = http_SendMessage( info, &timeout_secs, "bbbb",
|
||||
headers.buf, headers.length,
|
||||
start_body, strlen( start_body ),
|
||||
@ -763,7 +738,7 @@ error_handler:
|
||||
ixmlFreeDOMString( xml_response );
|
||||
membuffer_destroy( &headers );
|
||||
if( err_code != 0 ) {
|
||||
// only one type of error to worry about - out of mem
|
||||
/* only one type of error to worry about - out of mem */
|
||||
send_error_response( info, SOAP_ACTION_FAILED, "Out of memory",
|
||||
request );
|
||||
}
|
||||
@ -796,22 +771,22 @@ get_var_name( IN IXML_Document * TempDoc,
|
||||
const DOMString Temp = NULL;
|
||||
int ret_val = -1;
|
||||
|
||||
// Got the Envelop node here
|
||||
/* Got the Envelop node here */
|
||||
EnvpNode = ixmlNode_getFirstChild( ( IXML_Node * ) TempDoc );
|
||||
if( EnvpNode == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// Got Body here
|
||||
/* Got Body here */
|
||||
BodyNode = ixmlNode_getFirstChild( EnvpNode );
|
||||
if( BodyNode == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// Got action node here
|
||||
/* Got action node here */
|
||||
StNode = ixmlNode_getFirstChild( BodyNode );
|
||||
if( StNode == NULL ) {
|
||||
goto error_handler;
|
||||
}
|
||||
//Test whether this is the action node
|
||||
/* Test whether this is the action node */
|
||||
StNodeName = ixmlNode_getNodeName( StNode );
|
||||
if( StNodeName == NULL || strstr( StNodeName,
|
||||
"QueryStateVariable" ) == NULL ) {
|
||||
@ -831,7 +806,7 @@ get_var_name( IN IXML_Document * TempDoc,
|
||||
"Received query for variable name %s\n",
|
||||
VarName );
|
||||
|
||||
ret_val = 0; // success
|
||||
ret_val = 0; /* success */
|
||||
|
||||
error_handler:
|
||||
return ret_val;
|
||||
@ -866,13 +841,13 @@ static UPNP_INLINE void handle_query_variable(
|
||||
const char *err_str;
|
||||
int err_code;
|
||||
|
||||
// get var name
|
||||
/* get var name */
|
||||
if( get_var_name( xml_doc, var_name ) != 0 ) {
|
||||
send_error_response( info, SOAP_INVALID_VAR,
|
||||
Soap_Invalid_Var, request );
|
||||
return;
|
||||
}
|
||||
// get info for event
|
||||
/* get info for event */
|
||||
err_code = get_device_info(
|
||||
request, 1, xml_doc,
|
||||
info->foreign_sockaddr.ss_family,
|
||||
@ -892,13 +867,13 @@ static UPNP_INLINE void handle_query_variable(
|
||||
variable.CurrentVal = NULL;
|
||||
variable.CtrlPtIPAddr = info->foreign_sockaddr;
|
||||
|
||||
// send event
|
||||
/* send event */
|
||||
soap_event_callback( UPNP_CONTROL_GET_VAR_REQUEST, &variable, cookie );
|
||||
|
||||
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
|
||||
"Return from callback for var request\n" );
|
||||
|
||||
// validate, and handle result
|
||||
/* validate, and handle result */
|
||||
if( variable.CurrentVal == NULL ) {
|
||||
err_code = SOAP_ACTION_FAILED;
|
||||
err_str = Soap_Action_Failed;
|
||||
@ -917,7 +892,7 @@ static UPNP_INLINE void handle_query_variable(
|
||||
send_error_response( info, err_code, err_str, request );
|
||||
return;
|
||||
}
|
||||
// send response
|
||||
/* send response */
|
||||
send_var_query_response( info, variable.CurrentVal, request );
|
||||
ixmlFreeDOMString( variable.CurrentVal );
|
||||
|
||||
@ -957,19 +932,19 @@ handle_invoke_action( IN SOCKINFO * info,
|
||||
|
||||
action.ActionResult = NULL;
|
||||
|
||||
// null-terminate
|
||||
/* null-terminate */
|
||||
save_char = action_name.buf[action_name.length];
|
||||
action_name.buf[action_name.length] = '\0';
|
||||
|
||||
// set default error
|
||||
/* set default error */
|
||||
err_code = SOAP_INVALID_ACTION;
|
||||
err_str = Soap_Invalid_Action;
|
||||
|
||||
// get action node
|
||||
/* get action node */
|
||||
if( get_action_node( xml_doc, action_name.buf, &resp_node ) == -1 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// get device info for action event
|
||||
/* get device info for action event */
|
||||
err_code = get_device_info(
|
||||
request,
|
||||
0,
|
||||
@ -1005,22 +980,22 @@ handle_invoke_action( IN SOCKINFO * info,
|
||||
}
|
||||
goto error_handler;
|
||||
}
|
||||
// validate, and handle action error
|
||||
/* validate, and handle action error */
|
||||
if( action.ActionResult == NULL ) {
|
||||
err_code = SOAP_ACTION_FAILED;
|
||||
err_str = Soap_Action_Failed;
|
||||
goto error_handler;
|
||||
}
|
||||
// send response
|
||||
/* send response */
|
||||
send_action_response( info, action.ActionResult, request );
|
||||
|
||||
err_code = 0;
|
||||
|
||||
// error handling and cleanup
|
||||
/* error handling and cleanup */
|
||||
error_handler:
|
||||
ixmlDocument_free( action.ActionResult );
|
||||
ixmlDocument_free( resp_node );
|
||||
action_name.buf[action_name.length] = save_char; // restore
|
||||
action_name.buf[action_name.length] = save_char; /* restore */
|
||||
if( err_code != 0 ) {
|
||||
send_error_response( info, err_code, err_str, request );
|
||||
}
|
||||
@ -1053,19 +1028,19 @@ soap_device_callback( IN http_parser_t * parser,
|
||||
memptr action_name;
|
||||
IXML_Document *xml_doc = NULL;
|
||||
|
||||
// set default error
|
||||
/* set default error */
|
||||
err_code = SOAP_INVALID_ACTION;
|
||||
err_str = Soap_Invalid_Action;
|
||||
|
||||
// validate: content-type == text/xml
|
||||
/* validate: content-type == text/xml */
|
||||
if( !has_xml_content_type( request ) ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// type of request
|
||||
/* type of request */
|
||||
if( get_request_type( request, &action_name ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// parse XML
|
||||
/* parse XML */
|
||||
err_code = ixmlParseBufferEx( request->entity.buf, &xml_doc );
|
||||
if( err_code != IXML_SUCCESS ) {
|
||||
if( err_code == IXML_INSUFFICIENT_MEMORY ) {
|
||||
@ -1079,14 +1054,14 @@ soap_device_callback( IN http_parser_t * parser,
|
||||
}
|
||||
|
||||
if( action_name.length == 0 ) {
|
||||
// query var
|
||||
/* query var */
|
||||
handle_query_variable( info, request, xml_doc );
|
||||
} else {
|
||||
// invoke action
|
||||
/* invoke action */
|
||||
handle_invoke_action( info, request, action_name, xml_doc );
|
||||
}
|
||||
|
||||
err_code = 0; // no error
|
||||
err_code = 0; /* no error */
|
||||
|
||||
error_handler:
|
||||
ixmlDocument_free( xml_doc );
|
||||
@ -1095,6 +1070,7 @@ soap_device_callback( IN http_parser_t * parser,
|
||||
}
|
||||
}
|
||||
|
||||
#endif // EXCLUDE_SOAP
|
||||
#endif /* EXCLUDE_SOAP */
|
||||
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
#endif // INCLUDE_DEVICE_APIS
|
||||
|
@ -29,17 +29,13 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include "upnputil.h"
|
||||
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
#if EXCLUDE_SSDP == 0
|
||||
|
||||
|
||||
#include "httpparser.h"
|
||||
#include "httpreadwrite.h"
|
||||
/*#include "ssdp_ResultData.h"*/
|
||||
@ -50,15 +46,12 @@
|
||||
#include "UpnpInet.h"
|
||||
#include "ThreadPool.h"
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <string.h>
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: send_search_result
|
||||
*
|
||||
@ -107,13 +100,16 @@ void send_search_result(IN void *data)
|
||||
void ssdp_handle_ctrlpt_msg(
|
||||
IN http_message_t *hmsg,
|
||||
IN struct sockaddr *dest_addr,
|
||||
IN xboolean timeout, // only in search reply
|
||||
IN void *cookie) // only in search reply
|
||||
/* only in search reply */
|
||||
IN xboolean timeout,
|
||||
/* only in search reply */
|
||||
IN void *cookie)
|
||||
{
|
||||
int handle;
|
||||
struct Handle_Info *ctrlpt_info = NULL;
|
||||
memptr hdr_value;
|
||||
xboolean is_byebye; // byebye or alive
|
||||
/* byebye or alive */
|
||||
xboolean is_byebye;
|
||||
struct Upnp_Discovery param;
|
||||
SsdpEvent event;
|
||||
xboolean nt_found;
|
||||
@ -129,67 +125,59 @@ void ssdp_handle_ctrlpt_msg(
|
||||
ResultData *threadData = NULL;
|
||||
ThreadPoolJob job;
|
||||
|
||||
// we are assuming that there can be only one client supported at a time
|
||||
|
||||
/* we are assuming that there can be only one client supported at a time */
|
||||
HandleReadLock();
|
||||
|
||||
if ( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
// copy
|
||||
/* copy */
|
||||
ctrlpt_callback = ctrlpt_info->Callback;
|
||||
ctrlpt_cookie = ctrlpt_info->Cookie;
|
||||
HandleUnlock();
|
||||
|
||||
// search timeout
|
||||
/* search timeout */
|
||||
if ( timeout ) {
|
||||
ctrlpt_callback( UPNP_DISCOVERY_SEARCH_TIMEOUT, NULL, cookie );
|
||||
return;
|
||||
}
|
||||
|
||||
param.ErrCode = UPNP_E_SUCCESS;
|
||||
|
||||
// MAX-AGE
|
||||
// assume error
|
||||
/* MAX-AGE, assume error */
|
||||
param.Expires = -1;
|
||||
if ( httpmsg_find_hdr( hmsg, HDR_CACHE_CONTROL, &hdr_value ) != NULL ) {
|
||||
if( matchstr( hdr_value.buf, hdr_value.length,
|
||||
"%imax-age = %d%0", ¶m.Expires ) != PARSE_OK )
|
||||
return;
|
||||
}
|
||||
|
||||
// DATE
|
||||
/* DATE */
|
||||
param.Date[0] = '\0';
|
||||
if ( httpmsg_find_hdr( hmsg, HDR_DATE, &hdr_value ) != NULL ) {
|
||||
linecopylen( param.Date, hdr_value.buf, hdr_value.length );
|
||||
}
|
||||
|
||||
// dest addr
|
||||
/* dest addr */
|
||||
memcpy(¶m.DestAddr, dest_addr, sizeof(struct sockaddr_in) );
|
||||
|
||||
// EXT
|
||||
/* EXT */
|
||||
param.Ext[0] = '\0';
|
||||
if ( httpmsg_find_hdr( hmsg, HDR_EXT, &hdr_value ) != NULL ) {
|
||||
linecopylen( param.Ext, hdr_value.buf, hdr_value.length );
|
||||
}
|
||||
// LOCATION
|
||||
/* LOCATION */
|
||||
param.Location[0] = '\0';
|
||||
if ( httpmsg_find_hdr( hmsg, HDR_LOCATION, &hdr_value ) != NULL ) {
|
||||
linecopylen( param.Location, hdr_value.buf, hdr_value.length );
|
||||
}
|
||||
// SERVER / USER-AGENT
|
||||
/* SERVER / USER-AGENT */
|
||||
param.Os[0] = '\0';
|
||||
if ( httpmsg_find_hdr( hmsg, HDR_SERVER, &hdr_value ) != NULL ||
|
||||
httpmsg_find_hdr( hmsg, HDR_USER_AGENT, &hdr_value ) != NULL ) {
|
||||
linecopylen( param.Os, hdr_value.buf, hdr_value.length );
|
||||
}
|
||||
// clear everything
|
||||
/* clear everything */
|
||||
param.DeviceId[0] = '\0';
|
||||
param.DeviceType[0] = '\0';
|
||||
param.ServiceType[0] = '\0';
|
||||
|
||||
param.ServiceVer[0] = '\0'; // not used; version is in ServiceType
|
||||
/* not used; version is in ServiceType */
|
||||
param.ServiceVer[0] = '\0';
|
||||
|
||||
event.UDN[0] = '\0';
|
||||
event.DeviceType[0] = '\0';
|
||||
@ -218,44 +206,44 @@ void ssdp_handle_ctrlpt_msg(
|
||||
strcpy( param.ServiceType, event.ServiceType );
|
||||
}
|
||||
|
||||
// ADVERT. OR BYEBYE
|
||||
/* ADVERT. OR BYEBYE */
|
||||
if( hmsg->is_request ) {
|
||||
// use NTS hdr to determine advert., or byebye
|
||||
/* use NTS hdr to determine advert., or byebye */
|
||||
if ( httpmsg_find_hdr( hmsg, HDR_NTS, &hdr_value ) == NULL ) {
|
||||
return; // error; NTS header not found
|
||||
return; /* error; NTS header not found */
|
||||
}
|
||||
if ( memptr_cmp( &hdr_value, "ssdp:alive" ) == 0 ) {
|
||||
is_byebye = FALSE;
|
||||
} else if( memptr_cmp( &hdr_value, "ssdp:byebye" ) == 0 ) {
|
||||
is_byebye = TRUE;
|
||||
} else {
|
||||
return; // bad value
|
||||
return; /* bad value */
|
||||
}
|
||||
|
||||
if ( is_byebye ) {
|
||||
// check device byebye
|
||||
/* check device byebye */
|
||||
if( !nt_found || !usn_found ) {
|
||||
return; // bad byebye
|
||||
return; /* bad byebye */
|
||||
}
|
||||
event_type = UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE;
|
||||
} else {
|
||||
// check advertisement
|
||||
// .Expires is valid if positive. This is for testing
|
||||
// only. Expires should be greater than 1800 (30 mins)
|
||||
/* check advertisement.
|
||||
* Expires is valid if positive. This is for testing
|
||||
* only. Expires should be greater than 1800 (30 mins) */
|
||||
if( !nt_found ||
|
||||
!usn_found ||
|
||||
strlen( param.Location ) == 0 || param.Expires <= 0 ) {
|
||||
return; // bad advertisement
|
||||
return; /* bad advertisement */
|
||||
}
|
||||
event_type = UPNP_DISCOVERY_ADVERTISEMENT_ALIVE;
|
||||
}
|
||||
|
||||
// call callback
|
||||
/* call callback */
|
||||
ctrlpt_callback( event_type, ¶m, ctrlpt_cookie );
|
||||
|
||||
} else // reply (to a SEARCH)
|
||||
{
|
||||
// only checking to see if there is a valid ST header
|
||||
} else {
|
||||
/* reply (to a SEARCH) */
|
||||
/* only checking to see if there is a valid ST header */
|
||||
st_found = FALSE;
|
||||
if( httpmsg_find_hdr( hmsg, HDR_ST, &hdr_value ) != NULL ) {
|
||||
save_char = hdr_value.buf[hdr_value.length];
|
||||
@ -266,9 +254,9 @@ void ssdp_handle_ctrlpt_msg(
|
||||
if( hmsg->status_code != HTTP_OK ||
|
||||
param.Expires <= 0 ||
|
||||
strlen( param.Location ) == 0 || !usn_found || !st_found ) {
|
||||
return; // bad reply
|
||||
return; /* bad reply */
|
||||
}
|
||||
// check each current search
|
||||
/* check each current search */
|
||||
HandleLock();
|
||||
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
||||
HandleUnlock();
|
||||
@ -276,14 +264,14 @@ void ssdp_handle_ctrlpt_msg(
|
||||
}
|
||||
node = ListHead( &ctrlpt_info->SsdpSearchList );
|
||||
|
||||
// temporary add null termination
|
||||
//save_char = hdr_value.buf[ hdr_value.length ];
|
||||
//hdr_value.buf[ hdr_value.length ] = '\0';
|
||||
/* temporary add null termination */
|
||||
/*save_char = hdr_value.buf[ hdr_value.length ]; */
|
||||
/*hdr_value.buf[ hdr_value.length ] = '\0'; */
|
||||
|
||||
while( node != NULL ) {
|
||||
searchArg = node->item;
|
||||
matched = 0;
|
||||
// check for match of ST header and search target
|
||||
/* check for match of ST header and search target */
|
||||
switch ( searchArg->requestType ) {
|
||||
case SSDP_ALL:
|
||||
matched = 1;
|
||||
@ -317,7 +305,7 @@ void ssdp_handle_ctrlpt_msg(
|
||||
}
|
||||
|
||||
if (matched) {
|
||||
// schedule call back
|
||||
/* schedule call back*/
|
||||
threadData =
|
||||
( ResultData * ) malloc( sizeof( ResultData ) );
|
||||
if (threadData != NULL) {
|
||||
@ -335,7 +323,7 @@ void ssdp_handle_ctrlpt_msg(
|
||||
}
|
||||
|
||||
HandleUnlock();
|
||||
//ctrlpt_callback( UPNP_DISCOVERY_SEARCH_RESULT, ¶m, cookie );
|
||||
/*ctrlpt_callback( UPNP_DISCOVERY_SEARCH_RESULT, ¶m, cookie );*/
|
||||
}
|
||||
}
|
||||
|
||||
@ -428,15 +416,14 @@ static void CreateClientRequestPacketUlaGua(
|
||||
* Returns: void
|
||||
*
|
||||
***************************************************************************/
|
||||
void
|
||||
searchExpired( void *arg )
|
||||
void searchExpired(void *arg)
|
||||
{
|
||||
|
||||
int *id = ( int * )arg;
|
||||
int *id = (int *)arg;
|
||||
int handle = -1;
|
||||
struct Handle_Info *ctrlpt_info = NULL;
|
||||
|
||||
//remove search Target from list and call client back
|
||||
/* remove search Target from list and call client back */
|
||||
ListNode *node = NULL;
|
||||
SsdpSearchArg *item;
|
||||
Upnp_FunPtr ctrlpt_callback;
|
||||
@ -445,18 +432,14 @@ searchExpired( void *arg )
|
||||
|
||||
HandleLock();
|
||||
|
||||
//remove search target from search list
|
||||
|
||||
/* remove search target from search list */
|
||||
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
||||
free( id );
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
|
||||
ctrlpt_callback = ctrlpt_info->Callback;
|
||||
|
||||
node = ListHead( &ctrlpt_info->SsdpSearchList );
|
||||
|
||||
while( node != NULL ) {
|
||||
item = ( SsdpSearchArg * ) node->item;
|
||||
if( item->timeoutEventId == ( *id ) ) {
|
||||
@ -528,7 +511,7 @@ int SearchByTarget(
|
||||
unsigned long addrv4 = inet_addr(gIF_IPV4);
|
||||
int max_fd = 0;
|
||||
|
||||
//ThreadData *ThData;
|
||||
/*ThreadData *ThData;*/
|
||||
ThreadPoolJob job;
|
||||
|
||||
requestType = ssdp_request_type1(St);
|
||||
@ -644,7 +627,7 @@ int SearchByTarget(
|
||||
imillisleep(SSDP_PAUSE);
|
||||
}
|
||||
}
|
||||
#endif //IPv6
|
||||
#endif /* IPv6 */
|
||||
|
||||
if (gSsdpReqSocket4 != INVALID_SOCKET &&
|
||||
FD_ISSET(gSsdpReqSocket4, &wrSet)) {
|
||||
@ -665,5 +648,6 @@ int SearchByTarget(
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif // EXCLUDE_SSDP
|
||||
#endif // INCLUDE_CLIENT_APIS
|
||||
#endif /* EXCLUDE_SSDP */
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
|
||||
|
@ -120,34 +120,38 @@ void ssdp_handle_device_request(
|
||||
int replyTime;
|
||||
int maxAge;
|
||||
|
||||
// check man hdr
|
||||
/* check man hdr. */
|
||||
if( httpmsg_find_hdr( hmsg, HDR_MAN, &hdr_value ) == NULL ||
|
||||
memptr_cmp( &hdr_value, "\"ssdp:discover\"" ) != 0 ) {
|
||||
return; // bad or missing hdr
|
||||
/* bad or missing hdr. */
|
||||
return;
|
||||
}
|
||||
// MX header
|
||||
/* MX header. */
|
||||
if( httpmsg_find_hdr( hmsg, HDR_MX, &hdr_value ) == NULL ||
|
||||
( mx = raw_to_int( &hdr_value, 10 ) ) < 0 ) {
|
||||
return;
|
||||
}
|
||||
// ST header
|
||||
/* ST header. */
|
||||
if( httpmsg_find_hdr( hmsg, HDR_ST, &hdr_value ) == NULL ) {
|
||||
return;
|
||||
}
|
||||
save_char = hdr_value.buf[hdr_value.length];
|
||||
hdr_value.buf[hdr_value.length] = '\0';
|
||||
ret_code = ssdp_request_type( hdr_value.buf, &event );
|
||||
hdr_value.buf[hdr_value.length] = save_char; // restore
|
||||
/* restore. */
|
||||
hdr_value.buf[hdr_value.length] = save_char;
|
||||
if( ret_code == -1 ) {
|
||||
return; // bad ST header
|
||||
/* bad ST header. */
|
||||
return;
|
||||
}
|
||||
|
||||
HandleLock();
|
||||
// device info
|
||||
/* device info. */
|
||||
if( GetDeviceHandleInfo( dest_addr->sa_family,
|
||||
&handle, &dev_info ) != HND_DEVICE ) {
|
||||
HandleUnlock();
|
||||
return; // no info found
|
||||
/* no info found. */
|
||||
return;
|
||||
}
|
||||
maxAge = dev_info->MaxAge;
|
||||
HandleUnlock();
|
||||
@ -180,11 +184,9 @@ void ssdp_handle_device_request(
|
||||
TPJobInit( &job, advertiseAndReplyThread, threadArg );
|
||||
TPJobSetFreeFunction( &job, ( free_routine ) free );
|
||||
|
||||
//Subtract a percentage from the mx
|
||||
//to allow for network and processing delays
|
||||
// (i.e. if search is for 30 seconds,
|
||||
// respond withing 0 - 27 seconds)
|
||||
|
||||
/* Subtract a percentage from the mx to allow for network and processing
|
||||
* delays (i.e. if search is for 30 seconds, respond
|
||||
* within 0 - 27 seconds). */
|
||||
if( mx >= 2 ) {
|
||||
mx -= MAXVAL( 1, mx / MX_FUDGE_FACTOR );
|
||||
}
|
||||
@ -225,7 +227,8 @@ NewRequestHandler( IN struct sockaddr *DestAddr,
|
||||
int socklen = sizeof( struct sockaddr_storage );
|
||||
int Index;
|
||||
unsigned long replyAddr = inet_addr( gIF_IPV4 );
|
||||
int ttl = 4; // a/c to UPNP Spec
|
||||
/* a/c to UPNP Spec */
|
||||
int ttl = 4;
|
||||
int hops = 1;
|
||||
char buf_ntop[64];
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
@ -480,7 +483,7 @@ DeviceAdvertisement( IN char *DevType,
|
||||
struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss;
|
||||
struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss;
|
||||
|
||||
//char Mil_Nt[LINE_SIZE]
|
||||
/* char Mil_Nt[LINE_SIZE] */
|
||||
char Mil_Usn[LINE_SIZE];
|
||||
char *msgs[3];
|
||||
int ret_code = UPNP_E_SUCCESS;
|
||||
@ -509,24 +512,20 @@ DeviceAdvertisement( IN char *DevType,
|
||||
msgs[1] = NULL;
|
||||
msgs[2] = NULL;
|
||||
|
||||
//If deviceis a root device , here we need to
|
||||
//send 3 advertisement or reply
|
||||
/* If deviceis a root device , here we need to send 3 advertisement
|
||||
* or reply */
|
||||
if( RootDev ) {
|
||||
sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn );
|
||||
CreateServicePacket( MSGTYPE_ADVERTISEMENT, "upnp:rootdevice",
|
||||
Mil_Usn, Location, Duration, &msgs[0], AddressFamily );
|
||||
}
|
||||
// both root and sub-devices need to send these two messages
|
||||
//
|
||||
|
||||
/* both root and sub-devices need to send these two messages */
|
||||
CreateServicePacket( MSGTYPE_ADVERTISEMENT, Udn, Udn,
|
||||
Location, Duration, &msgs[1], AddressFamily );
|
||||
|
||||
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
|
||||
CreateServicePacket( MSGTYPE_ADVERTISEMENT, DevType, Mil_Usn,
|
||||
Location, Duration, &msgs[2], AddressFamily );
|
||||
|
||||
// check error
|
||||
/* check error */
|
||||
if( ( RootDev && msgs[0] == NULL ) ||
|
||||
msgs[1] == NULL || msgs[2] == NULL ) {
|
||||
free( msgs[0] );
|
||||
@ -534,17 +533,17 @@ DeviceAdvertisement( IN char *DevType,
|
||||
free( msgs[2] );
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
// send packets
|
||||
/* send packets */
|
||||
if( RootDev ) {
|
||||
// send 3 msg types
|
||||
/* send 3 msg types */
|
||||
ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 3, &msgs[0] );
|
||||
} else // sub-device
|
||||
} else /* sub-device */
|
||||
{
|
||||
// send 2 msg types
|
||||
/* send 2 msg types */
|
||||
ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 2, &msgs[1] );
|
||||
}
|
||||
|
||||
// free msgs
|
||||
/* free msgs */
|
||||
free( msgs[0] );
|
||||
free( msgs[1] );
|
||||
free( msgs[2] );
|
||||
@ -590,17 +589,17 @@ SendReply( IN struct sockaddr *DestAddr,
|
||||
msgs[1] = NULL;
|
||||
|
||||
if( RootDev ) {
|
||||
// one msg for root device
|
||||
/* one msg for root device */
|
||||
num_msgs = 1;
|
||||
|
||||
sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn );
|
||||
CreateServicePacket( MSGTYPE_REPLY, "upnp:rootdevice",
|
||||
Mil_Usn, Location, Duration, &msgs[0], DestAddr->sa_family );
|
||||
} else {
|
||||
// two msgs for embedded devices
|
||||
/* two msgs for embedded devices */
|
||||
num_msgs = 1;
|
||||
|
||||
//NK: FIX for extra response when someone searches by udn
|
||||
/*NK: FIX for extra response when someone searches by udn */
|
||||
if( !ByType ) {
|
||||
CreateServicePacket( MSGTYPE_REPLY, Udn, Udn, Location,
|
||||
Duration, &msgs[0], DestAddr->sa_family );
|
||||
@ -611,7 +610,7 @@ SendReply( IN struct sockaddr *DestAddr,
|
||||
}
|
||||
}
|
||||
|
||||
// check error
|
||||
/* check error */
|
||||
for( i = 0; i < num_msgs; i++ ) {
|
||||
if( msgs[i] == NULL ) {
|
||||
free( msgs[0] );
|
||||
@ -619,7 +618,7 @@ SendReply( IN struct sockaddr *DestAddr,
|
||||
}
|
||||
}
|
||||
|
||||
// send msgs
|
||||
/* send msgs */
|
||||
ret_code = NewRequestHandler( DestAddr, num_msgs, msgs );
|
||||
for( i = 0; i < num_msgs; i++ ) {
|
||||
if( msgs[i] != NULL )
|
||||
@ -663,28 +662,23 @@ DeviceReply( IN struct sockaddr *DestAddr,
|
||||
szReq[1] = NULL;
|
||||
szReq[2] = NULL;
|
||||
|
||||
// create 2 or 3 msgs
|
||||
|
||||
/* create 2 or 3 msgs */
|
||||
if( RootDev ) {
|
||||
// 3 replies for root device
|
||||
/* 3 replies for root device */
|
||||
strcpy( Mil_Nt, "upnp:rootdevice" );
|
||||
sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn );
|
||||
CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
|
||||
Location, Duration, &szReq[0], DestAddr->sa_family );
|
||||
}
|
||||
|
||||
sprintf( Mil_Nt, "%s", Udn );
|
||||
sprintf( Mil_Usn, "%s", Udn );
|
||||
CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
|
||||
Location, Duration, &szReq[1], DestAddr->sa_family );
|
||||
|
||||
sprintf( Mil_Nt, "%s", DevType );
|
||||
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
|
||||
CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
|
||||
Location, Duration, &szReq[2], DestAddr->sa_family );
|
||||
|
||||
// check error
|
||||
|
||||
/* check error */
|
||||
if( ( RootDev && szReq[0] == NULL ) ||
|
||||
szReq[1] == NULL || szReq[2] == NULL ) {
|
||||
free( szReq[0] );
|
||||
@ -692,14 +686,13 @@ DeviceReply( IN struct sockaddr *DestAddr,
|
||||
free( szReq[2] );
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
// send replies
|
||||
/* send replies */
|
||||
if( RootDev ) {
|
||||
RetVal = NewRequestHandler( DestAddr, 3, szReq );
|
||||
} else {
|
||||
RetVal = NewRequestHandler( DestAddr, 2, &szReq[1] );
|
||||
}
|
||||
|
||||
// free
|
||||
/* free */
|
||||
free( szReq[0] );
|
||||
free( szReq[1] );
|
||||
free( szReq[2] );
|
||||
@ -756,8 +749,8 @@ ServiceAdvertisement( IN char *Udn,
|
||||
|
||||
sprintf( Mil_Usn, "%s::%s", Udn, ServType );
|
||||
|
||||
//CreateServiceRequestPacket(1,szReq[0],Mil_Nt,Mil_Usn,
|
||||
//Server,Location,Duration);
|
||||
/* CreateServiceRequestPacket(1,szReq[0],Mil_Nt,Mil_Usn,
|
||||
* Server,Location,Duration); */
|
||||
CreateServicePacket( MSGTYPE_ADVERTISEMENT, ServType, Mil_Usn,
|
||||
Location, Duration, &szReq[0], AddressFamily );
|
||||
if( szReq[0] == NULL ) {
|
||||
@ -860,10 +853,10 @@ ServiceShutdown( IN char *Udn,
|
||||
"Invalid device address family.\n" );
|
||||
}
|
||||
|
||||
//sprintf(Mil_Nt,"%s",ServType);
|
||||
/* sprintf(Mil_Nt,"%s",ServType); */
|
||||
sprintf( Mil_Usn, "%s::%s", Udn, ServType );
|
||||
//CreateServiceRequestPacket(0,szReq[0],Mil_Nt,Mil_Usn,
|
||||
//Server,Location,Duration);
|
||||
/* CreateServiceRequestPacket(0,szReq[0],Mil_Nt,Mil_Usn,
|
||||
* Server,Location,Duration); */
|
||||
CreateServicePacket( MSGTYPE_SHUTDOWN, ServType, Mil_Usn,
|
||||
Location, Duration, &szReq[0], AddressFamily );
|
||||
if( szReq[0] == NULL ) {
|
||||
@ -929,25 +922,21 @@ DeviceShutdown( IN char *DevType,
|
||||
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
|
||||
"Invalid device address family.\n" );
|
||||
}
|
||||
|
||||
// root device has one extra msg
|
||||
/* root device has one extra msg */
|
||||
if( RootDev ) {
|
||||
sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn );
|
||||
CreateServicePacket( MSGTYPE_SHUTDOWN, "upnp:rootdevice",
|
||||
Mil_Usn, Location, Duration, &msgs[0], AddressFamily );
|
||||
}
|
||||
|
||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||
"In function DeviceShutdown\n" );
|
||||
// both root and sub-devices need to send these two messages
|
||||
/* both root and sub-devices need to send these two messages */
|
||||
CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn,
|
||||
Location, Duration, &msgs[1], AddressFamily );
|
||||
|
||||
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
|
||||
CreateServicePacket( MSGTYPE_SHUTDOWN, DevType, Mil_Usn,
|
||||
Location, Duration, &msgs[2], AddressFamily );
|
||||
|
||||
// check error
|
||||
/* check error */
|
||||
if( ( RootDev && msgs[0] == NULL ) ||
|
||||
msgs[1] == NULL || msgs[2] == NULL ) {
|
||||
free( msgs[0] );
|
||||
@ -955,17 +944,16 @@ DeviceShutdown( IN char *DevType,
|
||||
free( msgs[2] );
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
// send packets
|
||||
/* send packets */
|
||||
if( RootDev ) {
|
||||
// send 3 msg types
|
||||
/* send 3 msg types */
|
||||
ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 3, &msgs[0] );
|
||||
} else // sub-device
|
||||
{
|
||||
// send 2 msg types
|
||||
} else {
|
||||
/* sub-device */
|
||||
/* send 2 msg types */
|
||||
ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 2, &msgs[1] );
|
||||
}
|
||||
|
||||
// free msgs
|
||||
/* free msgs */
|
||||
free( msgs[0] );
|
||||
free( msgs[1] );
|
||||
free( msgs[2] );
|
||||
@ -973,6 +961,6 @@ DeviceShutdown( IN char *DevType,
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
#endif // EXCLUDE_SSDP
|
||||
#endif // INCLUDE_DEVICE_APIS
|
||||
#endif /* EXCLUDE_SSDP */
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
|
@ -595,11 +595,9 @@ ssdp_request_type1( IN char *cmd )
|
||||
* Returns: int
|
||||
* 0 on success; -1 on error
|
||||
***************************************************************************/
|
||||
int
|
||||
ssdp_request_type( IN char *cmd,
|
||||
OUT SsdpEvent * Evt )
|
||||
int ssdp_request_type(IN char *cmd, OUT SsdpEvent *Evt)
|
||||
{
|
||||
// clear event
|
||||
/* clear event */
|
||||
memset( Evt, 0, sizeof( SsdpEvent ) );
|
||||
unique_service_name( cmd, Evt );
|
||||
Evt->ErrCode = NO_ERROR_FOUND;
|
||||
@ -624,15 +622,13 @@ ssdp_request_type( IN char *cmd,
|
||||
* Returns: VOID
|
||||
*
|
||||
***************************************************************************/
|
||||
static void
|
||||
free_ssdp_event_handler_data( void *the_data )
|
||||
static void free_ssdp_event_handler_data(void *the_data)
|
||||
{
|
||||
ssdp_thread_data *data = ( ssdp_thread_data * ) the_data;
|
||||
|
||||
if( data != NULL ) {
|
||||
http_message_t *hmsg = &data->parser.msg;
|
||||
|
||||
// free data
|
||||
/* free data */
|
||||
httpmsg_destroy( hmsg );
|
||||
free( data );
|
||||
}
|
||||
@ -653,7 +649,7 @@ free_ssdp_event_handler_data( void *the_data )
|
||||
***************************************************************************/
|
||||
static UPNP_INLINE xboolean valid_ssdp_msg(IN http_message_t *hmsg)
|
||||
{
|
||||
memptr hdr_value;
|
||||
memptr hdr_value;
|
||||
|
||||
/* check for valid methods - NOTIFY or M-SEARCH */
|
||||
if (hmsg->method != HTTPMETHOD_NOTIFY &&
|
||||
@ -699,8 +695,7 @@ static UPNP_INLINE xboolean valid_ssdp_msg(IN http_message_t *hmsg)
|
||||
* Returns: int
|
||||
* 0 if successful -1 if error
|
||||
***************************************************************************/
|
||||
static UPNP_INLINE int
|
||||
start_event_handler( void *Data )
|
||||
static UPNP_INLINE int start_event_handler(void *Data)
|
||||
{
|
||||
|
||||
http_parser_t *parser = NULL;
|
||||
@ -716,23 +711,23 @@ start_event_handler( void *Data )
|
||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||
"SSDP recvd bad msg code = %d\n",
|
||||
status );
|
||||
// ignore bad msg, or not enuf mem
|
||||
/* ignore bad msg, or not enuf mem */
|
||||
goto error_handler;
|
||||
}
|
||||
// valid notify msg
|
||||
/* valid notify msg */
|
||||
} else if( status != PARSE_SUCCESS ) {
|
||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||
"SSDP recvd bad msg code = %d\n", status );
|
||||
|
||||
goto error_handler;
|
||||
}
|
||||
// check msg
|
||||
/* check msg */
|
||||
if( valid_ssdp_msg( &parser->msg ) != TRUE ) {
|
||||
goto error_handler;
|
||||
}
|
||||
return 0; //////// done; thread will free 'data'
|
||||
return 0; /* done; thread will free 'data' */
|
||||
|
||||
error_handler:
|
||||
error_handler:
|
||||
free_ssdp_event_handler_data( data );
|
||||
return -1;
|
||||
}
|
||||
@ -798,16 +793,13 @@ readFromSSDPSocket( SOCKET socket )
|
||||
|
||||
requestBuf = staticBuf;
|
||||
|
||||
//in case memory
|
||||
//can't be allocated, still drain the
|
||||
//socket using a static buffer
|
||||
|
||||
/* in case memory can't be allocated, still drain the socket using a
|
||||
* static buffer. */
|
||||
data = ( ssdp_thread_data * )
|
||||
malloc( sizeof( ssdp_thread_data ) );
|
||||
|
||||
if( data != NULL ) {
|
||||
//initialize parser
|
||||
|
||||
/* initialize parser */
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
#ifdef UPNP_ENABLE_IPV6
|
||||
if( socket == gSsdpReqSocket4 || socket == gSsdpReqSocket6 ) {
|
||||
@ -826,11 +818,9 @@ readFromSSDPSocket( SOCKET socket )
|
||||
#else
|
||||
parser_request_init( &data->parser );
|
||||
#endif
|
||||
|
||||
//set size of parser buffer
|
||||
|
||||
/* set size of parser buffer */
|
||||
if( membuffer_set_size( &data->parser.msg.msg, BUFSIZE ) == 0 ) {
|
||||
//use this as the buffer for recv
|
||||
/* use this as the buffer for recv */
|
||||
requestBuf = data->parser.msg.msg.buf;
|
||||
|
||||
} else {
|
||||
@ -867,10 +857,10 @@ readFromSSDPSocket( SOCKET socket )
|
||||
"%s\n"
|
||||
"End of received multicast packet ----------------------------------------------\n",
|
||||
requestBuf );
|
||||
//add thread pool job to handle request
|
||||
/* add thread pool job to handle request */
|
||||
if( data != NULL ) {
|
||||
data->parser.msg.msg.length += byteReceived;
|
||||
// null-terminate
|
||||
/* null-terminate */
|
||||
data->parser.msg.msg.buf[byteReceived] = 0;
|
||||
memcpy( &data->dest_addr, &__ss, sizeof(__ss) );
|
||||
TPJobInit( &job, ( start_routine )
|
||||
@ -935,7 +925,7 @@ int get_ssdp_sockets(MiniServerSockArray *out)
|
||||
} else {
|
||||
out->ssdpReqSock6 = INVALID_SOCKET;
|
||||
}
|
||||
#endif //IPv6
|
||||
#endif /* IPv6 */
|
||||
|
||||
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
@ -993,8 +983,7 @@ int get_ssdp_sockets(MiniServerSockArray *out)
|
||||
} else {
|
||||
out->ssdpSock6UlaGua = INVALID_SOCKET;
|
||||
}
|
||||
#endif //IPv6
|
||||
|
||||
#endif /* IPv6 */
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
@ -1030,7 +1019,7 @@ int create_ssdp_sock_reqv4( SOCKET* ssdpReqSock )
|
||||
setsockopt( *ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL,
|
||||
&ttl, sizeof (ttl) );
|
||||
|
||||
// just do it, regardless if fails or not.
|
||||
/* just do it, regardless if fails or not. */
|
||||
Make_Socket_NoBlocking( *ssdpReqSock );
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
@ -1064,18 +1053,18 @@ int create_ssdp_sock_reqv6( SOCKET* ssdpReqSock )
|
||||
return UPNP_E_OUTOF_SOCKET;
|
||||
}
|
||||
|
||||
// MUST use scoping of IPv6 addresses to control the propagation os SSDP
|
||||
// messages instead of relying on the Hop Limit (Equivalent to the TTL
|
||||
// limit in IPv4).
|
||||
/* MUST use scoping of IPv6 addresses to control the propagation os SSDP
|
||||
* messages instead of relying on the Hop Limit (Equivalent to the TTL
|
||||
* limit in IPv4). */
|
||||
setsockopt( *ssdpReqSock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
|
||||
&hops, sizeof(hops) );
|
||||
|
||||
// just do it, regardless if fails or not.
|
||||
/* just do it, regardless if fails or not. */
|
||||
Make_Socket_NoBlocking( *ssdpReqSock );
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
#endif // IPv6
|
||||
#endif /* IPv6 */
|
||||
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
|
||||
@ -1317,7 +1306,7 @@ int create_ssdp_sock_v6( SOCKET* ssdpSock )
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
#endif // IPv6
|
||||
#endif /* IPv6 */
|
||||
|
||||
/************************************************************************
|
||||
* Function : create_ssdp_sock_v6_ula_gua
|
||||
@ -1429,7 +1418,7 @@ int create_ssdp_sock_v6_ula_gua(SOCKET *ssdpSock)
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
#endif //IPv6
|
||||
#endif /* IPv6 */
|
||||
|
||||
#endif /* EXCLUDE_SSDP */
|
||||
|
||||
|
@ -120,15 +120,15 @@ calc_alias( IN const char *alias,
|
||||
assert( rootPath );
|
||||
assert( alias );
|
||||
|
||||
// add / suffix, if missing
|
||||
/* add / suffix, if missing */
|
||||
root_len = strlen( rootPath );
|
||||
if( root_len == 0 || rootPath[root_len - 1] != '/' ) {
|
||||
temp_str = "/";
|
||||
} else {
|
||||
temp_str = ""; // suffix already present
|
||||
temp_str = ""; /* suffix already present */
|
||||
}
|
||||
|
||||
// discard / prefix, if present
|
||||
/* discard / prefix, if present */
|
||||
if( alias[0] == '/' ) {
|
||||
aliasPtr = alias + 1;
|
||||
} else {
|
||||
@ -241,11 +241,11 @@ config_description_doc( INOUT IXML_Document * doc,
|
||||
membuffer_init( &url_str );
|
||||
membuffer_init( &root_path );
|
||||
|
||||
err_code = UPNP_E_OUTOF_MEMORY; // default error
|
||||
err_code = UPNP_E_OUTOF_MEMORY; /* default error */
|
||||
|
||||
baseList = ixmlDocument_getElementsByTagName( doc, urlBaseStr );
|
||||
if( baseList == NULL ) {
|
||||
// urlbase not found -- create new one
|
||||
/* urlbase not found -- create new one */
|
||||
addNew = TRUE;
|
||||
element = ixmlDocument_createElement( doc, urlBaseStr );
|
||||
if( element == NULL ) {
|
||||
@ -284,7 +284,7 @@ config_description_doc( INOUT IXML_Document * doc,
|
||||
}
|
||||
|
||||
} else {
|
||||
// urlbase found
|
||||
/* urlbase found */
|
||||
urlbase_node = ixmlNodeList_item( baseList, 0 );
|
||||
assert( urlbase_node != NULL );
|
||||
|
||||
@ -312,7 +312,7 @@ config_description_doc( INOUT IXML_Document * doc,
|
||||
membuffer_append_str( &url_str, ip_str ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// add leading '/' if missing from relative path
|
||||
/* add leading '/' if missing from relative path */
|
||||
if( ( uri.pathquery.size > 0 && uri.pathquery.buff[0] != '/' ) ||
|
||||
( uri.pathquery.size == 0 )
|
||||
) {
|
||||
@ -328,7 +328,7 @@ config_description_doc( INOUT IXML_Document * doc,
|
||||
uri.pathquery.size ) != 0 ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// add trailing '/' if missing
|
||||
/* add trailing '/' if missing */
|
||||
if( url_str.buf[url_str.length - 1] != '/' ) {
|
||||
if( membuffer_append( &url_str, "/", 1 ) != 0 ) {
|
||||
goto error_handler;
|
||||
@ -341,7 +341,7 @@ config_description_doc( INOUT IXML_Document * doc,
|
||||
}
|
||||
}
|
||||
|
||||
*root_path_str = membuffer_detach( &root_path ); // return path
|
||||
*root_path_str = membuffer_detach( &root_path ); /* return path */
|
||||
err_code = UPNP_E_SUCCESS;
|
||||
|
||||
error_handler:
|
||||
@ -400,27 +400,27 @@ configure_urlbase( INOUT IXML_Document * doc,
|
||||
int err_code;
|
||||
char ipaddr_port[LINE_SIZE];
|
||||
|
||||
err_code = UPNP_E_OUTOF_MEMORY; // default error
|
||||
err_code = UPNP_E_OUTOF_MEMORY; /* default error */
|
||||
|
||||
// get IP address and port
|
||||
/* get IP address and port */
|
||||
addrToString( serverAddr, ipaddr_port );
|
||||
|
||||
// config url-base in 'doc'
|
||||
/* config url-base in 'doc' */
|
||||
err_code = config_description_doc( doc, ipaddr_port, &root_path );
|
||||
if( err_code != UPNP_E_SUCCESS ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// calc alias
|
||||
/* calc alias */
|
||||
err_code = calc_alias( alias, root_path, &new_alias );
|
||||
if( err_code != UPNP_E_SUCCESS ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// calc full url for desc doc
|
||||
/* calc full url for desc doc */
|
||||
err_code = calc_descURL( ipaddr_port, new_alias, docURL );
|
||||
if( err_code != UPNP_E_SUCCESS ) {
|
||||
goto error_handler;
|
||||
}
|
||||
// xml doc to str
|
||||
/* xml doc to str */
|
||||
xml_str = ixmlPrintDocument( doc );
|
||||
if( xml_str == NULL ) {
|
||||
goto error_handler;
|
||||
@ -430,7 +430,7 @@ configure_urlbase( INOUT IXML_Document * doc,
|
||||
"desc url: %s\n", docURL );
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"doc = %s\n", xml_str );
|
||||
// store in web server
|
||||
/* store in web server */
|
||||
err_code =
|
||||
web_server_set_alias( new_alias, xml_str, strlen( xml_str ),
|
||||
last_modified );
|
||||
|
@ -1,31 +1,28 @@
|
||||
/*
|
||||
** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
|
||||
** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
|
||||
** Digital Equipment Corporation, Maynard, Mass.
|
||||
** Copyright (c) 1998 Microsoft.
|
||||
** To anyone who acknowledges that this file is provided "AS IS"
|
||||
** without any express or implied warranty: permission to use, copy,
|
||||
** modify, and distribute this file for any purpose is hereby
|
||||
** granted without fee, provided that the above copyright notices and
|
||||
** this notice appears in all source code copies, and that none of
|
||||
** the names of Open Software Foundation, Inc., Hewlett-Packard
|
||||
** Company, or Digital Equipment Corporation be used in advertising
|
||||
** or publicity pertaining to distribution of the software without
|
||||
** specific, written prior permission. Neither Open Software
|
||||
** Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
|
||||
** Corporation makes any representations about the suitability of
|
||||
** this software for any purpose.
|
||||
* Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
|
||||
* Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
|
||||
* Digital Equipment Corporation, Maynard, Mass.
|
||||
* Copyright (c) 1998 Microsoft.
|
||||
* To anyone who acknowledges that this file is provided "AS IS"
|
||||
* without any express or implied warranty: permission to use, copy,
|
||||
* modify, and distribute this file for any purpose is hereby
|
||||
* granted without fee, provided that the above copyright notices and
|
||||
* this notice appears in all source code copies, and that none of
|
||||
* the names of Open Software Foundation, Inc., Hewlett-Packard
|
||||
* Company, or Digital Equipment Corporation be used in advertising
|
||||
* or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. Neither Open Software
|
||||
* Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
|
||||
* Corporation makes any representations about the suitability of
|
||||
* this software for any purpose.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
|
||||
|
||||
#include "UpnpInet.h"
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@ -74,9 +71,9 @@ get_system_time( uuid_time_t * uuid_time )
|
||||
+ 18 years and 5 leap days.
|
||||
*/
|
||||
|
||||
time.QuadPart += ( unsigned __int64 )( 1000 * 1000 * 10 ) // seconds
|
||||
* ( unsigned __int64 )( 60 * 60 * 24 ) // days
|
||||
* ( unsigned __int64 )( 17 + 30 + 31 + 365 * 18 + 5 ); // # of days
|
||||
time.QuadPart += ( unsigned __int64 )( 1000 * 1000 * 10 ) /* seconds */
|
||||
* ( unsigned __int64 )( 60 * 60 * 24 ) /* days */
|
||||
* ( unsigned __int64 )( 17 + 30 + 31 + 365 * 18 + 5 ); /* # of days */
|
||||
|
||||
*uuid_time = time.QuadPart;
|
||||
|
||||
@ -146,7 +143,7 @@ get_random_info(unsigned char seed[16])
|
||||
{
|
||||
MD5_CTX c;
|
||||
typedef struct {
|
||||
//struct sysinfo s;
|
||||
/*struct sysinfo s; */
|
||||
struct timeval t;
|
||||
char hostname[257];
|
||||
} randomness;
|
||||
|
Loading…
x
Reference in New Issue
Block a user