/***************************************************************************
 *
 *  Copyright (C) 2001-2002 Microsoft Corporation.  All Rights Reserved.
 *
 *  File:       upnpmsgs.h
 *
 *  Content:	Messages for UPnP (Universal Plug-and-Play).  Strings
 *				listed here are not to be localized.
 *
 *  History:
 *   Date      By        Reason
 *  ========  ========  =========
 *  02/08/01  VanceO    Created.
 *
 ***************************************************************************/



//=============================================================================
// Constant definitions
//=============================================================================
#define UPNP_DISCOVERY_MULTICAST_ADDRESS		"239.255.255.250"
#define UPNP_PORT								1900
#define UPNP_PORT_A								"1900"

#define UPNP_WILDCARD							""
#define UPNP_BOOLEAN_FALSE						"0"
#define UPNP_BOOLEAN_TRUE						"1"


#define HTTP_PREFIX								"HTTP/"
#define HTTP_VERSION							HTTP_PREFIX "1.1"
#define HTTP_VERSION_ALT						HTTP_PREFIX "1.0"
#define HTTP_PORT								80

#define EOL										"\r\n"



//=============================================================================
// XML standard names
//=============================================================================
#define XML_NAMESPACEDEFINITIONPREFIX			"xmlns:"

#define XML_DEVICEDESCRIPTION_SERVICETYPE		"serviceType"
#define XML_DEVICEDESCRIPTION_SERVICEID			"serviceId"
#define XML_DEVICEDESCRIPTION_CONTROLURL		"controlURL"




//=============================================================================
// Standard namespaces
//=============================================================================
#define URI_CONTROL_A							"urn:schemas-upnp-org:control-1-0"
#define	URL_SOAPENVELOPE_A						"http://schemas.xmlsoap.org/soap/envelope/"
#define URL_SOAPENCODING_A						"http://schemas.xmlsoap.org/soap/encoding/"




//=============================================================================
// Devices
//=============================================================================
#define URI_DEVICE_WANCONNECTIONDEVICE_W		L"urn:schemas-upnp-org:device:WANConnectionDevice:1"




//=============================================================================
// Services
//=============================================================================
#define URI_SERVICE_WANIPCONNECTION_A			"urn:schemas-upnp-org:service:WANIPConnection:1"
#define URI_SERVICE_WANPPPCONNECTION_A			"urn:schemas-upnp-org:service:WANPPPConnection:1"





//=============================================================================
// Standard control variables
//=============================================================================
#define ARG_CONTROL_ERROR_ERRORCODE_A			"errorCode"
#define ARG_CONTROL_ERROR_ERRORDESCRIPTION_A	"errorDescription"

#define CONTROL_RESPONSESUFFIX_A				"Response"




/*
//=============================================================================
// State variable querying
//=============================================================================
#define CONTROL_QUERYSTATEVARIABLE_A			"QueryStateVariable"


// Input

#define ARG_CONTROL_VARNAME_A					"varName"


// Output

#define ARG_CONTROL_RETURN_A					"return"



// Variables

#define VAR_EXTERNALIPADDRESS_A					"ExternalIPAddress"
*/





//=============================================================================
// Actions
//=============================================================================


// Action

/*

	GetExternalIPAddress?

*/
#define ACTION_GETEXTERNALIPADDRESS_A									"GetExternalIPAddress"


// In args


// Out args
#define ARG_GETEXTERNALIPADDRESS_NEWEXTERNALIPADDRESS_A					"NewExternalIPAddress"





// Action

/*
2.4.16.	AddPortMapping

	This action creates a new port mapping or overwrites an existing mapping
	with the same internal client. If the ExternalPort and PortMappingProtocol
	pair is already mapped to another internal client, an error is returned.

	NOTE: Not all NAT implementations will support: 
	*	Wildcard values for ExternalPort
	*	InternalPort values that are different from ExternalPort
	*	Dynamic port mappings i.e. with non-Infinite PortMappingLeaseDuration 
*/
#define ACTION_ADDPORTMAPPING_A											"AddPortMapping"


