//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  File: upnp.idl
//
//----------------------------------------------------------------------------

cpp_quote("//+-------------------------------------------------------------------------")
cpp_quote("//")
cpp_quote("//  Microsoft Windows")
cpp_quote("//  Copyright (c) Microsoft Corporation. All rights reserved.")
cpp_quote("//")
cpp_quote("//--------------------------------------------------------------------------")


#include <idispids.h>

import "oaidl.idl";
import "ocidl.idl";

#define __UPNP_IDL_DEFINE__

interface IUPnPDeviceFinder;
interface IUPnPDeviceFinderCallback;
interface IUPnPDevice;
interface IUPnPDevices;
interface IUPnPDeviceDocumentAccess;
interface IUPnPService;
interface IUPnPServices;
interface IUPnPDevices;
interface IUPnPDescriptionDocument;
interface IUPnPDescriptionDocumentCallback;
interface IUPnPDeviceHostSetup;

cpp_quote("#define UPNP_E_ROOT_ELEMENT_EXPECTED     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0200)")
cpp_quote("#define UPNP_E_DEVICE_ELEMENT_EXPECTED   MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0201)")
cpp_quote("#define UPNP_E_SERVICE_ELEMENT_EXPECTED  MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0202)")
cpp_quote("#define UPNP_E_SERVICE_NODE_INCOMPLETE   MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0203)")
cpp_quote("#define UPNP_E_DEVICE_NODE_INCOMPLETE    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0204)")
cpp_quote("#define UPNP_E_ICON_ELEMENT_EXPECTED     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0205)")
cpp_quote("#define UPNP_E_ICON_NODE_INCOMPLETE      MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0206)")

cpp_quote("#define UPNP_E_INVALID_ACTION            MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0207)")
cpp_quote("#define UPNP_E_INVALID_ARGUMENTS         MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0208)")
cpp_quote("#define UPNP_E_OUT_OF_SYNC               MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0209)")
cpp_quote("#define UPNP_E_ACTION_REQUEST_FAILED     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0210)")
cpp_quote("#define UPNP_E_TRANSPORT_ERROR           MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0211)")
cpp_quote("#define UPNP_E_VARIABLE_VALUE_UNKNOWN    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0212)")
cpp_quote("#define UPNP_E_INVALID_VARIABLE          MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0213)")
cpp_quote("#define UPNP_E_DEVICE_ERROR              MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0214)")
cpp_quote("#define UPNP_E_PROTOCOL_ERROR            MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0215)")
cpp_quote("#define UPNP_E_ERROR_PROCESSING_RESPONSE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0216)")
cpp_quote("#define UPNP_E_DEVICE_TIMEOUT            MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0217)")

cpp_quote("#define UPNP_E_INVALID_DOCUMENT          MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0500)")
cpp_quote("#define UPNP_E_EVENT_SUBSCRIPTION_FAILED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0501)")

cpp_quote("#define FAULT_INVALID_ACTION             401")
cpp_quote("#define FAULT_INVALID_ARG                402")
cpp_quote("#define FAULT_INVALID_SEQUENCE_NUMBER    403")
cpp_quote("#define FAULT_INVALID_VARIABLE           404")
cpp_quote("#define FAULT_DEVICE_INTERNAL_ERROR      501")
cpp_quote("#define FAULT_ACTION_SPECIFIC_BASE       600")
cpp_quote("#define FAULT_ACTION_SPECIFIC_MAX        899")

// NOTE: Do not define any HRESULTs within the range
// UPNP_E_ACTION_SPECIFIC_BASE - UPNP_E_ACTION_SPECIFIC_MAX.

cpp_quote("#define UPNP_E_ACTION_SPECIFIC_BASE      MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0300)")
cpp_quote("#define UPNP_E_ACTION_SPECIFIC_MAX       (UPNP_E_ACTION_SPECIFIC_BASE + (FAULT_ACTION_SPECIFIC_MAX - FAULT_ACTION_SPECIFIC_BASE))")

#define DISPID_XOBJ_MIN                 0x60020000
#define DISPID_XOBJ_MAX                 0x6002FFFF
#define DISPID_XOBJ_BASE                DISPID_XOBJ_MIN

#define DISPID_UPNPFINDDEVICES          (DISPID_XOBJ_BASE               + 1000)
#define DISPID_UPNPFINDDEVICESCALLBACK  (DISPID_UPNPFINDDEVICES         + 500)
#define DISPID_UPNPSERVICES             (DISPID_UPNPFINDDEVICESCALLBACK + 500)
#define DISPID_UPNPSERVICE              (DISPID_UPNPSERVICES            + 500)
#define DISPID_UPNPDEVICES              (DISPID_UPNPSERVICE             + 1000)
#define DISPID_UPNPDEVICE               (DISPID_UPNPDEVICES             + 500)
#define DISPID_UPNPDESCRIPTIONDOC       (DISPID_UPNPDEVICE              + 500)

#define DISPID_UPNPFINDDEVICES_FINDBYTYPE        (DISPID_UPNPFINDDEVICES + 1)
#define DISPID_UPNPFINDDEVICES_FINDBYDCPI        (DISPID_UPNPFINDDEVICES + 2)
#define DISPID_UPNPFINDDEVICES_FINDBYUDN         (DISPID_UPNPFINDDEVICES + 3)
#define DISPID_UPNPFINDDEVICES_CREATEASYNCFIND   (DISPID_UPNPFINDDEVICES + 4)
#define DISPID_UPNPFINDDEVICES_STARTASYNCFIND    (DISPID_UPNPFINDDEVICES + 5)
#define DISPID_UPNPFINDDEVICES_CANCELASYNCFIND   (DISPID_UPNPFINDDEVICES + 6)

#define DISPID_UPNPFINDDEVICESCALLBACK_NEWDEVICE        (DISPID_UPNPFINDDEVICESCALLBACK + 1)
#define DISPID_UPNPFINDDEVICESCALLBACK_SEARCHCOMPLETE   (DISPID_UPNPFINDDEVICESCALLBACK + 2)

#define DISPID_UPNPSERVICES_COUNT                (DISPID_UPNPSERVICES + 1)

#define DISPID_UPNPSERVICE_QUERYSTATEVARIABLE    (DISPID_UPNPSERVICE  + 1)
#define DISPID_UPNPSERVICE_INVOKEACTION          (DISPID_UPNPSERVICE  + 2)
#define DISPID_UPNPSERVICE_SERVICETYPEIDENTIFIER (DISPID_UPNPSERVICE  + 3)
#define DISPID_UPNPSERVICE_ADDSTATECHANGECALLBACK   (DISPID_UPNPSERVICE  + 4)
#define DISPID_UPNPSERVICE_SERVICEID             (DISPID_UPNPSERVICE  + 5)
#define DISPID_UPNPSERVICE_LASTTRANSPORTSTATUS   (DISPID_UPNPSERVICE  + 6)

#define DISPID_UPNPDEVICES_COUNT                 (DISPID_UPNPDEVICES  + 1)

#define DISPID_UPNPDEVICE_ISROOTDEVICE           (DISPID_UPNPDEVICE   + 1)
#define DISPID_UPNPDEVICE_ROOT                   (DISPID_UPNPDEVICE   + 2)
#define DISPID_UPNPDEVICE_PARENT                 (DISPID_UPNPDEVICE   + 3)
#define DISPID_UPNPDEVICE_HASCHILDREN            (DISPID_UPNPDEVICE   + 4)
#define DISPID_UPNPDEVICE_CHILDREN               (DISPID_UPNPDEVICE   + 5)
#define DISPID_UPNPDEVICE_UDN                    (DISPID_UPNPDEVICE   + 6)
#define DISPID_UPNPDEVICE_FRIENDLYNAME           (DISPID_UPNPDEVICE   + 7)
#define DISPID_UPNPDEVICE_DEVICETYPE             (DISPID_UPNPDEVICE   + 8)
#define DISPID_UPNPDEVICE_PRESENTATIONURL        (DISPID_UPNPDEVICE   + 9)
#define DISPID_UPNPDEVICE_MANUFACTURERNAME       (DISPID_UPNPDEVICE   + 10)
#define DISPID_UPNPDEVICE_MANUFACTURERURL        (DISPID_UPNPDEVICE   + 11)
#define DISPID_UPNPDEVICE_MODELNAME              (DISPID_UPNPDEVICE   + 12)
#define DISPID_UPNPDEVICE_MODELNUMBER            (DISPID_UPNPDEVICE   + 13)
#define DISPID_UPNPDEVICE_DESCRIPTION            (DISPID_UPNPDEVICE   + 14)
#define DISPID_UPNPDEVICE_MODELURL               (DISPID_UPNPDEVICE   + 15)
#define DISPID_UPNPDEVICE_UPC                    (DISPID_UPNPDEVICE   + 16)
#define DISPID_UPNPDEVICE_SERIALNUMBER           (DISPID_UPNPDEVICE   + 17)
#define DISPID_UPNPDEVICE_LOADSMALLICON          (DISPID_UPNPDEVICE   + 18)
#define DISPID_UPNPDEVICE_LOADICON               (DISPID_UPNPDEVICE   + 19)
#define DISPID_UPNPDEVICE_SERVICES               (DISPID_UPNPDEVICE   + 20)

#define DISPID_UPNPDESCRIPTIONDOC_LOAD           (DISPID_UPNPDESCRIPTIONDOC + 1)
#define DISPID_UPNPDESCRIPTIONDOC_LOADASYNC      (DISPID_UPNPDESCRIPTIONDOC + 2)
#define DISPID_UPNPDESCRIPTIONDOC_LOADERROR      (DISPID_UPNPDESCRIPTIONDOC + 3)
#define DISPID_UPNPDESCRIPTIONDOC_ABORT          (DISPID_UPNPDESCRIPTIONDOC + 4)
#define DISPID_UPNPDESCRIPTIONDOC_ROOTDEVICE     (DISPID_UPNPDESCRIPTIONDOC + 5)
#define DISPID_UPNPDESCRIPTIONDOC_DEVICEBYUDN    (DISPID_UPNPDESCRIPTIONDOC + 6)

[
    object,
    uuid(ADDA3D55-6F72-4319-BFF9-18600A539B10),
    dual,
    helpstring("IUPnPDeviceFinder Interface"),
    oleautomation,
    pointer_default(unique),
    nonextensible
]
interface IUPnPDeviceFinder : IDispatch
{
    [id(DISPID_UPNPFINDDEVICES_FINDBYTYPE),
     helpstring("method FindByType")]
    HRESULT FindByType([in] BSTR bstrTypeURI,
                       [in] DWORD dwFlags,
                       [out, retval] IUPnPDevices ** pDevices);

    [id(DISPID_UPNPFINDDEVICES_CREATEASYNCFIND),
     helpstring("method CreateAsyncFind")]
    HRESULT CreateAsyncFind([in] BSTR bstrTypeURI,
                            [in] DWORD dwFlags,
                            [in] IUnknown * punkDeviceFinderCallback,
                            [out, retval] LONG * plFindData);

    [id(DISPID_UPNPFINDDEVICES_STARTASYNCFIND),
     helpstring("method StartAsyncFind")]
    HRESULT StartAsyncFind([in] LONG lFindData);

    [id(DISPID_UPNPFINDDEVICES_CANCELASYNCFIND),
     helpstring("method CancelAsyncFind")]
    HRESULT CancelAsyncFind([in] LONG lFindData);

    [id(DISPID_UPNPFINDDEVICES_FINDBYUDN),
     helpstring("method FindByUDN")]
    HRESULT FindByUDN([in] BSTR bstrUDN,
                      [out, retval] IUPnPDevice ** pDevice);
};


[
    object,
    uuid(415A984A-88B3-49F3-92AF-0508BEDF0D6C),
    pointer_default(unique)
]
interface IUPnPDeviceFinderCallback : IUnknown
{
    HRESULT DeviceAdded([in] LONG lFindData,
                        [in] IUPnPDevice * pDevice);

    HRESULT DeviceRemoved([in] LONG lFindData,
                          [in] BSTR bstrUDN);

    HRESULT SearchComplete([in] LONG lFindData);
};


[
    object,
    uuid(3F8C8E9E-9A7A-4DC8-BC41-FF31FA374956),
    dual,
    helpstring("IUPnPServices Interface"),
    pointer_default(unique),
    nonextensible
]
interface IUPnPServices : IDispatch
{
    [propget, id(DISPID_UPNPSERVICES_COUNT), helpstring("property Count")]
    HRESULT Count([out, retval] long *plCount);

    [propget, id(DISPID_NEWENUM), restricted, hidden, helpstring("property _NewEnum")]
    HRESULT _NewEnum([out, retval] LPUNKNOWN *ppunk);

    [propget, id(DISPID_VALUE), helpstring("property Item")]
    HRESULT Item([in] BSTR bstrServiceId,
                 [out, retval] IUPnPService ** ppService);
};


[
    object,
    uuid(A295019C-DC65-47DD-90DC-7FE918A1AB44),
    dual,
    helpstring("IUPnPService Interface"),
    oleautomation,
    pointer_default(unique),
    nonextensible

]
interface IUPnPService : IDispatch
{
    [id(DISPID_UPNPSERVICE_QUERYSTATEVARIABLE),
     helpstring("method QueryStateVariable")]
    HRESULT QueryStateVariable([in] BSTR bstrVariableName,
                               [out, retval] VARIANT *pValue);

    [id(DISPID_UPNPSERVICE_INVOKEACTION),
     helpstring("method InvokeAction")]
    HRESULT InvokeAction([in] BSTR bstrActionName,
                         [in] VARIANT vInActionArgs,
                         [in, out] VARIANT * pvOutActionArgs,
                         [out, retval] VARIANT *pvRetVal);

    [propget, id(DISPID_UPNPSERVICE_SERVICETYPEIDENTIFIER),
     helpstring("property ServiceTypeIdentifier")]
    HRESULT ServiceTypeIdentifier([out, retval] BSTR *pVal);

    [id(DISPID_UPNPSERVICE_ADDSTATECHANGECALLBACK),
     helpstring("method AddStateChangeCallback")]
    HRESULT AddCallback([in] IUnknown  * pUnkCallback);

    [propget, id(DISPID_UPNPSERVICE_SERVICEID),
     helpstring("property Id")]
    HRESULT Id([out, retval] BSTR *pbstrId);

    [propget, id(DISPID_UPNPSERVICE_LASTTRANSPORTSTATUS),
     helpstring("property LastTransportStatus")]
    HRESULT LastTransportStatus([out, retval] long * plValue);
};

[
    object,
    uuid(31fadca9-ab73-464b-b67d-5c1d0f83c8b8),
    pointer_default(unique)
]
interface IUPnPServiceCallback : IUnknown
{
    HRESULT
    StateVariableChanged([in]   IUPnPService    * pus,
                         [in]   LPCWSTR         pcwszStateVarName,
                         [in]   VARIANT         vaValue);
    HRESULT
    ServiceInstanceDied([in]    IUPnPService    * pus);

};


[
    object,
    uuid(FDBC0C73-BDA3-4C66-AC4F-F2D96FDAD68C),
    dual,
    helpstring("IUPnPDevices Interface"),
    oleautomation,
    pointer_default(unique),
    nonextensible
]
interface IUPnPDevices : IDispatch
{
    [propget, id(DISPID_UPNPDEVICES_COUNT), helpstring("property Count")]
    HRESULT Count([out, retval] long * plCount);

    [propget, id(DISPID_NEWENUM), restricted, hidden, helpstring("property _NewEnum")]
    HRESULT _NewEnum([out, retval] LPUNKNOWN * ppunk);

    [propget, id(DISPID_VALUE), helpstring("property Item")]
    HRESULT Item([in] BSTR bstrUDN,
                 [out, retval] IUPnPDevice ** ppDevice);
};


[
    object,
    uuid(3D44D0D1-98C9-4889-ACD1-F9D674BF2221),
    dual,
    helpstring("IUPnPDevice Interface"),
    oleautomation,
    pointer_default(unique),
    nonextensible
]
interface IUPnPDevice : IDispatch
{
    [propget, id(DISPID_UPNPDEVICE_ISROOTDEVICE),
     helpstring("denotes whether the device is the highest-level device in the device tree")]
    HRESULT IsRootDevice([out, retval] VARIANT_BOOL * pvarb);

    [propget, id(DISPID_UPNPDEVICE_ROOT),
     helpstring("returns the top device in the device tree")]
    HRESULT RootDevice([out, retval] IUPnPDevice ** ppudRootDevice);

    [propget, id(DISPID_UPNPDEVICE_PARENT),
     helpstring("returns the parent of the current device")]
    HRESULT ParentDevice([out, retval] IUPnPDevice ** ppudDeviceParent);

    [propget, id(DISPID_UPNPDEVICE_HASCHILDREN),
     helpstring("denotes whether the current device contains child devices")]
    HRESULT HasChildren([out, retval] VARIANT_BOOL * pvarb);

    [propget, id(DISPID_UPNPDEVICE_CHILDREN),
     helpstring("returns a collection of the children of the current device")]
    HRESULT Children([out, retval] IUPnPDevices ** ppudChildren);

    [propget, id(DISPID_UPNPDEVICE_UDN),
     helpstring("returns the UDN of the device")]
    HRESULT UniqueDeviceName([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_FRIENDLYNAME),
     helpstring("returns the (optional) display name of the device")]
    HRESULT FriendlyName([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_DEVICETYPE),
     helpstring("returns the device type URI")]
    HRESULT Type([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_PRESENTATIONURL),
     helpstring("obtains a presentation URL to a web page that can control the device")]
    HRESULT PresentationURL([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_MANUFACTURERNAME),
     helpstring("displayable manufacturer name")]
    HRESULT ManufacturerName([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_MANUFACTURERURL),
     helpstring("URL to the manufacturer's website")]
    HRESULT ManufacturerURL([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_MODELNAME),
     helpstring("a displayable string containing the model name")]
    HRESULT ModelName([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_MODELNUMBER),
     helpstring("a displayable string containing the model number")]
    HRESULT ModelNumber([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_DESCRIPTION),
     helpstring("displayable summary of the device's function")]
    HRESULT Description([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_MODELURL),
     helpstring("URL to a webpage containing model-specific information")]
    HRESULT ModelURL([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_UPC),
     helpstring("displayable product code")]
    HRESULT UPC([out, retval] BSTR * pbstr);

    [propget, id(DISPID_UPNPDEVICE_SERIALNUMBER),
     helpstring("displayable serial number")]
    HRESULT SerialNumber([out, retval] BSTR * pbstr);

    [id(DISPID_UPNPDEVICE_LOADICON),
     helpstring("retrieves an url from which an icon of the specified format can be loaded")]
    HRESULT IconURL([in] BSTR bstrEncodingFormat,
                    [in] LONG lSizeX,
                    [in] LONG lSizeY,
                    [in] LONG lBitDepth,
                    [out, retval] BSTR * pbstrIconURL);

    [propget, id(DISPID_UPNPDEVICE_SERVICES),
     helpstring("returns the collection of services exposed by the device")]
    HRESULT Services([out, retval] IUPnPServices ** ppusServices);
};

[
    object,
    uuid(E7772804-3287-418e-9072-CF2B47238981),
    pointer_default(unique)
]
interface IUPnPDeviceDocumentAccess : IUnknown
{
    HRESULT GetDocumentURL([out, retval] BSTR * pbstrDocument);
}

[
    object,
    uuid(11d1c1b2-7daa-4c9e-9595-7f82ed206d1e),
    dual,
    helpstring("IUPnPDescriptionDocument Interface"),
    oleautomation,
    pointer_default(unique),
    nonextensible
]
interface IUPnPDescriptionDocument : IDispatch
{
    [propget, id(DISPID_READYSTATE),
     helpstring("the current status of the document's loading process")]
    HRESULT ReadyState([out, retval] LONG * plReadyState);

    [id(DISPID_UPNPDESCRIPTIONDOC_LOAD),
     helpstring("loads a document synchronously from an URL")]
    HRESULT Load([in] BSTR bstrUrl);

    [id(DISPID_UPNPDESCRIPTIONDOC_LOADASYNC),
     helpstring("starts an asynchronous download, returning immediately")]
    HRESULT LoadAsync([in] BSTR bstrUrl, [in] IUnknown * punkCallback);

    [propget, id(DISPID_UPNPDESCRIPTIONDOC_LOADERROR),
     helpstring("the success or failure code of the completed load operation")]
    HRESULT LoadResult([out, retval] long * phrError);

    [id(DISPID_UPNPDESCRIPTIONDOC_ABORT),
     helpstring("stops an asynchronous loading operation")]
    HRESULT Abort();

    [id(DISPID_UPNPDESCRIPTIONDOC_ROOTDEVICE),
     helpstring("returns the root device of the loaded document's device tree")]
    HRESULT RootDevice([out, retval] IUPnPDevice ** ppudRootDevice);

    [id(DISPID_UPNPDESCRIPTIONDOC_DEVICEBYUDN),
     helpstring("returns a device by its unique device name (UDN)")]
    HRESULT DeviceByUDN([in] BSTR bstrUDN,
                        [out, retval] IUPnPDevice ** ppudDevice);
};

[
    object,
    uuid(77394c69-5486-40d6-9bc3-4991983e02da),
    pointer_default(unique)
]
interface IUPnPDescriptionDocumentCallback : IUnknown
{
    HRESULT LoadComplete([in] HRESULT hrLoadResult);
};

[
    uuid(DB3442A7-A2E9-4A59-9CB5-F5C1A5D901E5),
    version(1.0),
    helpstring("UPnP 1.0 Type Library")
]
library UPNPLib
{
    importlib("stdole2.tlb");

    [
        uuid(E2085F28-FEB7-404A-B8E7-E659BDEAAA02),
        helpstring("UPnPDeviceFinder Class")
    ]
    coclass UPnPDeviceFinder
    {
        [default] interface IUPnPDeviceFinder;
    };
    [
        uuid(B9E84FFD-AD3C-40A4-B835-0882EBCBAAA8),
        helpstring("UPnPDevices Class")
    ]
    coclass UPnPDevices
    {
        [default] interface IUPnPDevices;
    };
    [
        uuid(A32552C5-BA61-457A-B59A-A2561E125E33),
        helpstring("UPnPDevice Class")
    ]
    coclass UPnPDevice
    {
        [default] interface IUPnPDevice;

    };
    [
        uuid(C0BC4B4A-A406-4EFC-932F-B8546B8100CC),
        helpstring("UPnPServices Class")
    ]
    coclass UPnPServices
    {
        [default] interface IUPnPServices;
    };
    [
        uuid(C624BA95-FBCB-4409-8C03-8CCEEC533EF1),
        helpstring("UPnPService Class")
    ]
    coclass UPnPService
    {
        [default] interface IUPnPService;
    };

    [
        uuid(1d8a9b47-3a28-4ce2-8a4b-bd34e45bceeb),
        helpstring("UPnPDescriptionDocument Class")
    ]
    coclass UPnPDescriptionDocument
    {
        [default] interface IUPnPDescriptionDocument;
    };

    [
        oleautomation,
        uuid(6BD34909-54E7-4fbf-8562-7B89709A589A),
        pointer_default(unique)
    ]
    interface IUPnPDeviceHostSetup : IUnknown
    {
        HRESULT AskIfNotAlreadyEnabled([out, retval] VARIANT_BOOL * pbEnabled);
    };

    [
        uuid(B4609411-C81C-4cce-8C76-C6B50C9402C6),
        helpstring("UPnPDeviceHostSetup Class")
    ]
    coclass UPnPDeviceHostSetup
    {
        [default] interface IUnknown;
    };

    interface IUPnPDeviceDocumentAccess;
};