//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  Component: WSDAPI - Microsoft Web Services for Devices API
// 
//  File: wsdclient.idl
//
//  Abstract: Client interface definitions and typedefs for WSDAPI
//
//  THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT MODIFY IT BY HAND.
//
//--------------------------------------------------------------------------
        
cpp_quote("#include <winapifamily.h>")

#pragma region Desktop Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")

import "oaidl.idl";
import "ocidl.idl";
import "wsdxmldom.h";
import "wsdtypes.h";

//
// Forward definitions
//
interface IWSDAddress;
interface IWSDXMLContext;
interface IWSDiscoveredService;
interface IWSDDeviceProxy;
interface IWSDServiceProxy;
interface IWSDEndpointProxy;
interface IWSDAsyncResult;
interface IWSDAsyncCallback;
interface IWSDMetadataExchange;
interface IWSDEventingStatus;

cpp_quote("HRESULT WINAPI")
cpp_quote("WSDCreateDeviceProxy(")
cpp_quote("    _In_ LPCWSTR pszDeviceId,")
cpp_quote("    _In_ LPCWSTR pszLocalId,")
cpp_quote("    IWSDXMLContext* pContext,")
cpp_quote("    _Outptr_ IWSDDeviceProxy** ppDeviceProxy);")

cpp_quote("HRESULT WINAPI")
cpp_quote("WSDCreateDeviceProxyAdvanced(")
cpp_quote("    _In_ LPCWSTR pszDeviceId,")
cpp_quote("    IWSDAddress* pDeviceAddress,")
cpp_quote("    _In_ LPCWSTR pszLocalId,")
cpp_quote("    IWSDXMLContext* pContext,")
cpp_quote("    _Outptr_ IWSDDeviceProxy** ppDeviceProxy);")

cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7)")
cpp_quote("HRESULT WINAPI")
cpp_quote("WSDCreateDeviceProxy2(")
cpp_quote("    _In_ LPCWSTR pszDeviceId,")
cpp_quote("    _In_ LPCWSTR pszLocalId,")
cpp_quote("    IWSDXMLContext* pContext,")
cpp_quote("    _In_reads_opt_(dwConfigParamCount) WSD_CONFIG_PARAM* pConfigParams,")
cpp_quote("    DWORD dwConfigParamCount,")
cpp_quote("    _Outptr_ IWSDDeviceProxy** ppDeviceProxy);")

cpp_quote("#endif")