// In args
/*
2.2.15.	RemoteHost

	This variable represents the source of inbound IP packets. This will be a
	wildcard in most cases. NAT vendors are only required to support wildcards.
	A non-wildcard value will allow for "narrow" port mappings, which may be
	desirable in some usage scenarios.When RemoteHost is a wildcard, all
	traffic sent to the ExternalPort on the WAN interface of the gateway is
	forwarded to the InternalClient on the InternalPort. When RemoteHost is
	specified as one external IP address as opposed to a wild card, the NAT
	will only forward inbound packets from this RemoteHost to the
	InternalClient, all other packets will be dropped.
*/
#define ARG_ADDPORTMAPPING_NEWREMOTEHOST_A								"NewRemoteHost"

/*
2.2.16.	ExternalPort

	This variable represents the external port that the NAT gateway would
	"listen" on for connection requests to a corresponding InternalPort on an
	InternalClient. A value of 0 essentially implies that the gateway should
	listen on the same port as InternalPort. Inbound packets to this external
	port on the WAN interface of the gateway should be forwarded to
	InternalClient on the InternalPort on which the message was received. If
	this value is specified as a wildcard, connection request on all external
	ports will be forwarded to InternalClient. Obviously only one such entry
	can exist in the NAT at any time and conflicts are handled with a "first
	write wins" behavior.
*/
#define ARG_ADDPORTMAPPING_NEWEXTERNALPORT_A							"NewExternalPort"

/*
2.2.18.	PortMappingProtocol

	This variable represents the protocol of the port mapping. Possible values
	are TCP or UDP.
*/
#define ARG_ADDPORTMAPPING_NEWPROTOCOL_A								"NewProtocol"

/*
2.2.17.	InternalPort

	This variable represents the port on InternalClient that the gateway should
	forward connection requests to. A value of 0 is not allowed. NAT
	implementations that do not permit different values for ExternalPort and
	InternalPort will return an error.
*/
#define ARG_ADDPORTMAPPING_NEWINTERNALPORT_A							"NewInternalPort"

/*
2.2.19.	InternalClient

	This variable represents the IP address or DNS host name of an internal
	client (on the residential LAN). Note that if the gateway does not support
	DHCP, it does not have to support DNS host names. Consequently, support for
	an IP address is mandatory and support for DNS host names is recommended.
	This value cannot be a wild card.  It must be possible to set the
	InternalClient to the broadcast IP address 255.255.255.255 for UDP
	mappings. This is to enable multiple NAT clients to use the same well-
	known port simultaneously.
*/
#define ARG_ADDPORTMAPPING_NEWINTERNALCLIENT_A							"NewInternalClient"

/*
2.2.13.	PortMappingEnabled

	This variable allows security conscious users to disable and enable NAT
	port mappings. It can also support persistence of port mappings.
*/
#define ARG_ADDPORTMAPPING_NEWENABLED_A									"NewEnabled"

/*
2.2.20.	PortMappingDescription

	This is a string representation of a port mapping and is applicable for
	static and dynamic port mappings. The format of the description string is
	not specified and is application dependent. If specified, the description
	string can be displayed to a user via the UI of a control point, enabling
	easier management of port mappings. The description string for a port
	mapping (or a set of related port mappings) may or may not be unique across
	multiple instantiations of an application on multiple nodes in the
	residential LAN.
*/
#define ARG_ADDPORTMAPPING_NEWPORTMAPPINGDESCRIPTION_A					"NewPortMappingDescription"

/*
2.2.14.	PortMappingLeaseDuration

	This variable determines the time to live in seconds of a port-mapping
	lease. A value of 0 means the port mapping is static. Non-zero values will
	allow support for dynamic port mappings.  Note that static port mappings do
	not necessarily mean persistence of these mappings across device resets or
	reboots. It is up to a gateway vendor to implement persistence as
	appropriate for their IGD device.
*/
#define ARG_ADDPORTMAPPING_NEWLEASEDURATION_A							"NewLeaseDuration"


// Out args





// Action

/*
2.4.15.	GetSpecificPortMappingEntry

	This action reports the Static Port Mapping specified by the unique tuple
	of RemoteHost, ExternalPort and PortMappingProtocol.
*/
#define ACTION_GETSPECIFICPORTMAPPINGENTRY_A							"GetSpecificPortMappingEntry"


// In args
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWREMOTEHOST_A					ARG_ADDPORTMAPPING_NEWREMOTEHOST_A
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWEXTERNALPORT_A				ARG_ADDPORTMAPPING_NEWEXTERNALPORT_A
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWPROTOCOL_A					ARG_ADDPORTMAPPING_NEWPROTOCOL_A


// Out args
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWINTERNALPORT_A				ARG_ADDPORTMAPPING_NEWINTERNALPORT_A
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWINTERNALCLIENT_A				ARG_ADDPORTMAPPING_NEWINTERNALCLIENT_A
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWENABLED_A					ARG_ADDPORTMAPPING_NEWENABLED_A
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWPORTMAPPINGDESCRIPTION_A		ARG_ADDPORTMAPPING_NEWPORTMAPPINGDESCRIPTION_A
#define ARG_GETSPECIFICPORTMAPPINGENTRY_NEWLEASEDURATION_A				ARG_ADDPORTMAPPING_NEWLEASEDURATION_A







// Action

/*
2.4.17.	DeletePortMapping

	This action deletes a previously instantiated port mapping.

	Inbound connections are no longer permitted on the port mapping being
	deleted.
*/
#define ACTION_DELETEPORTMAPPING_A										"DeletePortMapping"


// In args
#define ARG_DELETEPORTMAPPING_NEWREMOTEHOST_A							ARG_ADDPORTMAPPING_NEWREMOTEHOST_A
#define ARG_DELETEPORTMAPPING_NEWEXTERNALPORT_A							ARG_ADDPORTMAPPING_NEWEXTERNALPORT_A
#define ARG_DELETEPORTMAPPING_NEWPROTOCOL_A								ARG_ADDPORTMAPPING_NEWPROTOCOL_A


// Out args





//=============================================================================
// HTTP/SSDP/SOAP/UPnP header strings (located in intfobj.cpp)
//=============================================================================

#define RESPONSEHEADERINDEX_CACHECONTROL		0
#define RESPONSEHEADERINDEX_DATE				1
#define RESPONSEHEADERINDEX_EXT					2
#define RESPONSEHEADERINDEX_LOCATION			3
#define RESPONSEHEADERINDEX_SERVER				4
#define RESPONSEHEADERINDEX_ST					5
#define RESPONSEHEADERINDEX_USN					6

#define RESPONSEHEADERINDEX_CONTENTLANGUAGE		7
#define RESPONSEHEADERINDEX_CONTENTLENGTH		8
#define RESPONSEHEADERINDEX_CONTENTTYPE			9
#define RESPONSEHEADERINDEX_TRANSFERENCODING	10

#define RESPONSEHEADERINDEX_HOST				11
#define RESPONSEHEADERINDEX_NT					12
#define RESPONSEHEADERINDEX_NTS					13
#define RESPONSEHEADERINDEX_MAN					14
#define RESPONSEHEADERINDEX_MX					15
#define RESPONSEHEADERINDEX_AL					16
#define RESPONSEHEADERINDEX_CALLBACK			17
#define RESPONSEHEADERINDEX_TIMEOUT				18
#define RESPONSEHEADERINDEX_SCOPE				19
#define RESPONSEHEADERINDEX_SID					20
#define RESPONSEHEADERINDEX_SEQ					21

#define NUM_RESPONSE_HEADERS					22

extern const char *		c_szResponseHeaders[NUM_RESPONSE_HEADERS];




//=============================================================================
// Pre-built UPnP message strings (located in intfobj.cpp)
//=============================================================================

