libUPnP
1.6.17
|
#include "config.h"
#include "gena.h"
#include "httpparser.h"
#include "httpreadwrite.h"
#include "parsetools.h"
#include "ssdplib.h"
#include "statcodes.h"
#include "sysdep.h"
#include "unixutil.h"
#include "upnpapi.h"
#include "uuid.h"
Functions | |
int | genaUnregisterDevice (UpnpDevice_Handle device_handle) |
Unregisters a device. | |
static int | GeneratePropertySet (char **names, char **values, int count, DOMString *out) |
Generates XML property set for notifications. | |
static void | free_notify_struct (notify_thread_struct *input) |
Frees memory used in notify_threads if the reference count is 0, otherwise decrements the refrence count. | |
static UPNP_INLINE int | notify_send_and_recv (uri_type *destination_url, membuffer *mid_msg, char *propertySet, http_parser_t *response) |
Sends the notify message and returns a reply. | |
static int | genaNotify (char *headers, char *propertySet, subscription *sub) |
Function to Notify a particular subscription of a particular event. | |
static void | genaNotifyThread (void *input) |
Thread job to Notify a control point. | |
static char * | AllocGenaHeaders (const DOMString propertySet) |
Allocates the GENA header. | |
int | genaInitNotify (UpnpDevice_Handle device_handle, char *UDN, char *servId, char **VarNames, char **VarValues, int var_count, const Upnp_SID sid) |
Sends the intial state table dump to newly subscribed control point. | |
int | genaInitNotifyExt (UpnpDevice_Handle device_handle, char *UDN, char *servId, IXML_Document *PropSet, const Upnp_SID sid) |
Similar to the genaInitNofity. The only difference is that it takes the xml document for the state table and sends the intial state table dump to newly subscribed control point. | |
int | genaNotifyAllExt (UpnpDevice_Handle device_handle, char *UDN, char *servId, IXML_Document *PropSet) |
Sends a notification to all the subscribed control points. | |
int | genaNotifyAll (UpnpDevice_Handle device_handle, char *UDN, char *servId, char **VarNames, char **VarValues, int var_count) |
Sends a notification to all the subscribed control points. | |
static int | respond_ok (SOCKINFO *info, int time_out, subscription *sub, http_message_t *request) |
Returns OK message in the case of a subscription request. | |
static int | create_url_list (memptr *url_list, URL_list *out) |
Function to parse the Callback header value in subscription requests. | |
void | gena_process_subscription_request (SOCKINFO *info, http_message_t *request) |
Handles a subscription request from a ctrl point. The socket is not closed on return. | |
void | gena_process_subscription_renewal_request (SOCKINFO *info, http_message_t *request) |
Handles a subscription renewal request from a ctrl point. The connection is not destroyed on return. | |
void | gena_process_unsubscribe_request (SOCKINFO *info, http_message_t *request) |
Handles a subscription cancellation request from a ctrl point. The connection is not destroyed on return. |
static char* AllocGenaHeaders | ( | const DOMString | propertySet | ) | [static] |
Allocates the GENA header.
[in] | propertySet | The property set string. |
References UpnpPrintf().
Referenced by genaInitNotify(), genaInitNotifyExt(), genaNotifyAll(), and genaNotifyAllExt().
static int create_url_list | ( | memptr * | url_list, |
URL_list * | out | ||
) | [static] |
Function to parse the Callback header value in subscription requests.
Takes in a buffer containing URLS delimited by '<' and '>'. The entire buffer is copied into dynamic memory and stored in the URL_list. Pointers to the individual urls within this buffer are allocated and stored in the URL_list. Only URLs with network addresses are considered (i.e. host:port or domain name).
[in] | url_list | . |
[out] | out | . |
References memptr::buf, memptr::length, parse_uri(), URL_LIST::parsedURLs, URL_LIST::size, HOSTPORT::text, UPNP_E_OUTOF_MEMORY, and URL_LIST::URLs.
Referenced by gena_process_subscription_request().
static void free_notify_struct | ( | notify_thread_struct * | input | ) | [static] |
Frees memory used in notify_threads if the reference count is 0, otherwise decrements the refrence count.
[in] | input | Notify structure. |
References ixmlFreeDOMString().
Referenced by genaInitNotify(), genaInitNotifyExt(), genaNotifyAll(), genaNotifyAllExt(), and genaNotifyThread().
void gena_process_subscription_renewal_request | ( | SOCKINFO * | info, |
http_message_t * | request | ||
) |
Handles a subscription renewal request from a ctrl point. The connection is not destroyed on return.
[in] | info | Socket info of the device. |
[in] | request | Subscription renewal request from the control point. |
References memptr::buf, membuffer::buf, device_handle, error_respond(), SOCKINFO::foreign_sockaddr, GetDeviceHandleInfo(), memptr::length, Handle_Info::MaxSubscriptions, Handle_Info::MaxSubscriptionTimeOut, PARSE_OK, respond_ok(), Handle_Info::ServiceTable, UPNP_E_SUCCESS, UpnpPrintf(), and http_message_t::uri.
void gena_process_subscription_request | ( | SOCKINFO * | info, |
http_message_t * | request | ||
) |
Handles a subscription request from a ctrl point. The socket is not closed on return.
[in] | info | Socket info of the device. |
[in] | request | Subscription request from the control point. |
References memptr::buf, Handle_Info::Callback, Handle_Info::Cookie, create_url_list(), device_handle, error_respond(), SOCKINFO::foreign_sockaddr, GetDeviceHandleInfo(), memptr::length, Handle_Info::MaxSubscriptions, Handle_Info::MaxSubscriptionTimeOut, PARSE_OK, URL_LIST::parsedURLs, respond_ok(), Upnp_Subscription_Request::ServiceId, Handle_Info::ServiceTable, Upnp_Subscription_Request::Sid, URL_LIST::size, Upnp_Subscription_Request::UDN, UPNP_E_OUTOF_MEMORY, UPNP_E_SUCCESS, UPNP_EVENT_SUBSCRIPTION_REQUEST, UpnpPrintf(), http_message_t::uri, URL_LIST::URLs, uuid_create(), and uuid_unpack().
void gena_process_unsubscribe_request | ( | SOCKINFO * | info, |
http_message_t * | request | ||
) |
Handles a subscription cancellation request from a ctrl point. The connection is not destroyed on return.
[in] | info | Socket info of the device. |
[in] | request | UNSUBSCRIBE request from the control point. |
References memptr::buf, membuffer::buf, device_handle, error_respond(), SOCKINFO::foreign_sockaddr, GetDeviceHandleInfo(), memptr::length, Handle_Info::ServiceTable, and http_message_t::uri.
int genaInitNotify | ( | UpnpDevice_Handle | device_handle, |
char * | UDN, | ||
char * | servId, | ||
char ** | VarNames, | ||
char ** | VarValues, | ||
int | var_count, | ||
const Upnp_SID | sid | ||
) |
Sends the intial state table dump to newly subscribed control point.
[in] | device_handle | Device handle. |
[in] | UDN | Device udn. |
[in] | servId | Service ID. |
[in] | VarNames | Array of variable names. |
[in] | VarValues | Array of variable values. |
[in] | var_count | Array size. |
[in] | sid | Subscription ID. |
References AllocGenaHeaders(), device_handle, DOMString, free_notify_struct(), genaNotifyThread(), GeneratePropertySet(), GetHandleInfo(), gSendThreadPool, ixmlFreeDOMString(), Handle_Info::ServiceTable, ThreadPoolAdd(), TPJobInit(), TPJobSetFreeFunction(), TPJobSetPriority(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by UpnpAcceptSubscription().
int genaInitNotifyExt | ( | UpnpDevice_Handle | device_handle, |
char * | UDN, | ||
char * | servId, | ||
IXML_Document * | PropSet, | ||
const Upnp_SID | sid | ||
) |
Similar to the genaInitNofity. The only difference is that it takes the xml document for the state table and sends the intial state table dump to newly subscribed control point.
[in] | device_handle | Device handle. |
[in] | UDN | Device udn. |
[in] | servId | Service ID. |
[in] | PropSet | Document of the state table. |
[in] | sid | subscription ID. |
References AllocGenaHeaders(), device_handle, DOMString, free_notify_struct(), genaNotifyThread(), GetHandleInfo(), gSendThreadPool, ixmlFreeDOMString(), ixmlPrintNode(), Handle_Info::ServiceTable, ThreadPoolAdd(), TPJobInit(), TPJobSetFreeFunction(), TPJobSetPriority(), UPNP_E_INVALID_PARAM, UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by UpnpAcceptSubscriptionExt().
static int genaNotify | ( | char * | headers, |
char * | propertySet, | ||
subscription * | sub | ||
) | [static] |
Function to Notify a particular subscription of a particular event.
In general the service should NOT be blocked around this call (this may cause deadlock with a client).
NOTIFY http request is sent and the reply is processed.
[in] | headers | Null terminated, includes all headers (including \r\n) except SID and SEQ. |
[in] | propertySet | The evented XML. |
[in] | sub | subscription to be Notified, assumes this is valid for life of function. |
References http_MakeMessage(), notify_send_and_recv(), URL_LIST::parsedURLs, URL_LIST::size, membuffer::size_inc, http_message_t::status_code, UPNP_E_OUTOF_MEMORY, and UPNP_E_SUCCESS.
Referenced by genaNotifyThread().
int genaNotifyAll | ( | UpnpDevice_Handle | device_handle, |
char * | UDN, | ||
char * | servId, | ||
char ** | VarNames, | ||
char ** | VarValues, | ||
int | var_count | ||
) |
Sends a notification to all the subscribed control points.
[in] | device_handle | Device handle. |
[in] | UDN | Device udn. |
[in] | servId | Service ID. |
[in] | VarNames | Array of varible names. |
[in] | VarValues | Array of variable values. |
[in] | var_count | Number of variables. |
References AllocGenaHeaders(), device_handle, DOMString, free_notify_struct(), genaNotifyThread(), GeneratePropertySet(), GetHandleInfo(), gSendThreadPool, ixmlFreeDOMString(), Handle_Info::ServiceTable, ThreadPoolAdd(), TPJobInit(), TPJobSetFreeFunction(), TPJobSetPriority(), UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by UpnpNotify().
int genaNotifyAllExt | ( | UpnpDevice_Handle | device_handle, |
char * | UDN, | ||
char * | servId, | ||
IXML_Document * | PropSet | ||
) |
Sends a notification to all the subscribed control points.
[in] | device_handle | Device handle. |
[in] | UDN | Device udn. |
[in] | servId | Service ID. |
[in] | PropSet | XML document Event varible property set. |
References AllocGenaHeaders(), device_handle, DOMString, free_notify_struct(), genaNotifyThread(), GetHandleInfo(), gSendThreadPool, ixmlFreeDOMString(), ixmlPrintNode(), Handle_Info::ServiceTable, ThreadPoolAdd(), TPJobInit(), TPJobSetFreeFunction(), TPJobSetPriority(), UPNP_E_INVALID_PARAM, UPNP_E_OUTOF_MEMORY, and UpnpPrintf().
Referenced by UpnpNotifyExt().
static void genaNotifyThread | ( | void * | input | ) | [static] |
Thread job to Notify a control point.
It validates the subscription and copies the subscription. Also make sure that events are sent in order.
[in] | input | notify thread structure containing all the headers and property set info. |
References free_notify_struct(), genaNotify(), GetHandleInfo(), gSendThreadPool, Handle_Info::ServiceTable, ThreadPoolAdd(), TPJobInit(), TPJobSetFreeFunction(), and TPJobSetPriority().
Referenced by genaInitNotify(), genaInitNotifyExt(), genaNotifyAll(), and genaNotifyAllExt().
int genaUnregisterDevice | ( | UpnpDevice_Handle | device_handle | ) |
Unregisters a device.
Cleans the service table of the device.
[in] | device_handle | Device handle. |
References GetHandleInfo(), Handle_Info::ServiceTable, UPNP_E_SUCCESS, and UpnpPrintf().
Referenced by UpnpUnRegisterRootDeviceLowPower().
static int GeneratePropertySet | ( | char ** | names, |
char ** | values, | ||
int | count, | ||
DOMString * | out | ||
) | [static] |
Generates XML property set for notifications.
[in] | names | Array of variable names (go in the event notify). |
[in] | values | Array of variable values (go in the event notify). |
[in] | count | number of variables. |
[out] | out | PropertySet node in the string format. |
References ixmlCloneDOMString(), and UPNP_E_OUTOF_MEMORY.
Referenced by genaInitNotify(), and genaNotifyAll().
static UPNP_INLINE int notify_send_and_recv | ( | uri_type * | destination_url, |
membuffer * | mid_msg, | ||
char * | propertySet, | ||
http_parser_t * | response | ||
) | [static] |
Sends the notify message and returns a reply.
[in] | destination_url | subscription callback URL (URL of the control point). |
[in] | mid_msg | Common HTTP headers. |
[in] | propertySet | The evented XML. |
[out] | response | The response from the control point. |
References membuffer::buf, http_MakeMessage(), http_RecvMessage(), http_SendMessage(), membuffer::length, sock_destroy(), sock_init(), HOSTPORT::text, UPNP_E_OUTOF_MEMORY, UPNP_E_SOCKET_CONNECT, UPNP_E_SUCCESS, and UpnpPrintf().
Referenced by genaNotify().
static int respond_ok | ( | SOCKINFO * | info, |
int | time_out, | ||
subscription * | sub, | ||
http_message_t * | request | ||
) | [static] |
Returns OK message in the case of a subscription request.
[in] | info | Socket connection of request. |
[in] | time_out | Accepted duration. |
[in] | sub | Accepted subscription. |
[in] | request | Http request. |
References membuffer::buf, error_respond(), http_MakeMessage(), http_SendMessage(), membuffer::length, membuffer::size_inc, and UPNP_E_OUTOF_MEMORY.
Referenced by gena_process_subscription_renewal_request(), and gena_process_subscription_request().