/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_WSDTYPES
#define _INC_WSDTYPES

#ifndef _INC_WSDAPI
#error Please include wsdapi.h instead of this header. This header cannot be used directly.
#endif

#if (_WIN32_WINNT >= 0x0600)

#ifdef __cplusplus
extern "C" {
#endif

typedef enum _WSD_PROTOCOL_TYPE {
  WSD_PT_NONE    = 0x00,
  WSD_PT_UDP     = 0x01,
  WSD_PT_HTTP    = 0x02,
  WSD_PT_HTTPS   = 0x04,
  WSD_PT_ALL     = 0xff 
} WSD_PROTOCOL_TYPE;

typedef enum _WSDEventType {
  WSDET_NONE                   = 0,
  WSDET_INCOMING_MESSAGE       = 1,
  WSDET_INCOMING_FAULT         = 2,
  WSDET_TRANSMISSION_FAILURE   = 3,
  WSDET_RESPONSE_TIMEOUT       = 4 
} WSDEventType;

typedef HRESULT ( *PWSD_SOAP_MESSAGE_HANDLER )(
    IUnknown *thisUnknown,
    WSD_EVENT *event
);

typedef HRESULT ( *WSD_STUB_FUNCTION )(
    IUnknown *server,
    IWSDServiceMessaging *session,
    WSD_EVENT *event
);

typedef struct _WSD_HANDLER_CONTEXT {
  PWSD_SOAP_MESSAGE_HANDLER Handler;
  void                      *PVoid;
  IUnknown                  *Unknown;
} WSD_HANDLER_CONTEXT;

typedef struct _WSD_REFERENCE_PROPERTIES {
  WSDXML_ELEMENT *Any;
} WSD_REFERENCE_PROPERTIES;

typedef struct _WSD_REFERENCE_PARAMETERS {
  WSDXML_ELEMENT *Any;
} WSD_REFERENCE_PARAMETERS;

typedef struct _WSD_ENDPOINT_REFERENCE {
  const WCHAR              *Address;
  WSD_REFERENCE_PROPERTIES ReferenceProperties;
  WSD_REFERENCE_PARAMETERS ReferenceParameters;
  WSDXML_NAME              *PortType;
  WSDXML_NAME              *ServiceName;
  WSDXML_ELEMENT           *Any;
} WSD_ENDPOINT_REFERENCE;

typedef struct _WSD_APP_SEQUENCE {
  ULONGLONG   InstanceId;
  const WCHAR *SequenceId;
  ULONGLONG   MessageNumber;
} WSD_APP_SEQUENCE;

typedef struct _WSD_HEADER_RELATESTO {
  WSDXML_NAME *RelationshipType;
  const WCHAR *MessageID;
} WSD_HEADER_RELATESTO;

typedef struct _WSD_SOAP_HEADER {
  const WCHAR            *To;
  const WCHAR            *Action;
  const WCHAR            *MessageID;
  WSD_HEADER_RELATESTO   RelatesTo;
  WSD_ENDPOINT_REFERENCE *ReplyTo;
  WSD_ENDPOINT_REFERENCE *From;
  WSD_ENDPOINT_REFERENCE *FaultTo;
  WSD_APP_SEQUENCE       *AppSequence;
  WSDXML_ELEMENT         *AnyHeaders;
} WSD_SOAP_HEADER;

typedef struct _WSD_SOAP_MESSAGE {
  WSD_SOAP_HEADER Header;
  void            *Body;
  WSDXML_TYPE     *BodyType;
} WSD_SOAP_MESSAGE;

typedef struct _WSD_OPERATION {
  WSDXML_TYPE       *RequestType;
  WSDXML_TYPE       *ResponseType;
  WSD_STUB_FUNCTION RequestStubFunction;
} WSD_OPERATION;

typedef struct _WSD_EVENT {
  HRESULT               Hr;
  DWORD                 EventType;
  WCHAR                 *DispatchTag;
  WSD_HANDLER_CONTEXT   HandlerContext;
  WSD_SOAP_MESSAGE      *Soap;
  WSD_OPERATION         *Operation;
  IWSDMessageParameters *MessageParameters;
} WSD_EVENT;

typedef struct _WSD_SOAP_FAULT_SUBCODE {
  WSDXML_NAME            *Value;
  WSD_SOAP_FAULT_SUBCODE *Subcode;
} WSD_SOAP_FAULT_SUBCODE;

typedef struct _WSD_SOAP_FAULT_CODE {
  WSDXML_NAME            *Value;
  WSD_SOAP_FAULT_SUBCODE *Subcode;
} WSD_SOAP_FAULT_CODE;

typedef struct _WSD_LOCALIZED_STRING {
  const WCHAR *lang;
  const WCHAR *String;
} WSD_LOCALIZED_STRING;

typedef struct _WSD_LOCALIZED_STRING_LIST {
  WSD_LOCALIZED_STRING_LIST *Next;
  WSD_LOCALIZED_STRING      *Element;
} WSD_LOCALIZED_STRING_LIST;

typedef struct _WSD_SOAP_FAULT_REASON {
  WSD_LOCALIZED_STRING_LIST *Text;
} WSD_SOAP_FAULT_REASON;

typedef struct _WSD_SOAP_FAULT {
  WSD_SOAP_FAULT_CODE   *Code;
  WSD_SOAP_FAULT_REASON *Reason;
  const WCHAR           *Node;
  const WCHAR           *Role;
  WSDXML_ELEMENT        *Detail;
} WSD_SOAP_FAULT;

typedef struct _REQUESTBODY_GetStatus {
  WSDXML_ELEMENT *Any;
} REQUESTBODY_GetStatus;

typedef struct _WSD_DURATION {
  WINBOOL isPositive;
  ULONG year;
  ULONG month;
  ULONG day;
  ULONG hour;
  ULONG minute;
  ULONG second;
  ULONG millisecond;
} WSD_DURATION;

typedef struct _WSD_DATETIME {
  WINBOOL isPositive;
  ULONG year;
  UCHAR month;
  UCHAR day;
  UCHAR hour;
  UCHAR minute;
  UCHAR second;
  UINT  millisecond;
  WINBOOL TZIsLocal;
  WINBOOL TZIsPositive;
  UCHAR TZHour;
  UCHAR TZMinute;
} WSD_DATETIME;

typedef struct _WSD_EVENTING_EXPIRES {
  WSD_DURATION *Duration;
  WSD_DATETIME *DateTime;
} WSD_EVENTING_EXPIRES;

typedef struct _REQUESTBODY_Renew {
  WSD_EVENTING_EXPIRES *Expires;
  WSDXML_ELEMENT       *Any;
} REQUESTBODY_Renew;

typedef struct _WSD_EVENTING_DELIVERY_MODE {
  const WCHAR *Mode;
  void        *Data;
} WSD_EVENTING_DELIVERY_MODE;

typedef struct _WSD_EVENTING_FILTER {
  const WCHAR *Dialect;
  void        *Data;
} WSD_EVENTING_FILTER;

typedef struct _REQUESTBODY_Subscribe {
  WSD_ENDPOINT_REFERENCE     *EndTo;
  WSD_EVENTING_DELIVERY_MODE *Delivery;
  WSD_EVENTING_EXPIRES       *Expires;
  WSD_EVENTING_FILTER        *Filter;
  WSDXML_ELEMENT             *Any;
} REQUESTBODY_Subscribe;

typedef struct _REQUESTBODY_Unsubscribe {
  WSDXML_ELEMENT *any;
} REQUESTBODY_Unsubscribe;

typedef struct _WSD_METADATA_SECTION_LIST {
  WSD_METADATA_SECTION_LIST *Next;
  WSD_METADATA_SECTION      *Element;
} WSD_METADATA_SECTION_LIST;

typedef struct _RESPONSEBODY_GetMetadata {
  WSD_METADATA_SECTION_LIST *Metadata;
} RESPONSEBODY_GetMetadata;

typedef struct _RESPONSEBODY_GetStatus {
  WSD_EVENTING_EXPIRES *expires;
  WSDXML_ELEMENT       *any;
} RESPONSEBODY_GetStatus;

typedef struct _RESPONSEBODY_Renew {
  WSD_EVENTING_EXPIRES *expires;
  WSDXML_ELEMENT       *Any;
} RESPONSEBODY_Renew;

typedef struct _RESPONSEBODY_Subscribe {
  WSD_ENDPOINT_REFERENCE *SubscriptionManager;
  WSD_EVENTING_EXPIRES   *expires;
  WSDXML_ELEMENT         *Any;
} RESPONSEBODY_Subscribe;

typedef struct _RESPONSEBODY_SubscriptionEnd {
  WSD_ENDPOINT_REFERENCE *SubscriptionManager;
  const WCHAR            *Status;
  WSD_LOCALIZED_STRING   *Reason;
  WSDXML_ELEMENT         *Any;
} RESPONSEBODY_SubscriptionEnd;

typedef struct _WSD_BYE {
  WSD_ENDPOINT_REFERENCE *EndpointReference;
  WSDXML_ELEMENT         *Any;
} WSD_BYE;

typedef struct _WSD_ENDPOINT_REFERENCE_LIST {
  WSD_ENDPOINT_REFERENCE_LIST *Next;
  WSD_ENDPOINT_REFERENCE      *Element;
} WSD_ENDPOINT_REFERENCE_LIST;

typedef struct _WSD_EVENTING_DELIVERY_MODE_PUSH {
  WSD_ENDPOINT_REFERENCE *NotifyTo;
} WSD_EVENTING_DELIVERY_MODE_PUSH;

typedef struct _WSD_URI_LIST {
  WSD_URI_LIST *Next;
  const WCHAR  *Element;
} WSD_URI_LIST;

typedef struct _WSD_EVENTING_FILTER_ACTION {
  WSD_URI_LIST *Actions;
} WSD_EVENTING_FILTER_ACTION;

typedef struct _WSD_NAME_LIST {
  WSD_NAME_LIST *Next;
  WSDXML_NAME   *Element;
} WSD_NAME_LIST;

typedef struct _WSD_SCOPES {
  const WCHAR  *MatchBy;
  WSD_URI_LIST *Scopes;
} WSD_SCOPES;

typedef struct _WSD_HELLO {
  WSD_ENDPOINT_REFERENCE *EndpointReference;
  WSD_NAME_LIST          *Types;
  WSD_SCOPES             *Scopes;
  WSD_URI_LIST           *XAddrs;
  ULONGLONG              MetadataVersion;
  WSDXML_ELEMENT         *Any;
} WSD_HELLO;

typedef struct _WSD_SERVICE_METADATA {
  WSD_ENDPOINT_REFERENCE_LIST *EndpointReference;
  WSD_NAME_LIST               *Types;
  const WCHAR                 *ServiceId;
  WSDXML_ELEMENT              *Any;
} WSD_SERVICE_METADATA;

typedef struct _WSD_SERVICE_METADATA_LIST {
  WSD_SERVICE_METADATA_LIST *Next;
  WSD_SERVICE_METADATA      *Element;
} WSD_SERVICE_METADATA_LIST;

typedef struct _WSD_HOST_METADATA {
  WSD_SERVICE_METADATA      *Host;
  WSD_SERVICE_METADATA_LIST *Hosted;
} WSD_HOST_METADATA;

typedef struct _WSD_METADATA_SECTION {
  const WCHAR            *Dialect;
  const WCHAR            *Identifier;
  void                   *Data;
  WSD_ENDPOINT_REFERENCE *MetadataReference;
  const WCHAR            *Location;
  WSDXML_ELEMENT         *Any;
} WSD_METADATA_SECTION;

typedef struct _WSD_PORT_TYPE {
  DWORD             EncodedName;
  DWORD             OperationCount;
  WSD_OPERATION     *Operations;
  WSD_PROTOCOL_TYPE ProtocolType;
} WSD_PORT_TYPE;

typedef struct _WSD_PROBE {
  WSD_NAME_LIST  *Types;
  WSD_SCOPES     *Scopes;
  WSDXML_ELEMENT *Any;
} WSD_PROBE;

typedef struct _WSD_PROBE_MATCH {
  WSD_ENDPOINT_REFERENCE *EndpointReference;
  WSD_NAME_LIST          *Types;
  WSD_SCOPES             *Scopes;
  WSD_URI_LIST           *XAddrs;
  ULONGLONG              MetadataVersion;
  WSDXML_ELEMENT         *Any;
} WSD_PROBE_MATCH;

typedef struct _WSD_PROBE_MATCH_LIST {
  WSD_PROBE_MATCH_LIST *Next;
  WSD_PROBE_MATCH      *Element;
} WSD_PROBE_MATCH_LIST;

typedef struct _WSD_PROBE_MATCHES {
  WSD_PROBE_MATCH_LIST *ProbeMatch;
  WSDXML_ELEMENT       *Any;
} WSD_PROBE_MATCHES;

typedef struct _WSD_RELATIONSHIP_METADATA {
  const WCHAR       *Type;
  WSD_HOST_METADATA *Data;
  WSDXML_ELEMENT    *Any;
} WSD_RELATIONSHIP_METADATA;

typedef struct _WSD_RESOLVE {
  WSD_ENDPOINT_REFERENCE *EndpointReference;
  WSDXML_ELEMENT         *Any;
} WSD_RESOLVE;

typedef struct _WSD_RESOLVE_MATCH {
  WSD_ENDPOINT_REFERENCE *EndpointReference;
  WSD_NAME_LIST          *Types;
  WSD_SCOPES             *Scopes;
  WSD_URI_LIST           *XAddrs;
  ULONGLONG              MetadataVersion;
  WSDXML_ELEMENT         *Any;
} WSD_RESOLVE_MATCH;

typedef struct _WSD_RESOLVE_MATCHES {
  WSD_RESOLVE_MATCH *ResolveMatch;
  WSDXML_ELEMENT    *Any;
} WSD_RESOLVE_MATCHES;

typedef struct _WSD_SYNCHRONOUS_RESPONSE_CONTEXT {
  HRESULT               hr;
  HANDLE                eventHandle;
  IWSDMessageParameters *messageParameters;
  void                  *results;
} WSD_SYNCHRONOUS_RESPONSE_CONTEXT;

typedef struct _WSD_THIS_DEVICE_METADATA {
  WSD_LOCALIZED_STRING_LIST *FriendlyName;
  const WCHAR               *FirmwareVersion;
  const WCHAR               *SerialNumber;
  WSDXML_ELEMENT            *Any;
} WSD_THIS_DEVICE_METADATA;

typedef struct _WSD_THIS_MODEL_METADATA {
  WSD_LOCALIZED_STRING_LIST *Manufacturer;
  const WCHAR               *ManufacturerUrl;
  WSD_LOCALIZED_STRING_LIST *ModelName;
  const WCHAR               *ModelNumber;
  const WCHAR               *ModelUrl;
  const WCHAR               *PresentationUrl;
  WSDXML_ELEMENT            *Any;
} WSD_THIS_MODEL_METADATA;

typedef struct _WSD_UNKNOWN_LOOKUP {
  WSDXML_ELEMENT *Any;
} WSD_UNKNOWN_LOOKUP;

#ifdef __cplusplus
}
#endif
#endif /*(_WIN32_WINNT >= 0x0600)*/
#endif /*_INC_WSDTYPES*/