/*
1.2.2 Discovery: Search: Request with M-SEARCH 

(No body for request with method M-SEARCH, but note that the message must have a blank line following the last HTTP header.)

	Request line 
		M-SEARCH 
			Method defined by SSDP for search requests. 
		* 
			Request applies generally and not to a specific resource. Must be *. 
		HTTP/1.1 
			HTTP version. 

	Headers
		HOST 
			Required. Multicast channel and port reserved for SSDP by Internet Assigned Numbers Authority (IANA). Must be 239.255.255.250:1900. 
		MAN 
			Required. Unlike the NTS and ST headers, the value of the MAN header is enclosed in double quotes. Must be "ssdp:discover". 
		MX 
			Required. Maximum wait. Device responses should be delayed a random duration between 0 and this many seconds to balance load for the control point when it processes responses. This value should be increased if a large number of devices are expected to respond or if network latencies are expected to be significant.  Specified by UPnP vendor. Integer. 
		ST 
			Required header defined by SSDP. Search Target. Must be one of the following. (cf. NT header in NOTIFY with ssdp:alive above.) Single URI. 

			ssdp:all 
				Search for all devices and services. 
			upnp:rootdevice 
				Search for root devices only. 
			uuid:device-UUID 
				Search for a particular device. Device UUID specified by UPnP vendor. 
			urn:schemas-upnp-org:device:deviceType:v 
				Search for any device of this type. Device type and version defined by UPnP Forum working committee. 
			urn:schemas-upnp-org:service:serviceType:v 
				Search for any service of this type. Service type and version defined by UPnP Forum working committee.  
*/
extern const char	c_szUPnPMsg_Discover_Service_WANIPConnection[];
extern const char	c_szUPnPMsg_Discover_Service_WANPPPConnection[];


/*
1.2.3 Discovery: Search: Response

(No body for a response to a request with method M-SEARCH, but note that the message must have a blank line following the last HTTP header.)

	Response line
		HTTP/1.1 200 OK

	Headers
		CACHE-CONTROL 
			Required. Must have max-age directive that specifies number of seconds the advertisement is valid. After this duration, control points should assume the device (or service) is no longer available. Should be > 1800 seconds (30 minutes). Specified by UPnP vendor. Integer.  
		DATE 
			Recommended. When response was generated. RFC 1123 date. 
		EXT 
			Required. Confirms that the MAN header was understood. (Header only; no value.) 
		LOCATION 
			Required. Contains a URL to the UPnP description of the root device. In some unmanaged networks, host of this URL may contain an IP address (versus a domain name). Specified by UPnP vendor. Single URL.
		SERVER 
			Required. Concatenation of OS name, OS version, UPnP/1.0, product name, and product version. Specified by UPnP vendor. String. 
		ST 
			Required header defined by SSDP. Search Target. Single URI. If ST header in request was, 

			ssdp:all 
				Respond 3+2d+k times for a root device with d embedded devices and s embedded services but only k distinct service types. Value for ST header must be the same as for the NT header in NOTIFY messages with ssdp:alive. (See above.) Single URI. 
			upnp:rootdevice 
				Respond once for root device. Must be upnp:rootdevice. Single URI.	
			uuid:device-UUID
				Respond once for each device, root or embedded. Must be uuid:device-UUID. Device UUID specified by UPnP vendor. Single URI. 
			urn:schemas-upnp-org:device:deviceType:v 
				Respond once for each device, root or embedded. Must be urn:schemas-upnp-org:device:deviceType:v. Device type and version defined by UPnP Forum working committee. 
			urn:schemas-upnp-org:service:serviceType:v 
				Respond once for each service. Must be urn:schemas-upnp-org:service:serviceType:v. Service type and version defined by UPnP Forum working committee. 
		USN 
			Required header defined by SSDP. Unique Service Name. (See list of required values for USN header in NOTIFY with ssdp:alive above.) Single URI. 

*/



/*
2.9 Description: Retrieving a description: Request

(No body for request to retrieve a description, but note that the message must have a blank line following the last HTTP header.) 

	Request line
		GET 
			Method defined by HTTP. 
		path to description 
			Path component of device description URL (LOCATION header in discovery message) or of service description URL (SCPDURL element in device description). Single, relative URL. 
		HTTP/1.1 
			HTTP version. 

	Headers
		HOST 
			Required. Domain name or IP address and optional port components of device description URL (LOCATION header in discovery message) or of service description URL (SCPDURL element of device description). If the port is empty or not given, port 80 is assumed. 
		ACCEPT-LANGUAGE 
			Recommended for retrieving device descriptions. Preferred language(s) for description. If no description is available in this language, device may return a description in a default language. RFC 1766 language tag(s). 
*/


/*
2.9 Description: Retrieving a description: Response

The body of this response is a UPnP device or service XML description.

	Response line
		HTTP/1.1 200 OK

	Headers
		CONTENT-LANGUAGE 
			Required if and only if request included an ACCEPT-LANGUAGE header. Language of description. RFC 1766 language tag(s). 
		CONTENT-LENGTH 
			Required. Length of body in Bytes. Integer. 
		CONTENT-TYPE 
			Required. Must be text/xml. 
		DATE 
			Recommended. When response was generated. RFC 1123 date. 
*/

//
// Description response XML format (parts we're interested in, anyway):
//
//	<?xml version="1.0"?>
//	<root xmlns="urn:schemas-upnp-org:device-1-0">
//	  <device>
//	    <serviceList>
//	      <service>
//	        <serviceType>urn:schemas-upnp-org:service:serviceType:v</serviceType>
//	        <serviceId>urn:upnp-org:serviceId:serviceID</serviceId>
//	        <controlURL>URL for control</controlURL>
//	      </service>
//	    </serviceList>
//	  </device>
//	</root>
//
// i.e. the element stack is "?xml/root/device/serviceList/service".
//
extern const char *		c_szElementStack_service[];




/*
3.3.1 Control: Query: Invoke

	Request line
		POST 
			Method defined by HTTP. 
		path of control URL 
			Path component of URL for control for this service (controlURL sub element of service element of device description). Single, relative URL. 
		HTTP/1.1 
			HTTP version. 

	Headers
		HOST 
			Required. Domain name or IP address and optional port components of URL for control for this service (controlURL sub element of service element of device description). If the port is empty or not given, port 80 is assumed. 
		ACCEPT-LANGUAGE 
			(No ACCEPT-LANGUAGE header is used in control messages.) 
		CONTENT-LENGTH 
			Required. Length of body in bytes. Integer. 
		CONTENT-TYPE 
			Required. Must be text/xlm. Should include character coding used, e.g., utf-8. 
		MAN 
			(No MAN header in request with method POST.) 
		SOAPACTION 
			Required header defined by SOAP. Must be "urn:schemas-upnp-org:control-1-0#QueryStateVariable". If used in a request with method M-POST, header name must be qualified with HTTP name space defined in MAN header. Single URI. 

	Body
		Envelope 
			Required element defined by SOAP. xmlns namespace attribute must be "http://schemas.xmlsoap.org/soap/envelope/". Must include encodingStyle attribute with value "http://schemas.xmlsoap.org/soap/encoding/". Contains the following sub elements: 
		Body 
			Required element defined by SOAP. Should be qualified with SOAP namespace. Contains the following sub element: 

			QueryStateVariable 
				Required element defined by UPnP. Action name. xmlns namespace attribute must be "urn:schemas-upnp-org:control-1-0". Must be the first sub element of Body. Contains the following, ordered sub element: 

				varName 
					Required element defined by UPnP. Variable name. Must be qualified by QueryStateVariable namespace. Values is name of state variable to be queried. String.  
*/

/*
3.3.2 Control: Query: Response: Success

	Response line
		HTTP/1.1 
			HTTP version. 
		200 OK 
			HTTP success code. 

	Headers
		CONTENT-LANGUAGE 
			(No CONTENT-LANGUAGE header is used in control messages.) 
		CONTENT-LENGTH 
			Required. Length of body in bytes. Integer. 
		CONTENT-TYPE 
			Required. Must be text/xlm. Should include character coding used, e.g., utf-8. 
		DATE 
			Recommended. When response was generated. RFC 1123 date. 
		EXT 
			Required. Confirms that the MAN header was understood. (Header only; no value.) 
		SERVER 
			Required. Concatenation of OS name, OS version, UPnP/1.0, product name, and product version. String. 

	Body
		Envelope 
			Required element defined by SOAP. xmlns namespace attribute must be "http://schemas.xmlsoap.org/soap/envelope/". Must include encodingStyle attribute with value "http://schemas.xmlsoap.org/soap/encoding/". Contains the following sub elements: 
		Body 
			Required element defined by SOAP. Should be qualified with SOAP namespace. Contains the following sub element: 

			QueryStateVariableResponse 
				Required element defined by UPnP and SOAP. xmlns namespace attribute must be "urn:schemas-upnp-org:control-1-0". Must be the first sub element of Body. Contains the following sub element: 

				return 
					Required element defined by UPnP. (Element name not qualified by a namespace; element nesting context is sufficient.) Value is current value of the state variable specified in varName element in request. 
*/

//
// Control sucess response SOAP XML format (parts we're interested in, anyway):
//
//	<s:Envelope
//	    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
//	    s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
//	  <s:Body>
//	    <u:QueryStateVariableResponse xmlns:u="urn:schemas-upnp-org:control-1-0">
//	      <return>variable value</return>
//	    </u:QueryStateVariableResponse>
//	  </s:Body>
//	</s:Envelope>

//
// i.e. the element stack is "s:Envelope/s:Body/u:QueryStateVariableResponse".
//
//extern const char *		c_szElementStack_QueryStateVariableResponse[];



/*
3.2.1 Control: Action: Invoke

	Request line
		POST 
			Method defined by HTTP. 
		path control URL 
			Path component of URL for control for this service (controlURL sub element of service element of device description). Single, relative URL. 
		HTTP/1.1 
			HTTP version. 

	Headers
		HOST 
			Required. Domain name or IP address and optional port components of URL for control for this service (controlURL sub element of service element of device description). If the port is empty or not given, port 80 is assumed. 
		ACCEPT-LANGUAGE 
			(No ACCEPT-LANGUAGE header is used in control messages.) 
		CONTENT-LENGTH 
			Required. Length of body in bytes. Integer. 
		CONTENT-TYPE 
			Required. Must be text/xlm. Should include character coding used, e.g., utf-8. 
		SOAPACTION 
			Required header defined by SOAP. Must be the service type, hash mark, and name of action to be invoked, all enclosed in double quotes. If used in a request with method M-POST, header name must be qualified with HTTP name space defined in MAN header. Single URI. 

	Body
		Envelope 
			Required element defined by SOAP. xmlns namespace attribute must be "http://schemas.xmlsoap.org/soap/envelope/". Must include encodingStyle attribute with value "http://schemas.xmlsoap.org/soap/encoding/". Contains the following sub elements: 

			Body 
				Required element defined by SOAP. Should be qualified with SOAP namespace. Contains the following sub element: 

				actionName 
					Required. Name of element is name of action to invoke. xmlns namespace attribute must be the service type enclosed in double quotes. Must be the first sub element of Body. Contains the following, ordered sub element(s): 

					argumentName 
						Required if and only if action has in arguments. Value to be passed to action. Repeat once for each in argument. (Element name not qualified by a namespace; element nesting context is sufficient.) Single data type as defined by UPnP service description. 
*/

/*
3.2.2 Control: Action: Response: Success

	Response line
		HTTP/1.1 
			HTTP version. 
		200 OK 
			HTTP success code. 

	Headers
		CONTENT-LANGUAGE 
			(No CONTENT-LANGUAGE header is used in control messages.) 
		CONTENT-LENGTH 
			Required. Length of body in bytes. Integer. 
		CONTENT-TYPE 
			Required. Must be text/xlm. Should include character coding used, e.g., utf-8. 
		DATE 
			Recommended. When response was generated. RFC 1123 date. 
		EXT 
			Required. Confirms that the MAN header was understood. (Header only; no value.) 
		SERVER 
			Required. Concatenation of OS name, OS version, UPnP/1.0, product name, and product version. String. 

	Body
		Envelope 
			Required element defined by SOAP. xmlns namespace attribute must be "http://schemas.xmlsoap.org/soap/envelope/". Must include encodingStyle attribute with value "http://schemas.xmlsoap.org/soap/encoding/". Contains the following sub elements: 

			Body 
				Required element defined by SOAP. Should be qualified with SOAP namespace. Contains the following sub element: 

				actionNameResponse 
					Required. Name of element is action name prepended to Response. xmlns namespace attribute must be service type enclosed in double quotes. Must be the first sub element of Body. Contains the following sub element: 

					argumentName 
						Required if and only if action has out arguments. Value returned from action. Repeat once for each out argument. If action has an argument marked as retval, this argument must be the first element. (Element name not qualified by a namespace; element nesting context is sufficient.) Single data type as defined by UPnP service description. 
*/

//
// Control sucess response SOAP XML format (parts we're interested in, anyway):
//
//	<s:Envelope
//	    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
//	    s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
//	  <s:Body>
//	    <u:actionNameResponse xmlns:u="urn:schemas-upnp-org:service:serviceType:v">
//	      <argumentName>out arg value</argumentName>
//	    </u:actionNameResponse>
//	  </s:Body>
//	</s:Envelope>
//
// i.e. the element stack is "s:Envelope/s:Body/u:actionNameResponse".
//
extern const char *		c_szElementStack_GetExternalIPAddressResponse[];
extern const char *		c_szElementStack_AddPortMappingResponse[];
extern const char *		c_szElementStack_GetSpecificPortMappingEntryResponse[];
extern const char *		c_szElementStack_DeletePortMappingResponse[];

/*
3.2.2 Control: Action: Response: Failure

	Response line
		HTTP/1.1 
			HTTP version. 
		500 Internal Server Error 
			HTTP error code. 

	Headers
		CONTENT-LANGUAGE 
			(No CONTENT-LANGUAGE header is used in control messages.) 
		CONTENT-LENGTH 
			Required. Length of body in bytes. Integer. 
		CONTENT-TYPE 
			Required. Must be text/xlm. Should include character coding used, e.g., utf-8. 
		DATE 
			Recommended. When response was generated. RFC 1123 date. 
		EXT 
			Required. Confirms that the MAN header was understood. (Header only; no value.) 
		SERVER 
			Required. Concatenation of OS name, OS version, UPnP/1.0, product name, and product version. String. 

	Body
		Envelope 
			Required element defined by SOAP. xmlns namespace attribute must be "http://schemas.xmlsoap.org/soap/envelope/". Must include encodingStyle attribute with value "http://schemas.xmlsoap.org/soap/encoding/". Contains the following sub elements: 

			Body 
				Required element defined by SOAP. Should be qualified with SOAP namespace. Contains the following sub element: 

				Fault 
					Required element defined by SOAP. Error encountered while invoking action. Should be qualified with SOAP namespace. Contains the following sub elements: 

					faultcode 
						Required element defined by SOAP. Value must be qualified with the SOAP namespace. Must be Client. 

					faultstring 
						Required element defined by SOAP. Must be UPnPError. 

					detail 
						Required element defined by SOAP. 

						UPnPError 
							Required element defined by UPnP. 

						errorCode 
							Required element defined by UPnP. Code identifying what error was encountered. See table immediately below for values. Integer. 

						errorDescription 
							Recommended element defined by UPnP. Short description. See table immediately below for values. String. Recommend < 256 characters. 
*/

//
// Control failure response SOAP XML format (parts we're interested in, anyway):
//
//	<s:Envelope
//	    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
//	    s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
//	  <s:Body>
//	    <s:Fault>
//	      <faultcode>s:Client</faultcode>
//	      <faultstring>UPnPError</faultstring>
//	      <detail>
//	        <UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
//	          <errorCode>error code</errorCode>
//	          <errorDescription>error string</errorDescription>
//	        </UPnPError>
//	      </detail>
//	    </s:Fault>
//	  </s:Body>
//	</s:Envelope>
//
// i.e. the element stack is "s:Envelope/s:Body/s:Fault/detail/UPnPError".
//
extern const char *		c_szElementStack_ControlResponseFailure[];





//=============================================================================
// Errors
//=============================================================================

//
// See UPnP Device Architecture section on Control.
//
#define UPNPERR_INVALIDARGS								402


//
// The specified value does not exist in the array.
//
#define UPNPERR_IGD_NOSUCHENTRYINARRAY					714

//
// The source IP address cannot be wild-carded.
//
#define UPNPERR_IGD_WILDCARDNOTPERMITTEDINSRCIP			715

//
// The external port cannot be wild-carded.
//
#define UPNPERR_IGD_WILDCARDNOTPERMITTEDINEXTPORT		716



//
// The service mapping entry specified conflicts with a mapping assigned
// previously to another client.
//
#define UPNPERR_IGD_CONFLICTINMAPPINGENTRY				718


//
// Internal and External port values must be the same.
//
#define UPNPERR_IGD_SAMEPORTVALUESREQUIRED				724

//
// The NAT implementation only supports permanent lease times on port mappings.
//
#define UPNPERR_IGD_ONLYPERMANENTLEASESSUPPORTED		725