//+-------------------------------------------------------------------------
//  IWSDEndpointProxy Interface
//  Description: Messaging proxy to device services
//--------------------------------------------------------------------------
[
    object,
    uuid(1860d430-b24c-4975-9f90-dbb39baa24ec),
    helpstring("IWSDEndpointProxy Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDEndpointProxy : IUnknown
{
    HRESULT SendOneWayRequest(
        [in] const void* pBody,
        [in] const WSD_OPERATION* pOperation);

    HRESULT SendTwoWayRequest(
        [in] const void* pBody,
        [in] const WSD_OPERATION* pOperation,
        [in, optional, annotation("_In_opt_")] const WSD_SYNCHRONOUS_RESPONSE_CONTEXT* pResponseContext);

    HRESULT SendTwoWayRequestAsync(
        [in] const void* pBody,
        [in] const WSD_OPERATION* pOperation,
        [in] IUnknown* pAsyncState,
        [in] IWSDAsyncCallback* pCallback,
        [out, annotation("_Outptr_")] IWSDAsyncResult** pResult);

    HRESULT AbortAsyncOperation(
        [in] IWSDAsyncResult* pAsyncResult);

    HRESULT ProcessFault(
        [in] const WSD_SOAP_FAULT* pFault);        

    HRESULT GetErrorInfo(
        [out, annotation("_Outptr_")] LPCWSTR* ppszErrorInfo); // Note: Deallocate with WSDFreeLinkedMemory
    // Obtain information on the last error. 

    HRESULT GetFaultInfo(
        [out, annotation("_Outptr_")] WSD_SOAP_FAULT** ppFault); // Note: Deallocate with WSDFreeLinkedMemory
};

//+-------------------------------------------------------------------------
//  IWSDServiceProxy Interface
//  Description: Client-side representation of device services
//--------------------------------------------------------------------------
[
    object,
    uuid(d4c7fb9c-03ab-4175-9d67-094fafebf487),
    helpstring("IWSDServiceProxy Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDServiceProxy : IWSDMetadataExchange
{
    HRESULT BeginGetMetadata(
        [out, annotation("_Outptr_")] IWSDAsyncResult** ppResult);

    HRESULT EndGetMetadata(
        [in] IWSDAsyncResult* pResult,
        [out, annotation("_Outptr_")] WSD_METADATA_SECTION_LIST** ppMetadata); // Note: Do not deallocate ppMetadata

    HRESULT GetServiceMetadata(
        [out, annotation("_Outptr_")] WSD_SERVICE_METADATA** ppServiceMetadata); // Note: Do not deallocate ppServiceMetadata

    HRESULT SubscribeToOperation(
        [in] const WSD_OPERATION* pOperation,
        [in] IUnknown* pUnknown,
        [in] const WSDXML_ELEMENT* pAny,
        [out, annotation("_Outptr_opt_")] WSDXML_ELEMENT** ppAny); // Note: Deallocate with WSDFreeLinkedMemory

    HRESULT UnsubscribeToOperation(
        [in] const WSD_OPERATION* pOperation);

    HRESULT SetEventingStatusCallback(
        [in, optional, annotation("_In_opt_")] IWSDEventingStatus* pStatus);

    HRESULT GetEndpointProxy(
        [out, annotation("_Outptr_")] IWSDEndpointProxy** ppProxy);
};

cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7)")
//+-------------------------------------------------------------------------
//  IWSDServiceProxyEventing Interface
//  Description: Client-side eventing representation of device services
//--------------------------------------------------------------------------
[
    object,
    uuid(f9279d6d-1012-4a94-b8cc-fd35d2202bfe),
    helpstring("IWSDServiceProxyEventing Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDServiceProxyEventing : IWSDServiceProxy
{
    //
    // Subscribe
    //
    HRESULT SubscribeToMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_opt_")] IUnknown* pUnknown,
        [in, annotation("_In_opt_")] const WSD_EVENTING_EXPIRES* pExpires,
        [in, annotation("_In_opt_")] const WSDXML_ELEMENT* pAny,
        [out, annotation("_Outptr_opt_")] WSD_EVENTING_EXPIRES** ppExpires,  // Note: Deallocate with WSDFreeLinkedMemory
        [out, annotation("_Outptr_opt_")] WSDXML_ELEMENT** ppAny); // Note: Deallocate with WSDFreeLinkedMemory

    HRESULT BeginSubscribeToMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_opt_")] IUnknown* pUnknown,
        [in, annotation("_In_opt_")] const WSD_EVENTING_EXPIRES* pExpires,
        [in, annotation("_In_opt_")] const WSDXML_ELEMENT* pAny,
        [in, annotation("_In_opt_")] IUnknown* pAsyncState,
        [in, annotation("_In_opt_")] IWSDAsyncCallback* pAsyncCallback,
        [out, annotation("_Outptr_")] IWSDAsyncResult** ppResult);

    HRESULT EndSubscribeToMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_")] IWSDAsyncResult* pResult,
        [out, annotation("_Outptr_opt_")] WSD_EVENTING_EXPIRES** ppExpires,  // Note: Deallocate with WSDFreeLinkedMemory
        [out, annotation("_Outptr_opt_")] WSDXML_ELEMENT** ppAny); // Note: Deallocate with WSDFreeLinkedMemory


    //
    // Unsubscribe
    //
    HRESULT UnsubscribeToMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in] const WSDXML_ELEMENT* pAny);

    HRESULT BeginUnsubscribeToMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_opt_")] const WSDXML_ELEMENT* pAny,
        [in, annotation("_In_opt_")] IUnknown* pAsyncState,
        [in, annotation("_In_opt_")] IWSDAsyncCallback* pAsyncCallback,
        [out, annotation("_Outptr_")] IWSDAsyncResult** ppResult);

    HRESULT EndUnsubscribeToMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_")] IWSDAsyncResult* pResult);


    //
    // Renew
    //
    HRESULT RenewMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_opt_")] const WSD_EVENTING_EXPIRES* pExpires,
        [in, annotation("_In_opt_")] const WSDXML_ELEMENT* pAny,
        [out, annotation("_Outptr_opt_")] WSD_EVENTING_EXPIRES** ppExpires,  // Note: Deallocate with WSDFreeLinkedMemory
        [out, annotation("_Outptr_opt_")] WSDXML_ELEMENT** ppAny); // Note: Do not deallocate ppAny

    HRESULT BeginRenewMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_opt_")] const WSD_EVENTING_EXPIRES* pExpires,
        [in, annotation("_In_opt_")] const WSDXML_ELEMENT* pAny,
        [in, annotation("_In_opt_")] IUnknown* pAsyncState,
        [in, annotation("_In_opt_")] IWSDAsyncCallback* pAsyncCallback,
        [out, annotation("_Outptr_")] IWSDAsyncResult** ppResult);

    HRESULT EndRenewMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_")] IWSDAsyncResult* pResult,
        [out, annotation("_Outptr_opt_")] WSD_EVENTING_EXPIRES** ppExpires,  // Note: Deallocate with WSDFreeLinkedMemory
        [out, annotation("_Outptr_opt_")] WSDXML_ELEMENT** ppAny); // Note: Deallocate with WSDFreeLinkedMemory


    //
    // GetStatus
    //
    HRESULT GetStatusForMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_opt_")] const WSDXML_ELEMENT* pAny,
        [out, annotation("_Outptr_opt_")] WSD_EVENTING_EXPIRES** ppExpires,  // Note: Deallocate with WSDFreeLinkedMemory
        [out, annotation("_Outptr_opt_")] WSDXML_ELEMENT** ppAny); // Note: Do not deallocate ppAny

    HRESULT BeginGetStatusForMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_opt_")] const WSDXML_ELEMENT* pAny,
        [in, annotation("_In_opt_")] IUnknown* pAsyncState,
        [in, annotation("_In_opt_")] IWSDAsyncCallback* pAsyncCallback,
        [out, annotation("_Outptr_")] IWSDAsyncResult** ppResult);

    HRESULT EndGetStatusForMultipleOperations(
        [in, annotation("_In_reads_(dwOperationCount)")] const WSD_OPERATION* pOperations,
        [in] DWORD dwOperationCount,
        [in, annotation("_In_")] IWSDAsyncResult* pResult,
        [out, annotation("_Outptr_opt_")] WSD_EVENTING_EXPIRES** ppExpires,  // Note: Deallocate with WSDFreeLinkedMemory
        [out, annotation("_Outptr_opt_")] WSDXML_ELEMENT** ppAny); // Note: Deallocate with WSDFreeLinkedMemory

};
cpp_quote("#endif")

