📄 ssdp_device.c
字号:
msgs[0] = NULL;
msgs[1] = NULL;
msgs[2] = NULL;
//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] );
}
// both root and sub-devices need to send these two messages
//
CreateServicePacket( MSGTYPE_ADVERTISEMENT, Udn, Udn,
Location, Duration, &msgs[1] );
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
CreateServicePacket( MSGTYPE_ADVERTISEMENT, DevType, Mil_Usn,
Location, Duration, &msgs[2] );
// check error
if( ( RootDev && msgs[0] == NULL ) ||
msgs[1] == NULL || msgs[2] == NULL ) {
free( msgs[0] );
free( msgs[1] );
free( msgs[2] );
return UPNP_E_OUTOF_MEMORY;
}
// send packets
if( RootDev ) {
// send 3 msg types
ret_code = NewRequestHandler( &DestAddr, 3, &msgs[0] );
} else // sub-device
{
// send 2 msg types
ret_code = NewRequestHandler( &DestAddr, 2, &msgs[1] );
}
// free msgs
free( msgs[0] );
free( msgs[1] );
free( msgs[2] );
return ret_code;
}
/************************************************************************
* Function : SendReply
*
* Parameters:
* IN struct sockaddr_in * DestAddr:destination IP address.
* IN char *DevType: Device type
* IN int RootDev: 1 means root device 0 means embedded device.
* IN char * Udn: Device UDN
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
* IN int ByType:
*
* Description:
* This function creates the reply packet based on the input parameter,
* and send it to the client addesss given in its input parameter DestAddr.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int
SendReply( IN struct sockaddr_in *DestAddr,
IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *Location,
IN int Duration,
IN int ByType )
{
int ret_code;
char *msgs[2];
int num_msgs;
char Mil_Usn[LINE_SIZE];
int i;
msgs[0] = NULL;
msgs[1] = NULL;
if( RootDev ) {
// 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] );
} else {
// two msgs for embedded devices
num_msgs = 1;
//NK: FIX for extra response when someone searches by udn
if( !ByType ) {
CreateServicePacket( MSGTYPE_REPLY, Udn, Udn, Location,
Duration, &msgs[0] );
} else {
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
CreateServicePacket( MSGTYPE_REPLY, DevType, Mil_Usn,
Location, Duration, &msgs[0] );
}
}
// check error
for( i = 0; i < num_msgs; i++ ) {
if( msgs[i] == NULL ) {
free( msgs[0] );
return UPNP_E_OUTOF_MEMORY;
}
}
// send msgs
ret_code = NewRequestHandler( DestAddr, num_msgs, msgs );
for( i = 0; i < num_msgs; i++ ) {
if( msgs[i] != NULL )
free( msgs[i] );
}
return ret_code;
}
/************************************************************************
* Function : DeviceReply
*
* Parameters:
* IN struct sockaddr_in * DestAddr:destination IP address.
* IN char *DevType: Device type
* IN int RootDev: 1 means root device 0 means embedded device.
* IN char * Udn: Device UDN
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
* Description:
* This function creates the reply packet based on the input parameter,
* and send it to the client address given in its input parameter DestAddr.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int
DeviceReply( IN struct sockaddr_in *DestAddr,
IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *Location,
IN int Duration )
{
char *szReq[3],
Mil_Nt[LINE_SIZE],
Mil_Usn[LINE_SIZE];
int RetVal;
szReq[0] = NULL;
szReq[1] = NULL;
szReq[2] = NULL;
// create 2 or 3 msgs
if( RootDev ) {
// 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] );
}
sprintf( Mil_Nt, "%s", Udn );
sprintf( Mil_Usn, "%s", Udn );
CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
Location, Duration, &szReq[1] );
sprintf( Mil_Nt, "%s", DevType );
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn,
Location, Duration, &szReq[2] );
// check error
if( ( RootDev && szReq[0] == NULL ) ||
szReq[1] == NULL || szReq[2] == NULL ) {
free( szReq[0] );
free( szReq[1] );
free( szReq[2] );
return UPNP_E_OUTOF_MEMORY;
}
// send replies
if( RootDev ) {
RetVal = NewRequestHandler( DestAddr, 3, szReq );
} else {
RetVal = NewRequestHandler( DestAddr, 2, &szReq[1] );
}
// free
free( szReq[0] );
free( szReq[1] );
free( szReq[2] );
return RetVal;
}
/************************************************************************
* Function : ServiceAdvertisement
*
* Parameters:
* IN char * Udn: Device UDN
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int
ServiceAdvertisement( IN char *Udn,
IN char *ServType,
IN char *Location,
IN int Duration )
{
char Mil_Usn[LINE_SIZE];
char *szReq[1];
struct sockaddr_in DestAddr;
int RetVal;
DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );
DestAddr.sin_port = htons( SSDP_PORT );
sprintf( Mil_Usn, "%s::%s", Udn, ServType );
//CreateServiceRequestPacket(1,szReq[0],Mil_Nt,Mil_Usn,
//Server,Location,Duration);
CreateServicePacket( MSGTYPE_ADVERTISEMENT, ServType, Mil_Usn,
Location, Duration, &szReq[0] );
if( szReq[0] == NULL ) {
return UPNP_E_OUTOF_MEMORY;
}
RetVal = NewRequestHandler( &DestAddr, 1, szReq );
free( szReq[0] );
return RetVal;
}
/************************************************************************
* Function : ServiceReply
*
* Parameters:
* IN struct sockaddr_in *DestAddr:
* IN char * Udn: Device UDN
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int
ServiceReply( IN struct sockaddr_in *DestAddr,
IN char *ServType,
IN char *Udn,
IN char *Location,
IN int Duration )
{
char Mil_Usn[LINE_SIZE];
char *szReq[1];
int RetVal;
szReq[0] = NULL;
sprintf( Mil_Usn, "%s::%s", Udn, ServType );
CreateServicePacket( MSGTYPE_REPLY, ServType, Mil_Usn,
Location, Duration, &szReq[0] );
if( szReq[0] == NULL ) {
return UPNP_E_OUTOF_MEMORY;
}
RetVal = NewRequestHandler( DestAddr, 1, szReq );
free( szReq[0] );
return RetVal;
}
/************************************************************************
* Function : ServiceShutdown
*
* Parameters:
* IN char * Udn: Device UDN
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Service duration in sec.
* Description:
* This function creates a HTTP service shutdown request packet
* and sent it to the multicast channel through RequestHandler.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int
ServiceShutdown( IN char *Udn,
IN char *ServType,
IN char *Location,
IN int Duration )
{
char Mil_Usn[LINE_SIZE];
char *szReq[1];
struct sockaddr_in DestAddr;
int RetVal;
DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );
DestAddr.sin_port = htons( SSDP_PORT );
//sprintf(Mil_Nt,"%s",ServType);
sprintf( Mil_Usn, "%s::%s", Udn, ServType );
//CreateServiceRequestPacket(0,szReq[0],Mil_Nt,Mil_Usn,
//Server,Location,Duration);
CreateServicePacket( MSGTYPE_SHUTDOWN, ServType, Mil_Usn,
Location, Duration, &szReq[0] );
if( szReq[0] == NULL ) {
return UPNP_E_OUTOF_MEMORY;
}
RetVal = NewRequestHandler( &DestAddr, 1, szReq );
free( szReq[0] );
return RetVal;
}
/************************************************************************
* Function : DeviceShutdown
*
* Parameters:
* IN char *DevType: Device Type.
* IN int RootDev:1 means root device.
* IN char * Udn: Device UDN
* IN char * Location: Location URL
* IN int Duration :Device duration in sec.
*
* Description:
* This function creates a HTTP device shutdown request packet
* and sent it to the multicast channel through RequestHandler.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int
DeviceShutdown( IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *_Server,
IN char *Location,
IN int Duration )
{
struct sockaddr_in DestAddr;
char *msgs[3];
char Mil_Usn[LINE_SIZE];
int ret_code;
msgs[0] = NULL;
msgs[1] = NULL;
msgs[2] = NULL;
DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );
DestAddr.sin_port = htons( SSDP_PORT );
// 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] );
}
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function DeviceShutdown\n" ); )
// both root and sub-devices need to send these two messages
CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn,
Location, Duration, &msgs[1] );
sprintf( Mil_Usn, "%s::%s", Udn, DevType );
CreateServicePacket( MSGTYPE_SHUTDOWN, DevType, Mil_Usn,
Location, Duration, &msgs[2] );
// check error
if( ( RootDev && msgs[0] == NULL ) ||
msgs[1] == NULL || msgs[2] == NULL ) {
free( msgs[0] );
free( msgs[1] );
free( msgs[2] );
return UPNP_E_OUTOF_MEMORY;
}
// send packets
if( RootDev ) {
// send 3 msg types
ret_code = NewRequestHandler( &DestAddr, 3, &msgs[0] );
} else // sub-device
{
// send 2 msg types
ret_code = NewRequestHandler( &DestAddr, 2, &msgs[1] );
}
// free msgs
free( msgs[0] );
free( msgs[1] );
free( msgs[2] );
return ret_code;
}
#endif // EXCLUDE_SSDP
#endif // INCLUDE_DEVICE_APIS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -