libUPnP
1.14.5
|
#include "config.h"
#include <string.h>
#include <time.h>
#include "client_table.h"
#include "httpparser.h"
#include "miniserver.h"
#include "service_table.h"
#include "sock.h"
#include "ThreadPool.h"
#include "upnp.h"
#include "UpnpString.h"
#include "uri.h"
Go to the source code of this file.
Data Structures | |
struct | NOTIFY_THREAD_STRUCT |
Macros | |
#define | EXTERN_C |
#define | XML_VERSION "<?xml version='1.0' encoding='ISO-8859-1' ?>\n" |
XML version comment. Not used because it is not interopeable with other UPnP vendors. More... | |
#define | XML_PROPERTYSET_HEADER "<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">\n" |
#define | UNABLE_MEMORY "HTTP/1.1 500 Internal Server Error\r\n\r\n" |
#define | UNABLE_SERVICE_UNKNOWN "HTTP/1.1 404 Not Found\r\n\r\n" |
#define | UNABLE_SERVICE_NOT_ACCEPT "HTTP/1.1 503 Service Not Available\r\n\r\n" |
#define | NOT_IMPLEMENTED "HTTP/1.1 501 Not Implemented\r\n\r\n" |
#define | BAD_REQUEST "HTTP/1.1 400 Bad Request\r\n\r\n" |
#define | INVALID_NT BAD_CALLBACK |
#define | BAD_CALLBACK "HTTP/1.1 412 Precondition Failed\r\n\r\n" |
#define | HTTP_OK_CRLF "HTTP/1.1 200 OK\r\n\r\n" |
#define | HTTP_OK_STR "HTTP/1.1 200 OK\r\n" |
#define | INVALID_SID BAD_CALLBACK |
#define | MISSING_SID BAD_CALLBACK |
#define | MAX_CONTENT_LENGTH 20 |
#define | MAX_SECONDS 10 |
#define | MAX_EVENTS 20 |
#define | MAX_PORT_SIZE 10 |
#define | GENA_E_BAD_RESPONSE UPNP_E_BAD_RESPONSE |
#define | GENA_E_BAD_SERVICE UPNP_E_INVALID_SERVICE |
#define | GENA_E_SUBSCRIPTION_UNACCEPTED UPNP_E_SUBSCRIBE_UNACCEPTED |
#define | GENA_E_BAD_SID UPNP_E_INVALID_SID |
#define | GENA_E_UNSUBSCRIBE_UNACCEPTED UPNP_E_UNSUBSCRIBE_UNACCEPTED |
#define | GENA_E_NOTIFY_UNACCEPTED UPNP_E_NOTIFY_UNACCEPTED |
#define | GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB -9 |
#define | GENA_E_BAD_HANDLE UPNP_E_INVALID_HANDLE |
#define | XML_ERROR -5 |
#define | XML_SUCCESS UPNP_E_SUCCESS |
#define | GENA_SUCCESS UPNP_E_SUCCESS |
#define | CALLBACK_SUCCESS 0 |
#define | DEFAULT_TIMEOUT 1801 |
#define | SubscribeLock() |
Locks the subscription. More... | |
#define | SubscribeUnlock() |
Unlocks the subscription. More... | |
Typedefs | |
typedef struct NOTIFY_THREAD_STRUCT | notify_thread_struct |
Functions | |
void | genaCallback (http_parser_t *parser, http_message_t *request, SOCKINFO *info) |
This is the callback function called by the miniserver to handle incoming GENA requests. More... | |
int | genaSubscribe (UpnpClient_Handle client_handle, const UpnpString *PublisherURL, int *TimeOut, UpnpString *out_sid) |
This function subscribes to a PublisherURL (also mentioned as EventURL in some places). More... | |
int | genaUnSubscribe (UpnpClient_Handle client_handle, const UpnpString *in_sid) |
Unsubscribes a SID. More... | |
int | genaUnregisterClient (UpnpClient_Handle client_handle) |
Unsubcribes all the outstanding subscriptions and cleans the subscription list. More... | |
int | genaUnregisterDevice (UpnpDevice_Handle device_handle) |
Cleans the service table of the device. More... | |
int | genaRenewSubscription (UpnpClient_Handle client_handle, const UpnpString *in_sid, int *TimeOut) |
Renews a SID. More... | |
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. More... | |
int | genaNotifyAllExt (UpnpDevice_Handle device_handle, char *UDN, char *servId, IXML_Document *PropSet) |
Sends a notification to all the subscribed control points. More... | |
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. More... | |
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. More... | |
void | error_respond (SOCKINFO *info, int error_code, http_message_t *hmsg) |
Sends an error message to the control point in the case of incorrect GENA requests. More... | |
Variables | |
ithread_mutex_t | GlobalClientSubscribeMutex |
#define SubscribeLock | ( | ) |
Locks the subscription.
#define SubscribeUnlock | ( | ) |
Unlocks the subscription.
#define XML_VERSION "<?xml version='1.0' encoding='ISO-8859-1' ?>\n" |
XML version comment. Not used because it is not interopeable with other UPnP vendors.
typedef struct NOTIFY_THREAD_STRUCT notify_thread_struct |
Structure to send NOTIFY message to all subscribed control points
void error_respond | ( | SOCKINFO * | info, |
int | error_code, | ||
http_message_t * | hmsg | ||
) |
Sends an error message to the control point in the case of incorrect GENA requests.
[in] | info | Structure containing information about the socket. |
[in] | error_code | error code that will be in the GENA response. |
[in] | hmsg | GENA request Packet. |
void genaCallback | ( | http_parser_t * | parser, |
http_message_t * | request, | ||
SOCKINFO * | info | ||
) |
This is the callback function called by the miniserver to handle incoming GENA requests.
[in] | parser | represents the parse state of the request |
[in] | request | HTTP message containing GENA request |
[in,out] | info | Structure containing information about the socket |
References http_message_t::method.
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. |
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. |
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. |
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. |
int genaRenewSubscription | ( | UpnpClient_Handle | client_handle, |
const UpnpString * | in_sid, | ||
int * | TimeOut | ||
) |
Renews a SID.
It first validates the SID and client_handle and copies the subscription. It sends RENEW (modified SUBSCRIBE) http request to service and processes the response.
[in] | client_handle | Client handle. |
[in] | in_sid | Subscription ID. |
[in,out] | TimeOut | requested Duration, if -1, then "infinite". In the OUT case: actual Duration granted by Service, -1 for infinite. |
int genaSubscribe | ( | UpnpClient_Handle | client_handle, |
const UpnpString * | PublisherURL, | ||
int * | TimeOut, | ||
UpnpString * | out_sid | ||
) |
This function subscribes to a PublisherURL (also mentioned as EventURL in some places).
It sends SUBSCRIBE http request to service processes request. Finally adds a Subscription to the clients subscription list, if service responds with OK.
[in] | client_handle | The client handle. |
[in] | PublisherURL | Of the form: "http://134.134.156.80:4000/RedBulb/Event @param[in,out] TimeOut requested Duration:
\li if -1, then "infinite".
|
[out] | out_sid | sid of subscription, memory passed in by caller. |
int genaUnregisterClient | ( | UpnpClient_Handle | client_handle | ) |
Unsubcribes all the outstanding subscriptions and cleans the subscription list.
This function is called when control point unregisters.
[in] | client_handle | Handle containing all the control point related information. |
References GenlibClientSubscription_new(), and UPNP_E_SUCCESS.
int genaUnregisterDevice | ( | UpnpDevice_Handle | device_handle | ) |
Cleans the service table of the device.
Cleans the service table of the device.
[in] | device_handle | Device handle. |
int genaUnSubscribe | ( | UpnpClient_Handle | client_handle, |
const UpnpString * | in_sid | ||
) |
Unsubscribes a SID.
It first validates the SID and client_handle,copies the subscription, sends UNSUBSCRIBE http request to service processes request and finally removes the subscription.
[in] | client_handle | UPnP client handle. |
[in] | in_sid | The subscription ID. |