//+-------------------------------------------------------------------------
//  IWSDDeviceProxy Interface
//  Description: Client-side representation of devices
//--------------------------------------------------------------------------
[
    object,
    uuid(eee0c031-c578-4c0e-9a3b-973c35f409db),
    helpstring("IWSDDeviceProxy Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDDeviceProxy : IUnknown
{
    HRESULT Init(
        [in, annotation("_In_")] LPCWSTR pszDeviceId,
        [in] IWSDAddress* pDeviceAddress,
        [in, annotation("_In_")] LPCWSTR pszLocalId,
        [in, optional, annotation("_In_opt_")] IWSDXMLContext* pContext,
        [in, optional, annotation("_In_opt_")] IWSDDeviceProxy* pSponsor);

    HRESULT BeginGetMetadata(
        [out, annotation("_Outptr_")] IWSDAsyncResult** ppResult);

    HRESULT EndGetMetadata(
        [in] IWSDAsyncResult* pResult);

    HRESULT GetHostMetadata(
        [out, annotation("_Outptr_")] WSD_HOST_METADATA** ppHostMetadata); // Note: Do not deallocate ppHostMetadata

    HRESULT GetThisModelMetadata(
        [out, annotation("_Outptr_")] WSD_THIS_MODEL_METADATA** ppManufacturerMetadata); // Note: Do not deallocate ppManufacturerMetadata

    HRESULT GetThisDeviceMetadata(
        [out, annotation("_Outptr_")] WSD_THIS_DEVICE_METADATA** ppThisDeviceMetadata); // Note: Do not deallocate ppThisDeviceMetadata

    HRESULT GetAllMetadata( 
        [out, annotation("_Outptr_")] WSD_METADATA_SECTION_LIST **ppMetadata); // Note: Do not deallocate ppMetadata

    HRESULT GetServiceProxyById(
        [in, annotation("_In_")] LPCWSTR pszServiceId,
        [out, annotation("_Outptr_")] IWSDServiceProxy** ppServiceProxy);

    HRESULT GetServiceProxyByType(
        [in] const WSDXML_NAME* pType,
        [out, annotation("_Outptr_")] IWSDServiceProxy** ppServiceProxy);

    HRESULT GetEndpointProxy(
        [out, annotation("_Outptr_")] IWSDEndpointProxy** ppProxy);
};

//+-------------------------------------------------------------------------
//  IWSDAsyncResult Interface
//  Description: Represent asynchronous operations
//--------------------------------------------------------------------------
[
    object,
    uuid(11a9852a-8dd8-423e-b537-9356db4fbfb8),
    helpstring("IWSDAsyncResult Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDAsyncResult : IUnknown
{
    HRESULT SetCallback(
        [in] IWSDAsyncCallback* pCallback,
        [in] IUnknown* pAsyncState);

    HRESULT SetWaitHandle(
        [in] HANDLE hWaitHandle);

    HRESULT HasCompleted();

    HRESULT GetAsyncState(
        [out, annotation("_Outptr_")] IUnknown** ppAsyncState);

    HRESULT Abort();

    HRESULT GetEvent(
        [out, annotation("_Out_")] WSD_EVENT* pEvent);

    HRESULT GetEndpointProxy(
        [out, annotation("_Outptr_")] IWSDEndpointProxy** ppEndpoint);
};

//+-------------------------------------------------------------------------
//  IWSDAsyncCallback Interface
//  Description: Callbacks for async operation completion.
//--------------------------------------------------------------------------
[
    object,
    uuid(a63e109d-ce72-49e2-ba98-e845f5ee1666),
    helpstring("IWSDAsyncCallback Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDAsyncCallback : IUnknown
{
    HRESULT AsyncOperationComplete(
        [in] IWSDAsyncResult* pAsyncResult,
        [in] IUnknown* pAsyncState);
};

//+-------------------------------------------------------------------------
//  IWSDMetadataExchange Interface
//  Description: MetadataExchange
//--------------------------------------------------------------------------
[
    object,
    uuid(06996d57-1d67-4928-9307-3d7833fdb846),
    helpstring("IWSDMetadataExchange Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDMetadataExchange : IUnknown
{
		
    HRESULT
    GetMetadata
    (   [out, annotation("_Outptr_")] WSD_METADATA_SECTION_LIST** MetadataOut
    );


};

//+-------------------------------------------------------------------------
//  IWSDEventingStatus Interface
//  Description: Eventing
//--------------------------------------------------------------------------
[
    object,
    uuid(49b17f52-637a-407a-ae99-fbe82a4d38c0),
    helpstring("IWSDEventingStatus Interface"),
    pointer_default(unique),
    restricted,
    local
]
interface IWSDEventingStatus : IUnknown
{
    void SubscriptionRenewed(
        [in, annotation("_In_")] LPCWSTR pszSubscriptionAction);
        
    void SubscriptionRenewalFailed(
        [in, annotation("_In_")] LPCWSTR pszSubscriptionAction, 
        [in] HRESULT hr);
        
    void SubscriptionEnded(
        [in, annotation("_In_")] LPCWSTR pszSubscriptionAction);
};

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */")
#pragma endregion

