//
// Copyright (c) 2004 Microsoft Corporation. All Rights Reserved.
//
// Abstract:
//
// Interface definition file for the RDP Screen Sharing API.
//
// Author:  WilhelmS
//
// Date:    06/24/2004
//

cpp_quote("#include <winapifamily.h>")

#include <olectl.h>

//
// This file will be processed by the MIDL tool to
// produce the type library (rdpencomapi.tlb) and marshalling code.
//

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

#pragma region Application Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)")

const int DISPID_RDPSRAPI_METHOD_OPEN                            = 100;
const int DISPID_RDPSRAPI_METHOD_CLOSE                           = 101;
const int DISPID_RDPSRAPI_METHOD_SETSHAREDRECT                   = 102;
const int DISPID_RDPSRAPI_METHOD_GETSHAREDRECT                   = 103;
const int DISPID_RDPSRAPI_METHOD_VIEWERCONNECT                   = 104;
const int DISPID_RDPSRAPI_METHOD_VIEWERDISCONNECT                = 105;
const int DISPID_RDPSRAPI_METHOD_TERMINATE_CONNECTION            = 106;
const int DISPID_RDPSRAPI_METHOD_CREATE_INVITATION               = 107;
const int DISPID_RDPSRAPI_METHOD_REQUEST_CONTROL                 = 108;
const int DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_CREATE          = 109;
const int DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_SEND_DATA       = 110;
const int DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_SET_ACCESS      = 111;
const int DISPID_RDPSRAPI_METHOD_PAUSE                           = 112;
const int DISPID_RDPSRAPI_METHOD_RESUME                          = 113;
const int DISPID_RDPSRAPI_METHOD_SHOW_WINDOW                     = 114;
const int DISPID_RDPSRAPI_METHOD_REQUEST_COLOR_DEPTH_CHANGE      = 115;
const int DISPID_RDPSRAPI_METHOD_STARTREVCONNECTLISTENER         = 116;
const int DISPID_RDPSRAPI_METHOD_CONNECTTOCLIENT                 = 117;
const int DISPID_RDPSRAPI_METHOD_SET_RENDERING_SURFACE           = 118;

const int DISPID_RDPSRAPI_PROP_DISPIDVALUE                          = 200;
const int DISPID_RDPSRAPI_PROP_ID                                   = 201;
const int DISPID_RDPSRAPI_PROP_SESSION_PROPERTIES                   = 202;
const int DISPID_RDPSRAPI_PROP_ATTENDEES                            = 203;
const int DISPID_RDPSRAPI_PROP_INVITATIONS                          = 204;
const int DISPID_RDPSRAPI_PROP_INVITATION                           = 205;
const int DISPID_RDPSRAPI_PROP_CHANNELMANAGER                       = 206;
const int DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETNAME              = 207;
const int DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETFLAGS             = 208;
const int DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETPRIORITY          = 209;
const int DISPID_RDPSRAPI_PROP_WINDOWID                             = 210;
const int DISPID_RDPSRAPI_PROP_APPLICATION                          = 211;
const int DISPID_RDPSRAPI_PROP_WINDOWSHARED                         = 212;
const int DISPID_RDPSRAPI_PROP_WINDOWNAME                           = 213;
const int DISPID_RDPSRAPI_PROP_APPNAME                              = 214;
const int DISPID_RDPSRAPI_PROP_APPLICATION_FILTER                   = 215;
const int DISPID_RDPSRAPI_PROP_WINDOW_LIST                          = 216;
const int DISPID_RDPSRAPI_PROP_APPLICATION_LIST                     = 217;
const int DISPID_RDPSRAPI_PROP_APPFILTER_ENABLED                    = 218;
const int DISPID_RDPSRAPI_PROP_APPFILTERENABLED                     = 219;
const int DISPID_RDPSRAPI_PROP_SHARED                               = 220;
const int DISPID_RDPSRAPI_PROP_INVITATIONITEM                       = 221;
const int DISPID_RDPSRAPI_PROP_DBG_CLX_CMDLINE                      = 222;
const int DISPID_RDPSRAPI_PROP_APPFLAGS                             = 223;
const int DISPID_RDPSRAPI_PROP_WNDFLAGS                             = 224;
const int DISPID_RDPSRAPI_PROP_PROTOCOL_TYPE                        = 225;
const int DISPID_RDPSRAPI_PROP_LOCAL_PORT                           = 226;
const int DISPID_RDPSRAPI_PROP_LOCAL_IP                             = 227;
const int DISPID_RDPSRAPI_PROP_PEER_PORT                            = 228;
const int DISPID_RDPSRAPI_PROP_PEER_IP                              = 229;
const int DISPID_RDPSRAPI_PROP_ATTENDEE_FLAGS                       = 230;
const int DISPID_RDPSRAPI_PROP_CONINFO                              = 231;
const int DISPID_RDPSRAPI_PROP_CONNECTION_STRING                    = 232;
const int DISPID_RDPSRAPI_PROP_GROUP_NAME                           = 233;
const int DISPID_RDPSRAPI_PROP_PASSWORD                             = 234;
const int DISPID_RDPSRAPI_PROP_ATTENDEELIMIT                        = 235;
const int DISPID_RDPSRAPI_PROP_REVOKED                              = 236;
const int DISPID_RDPSRAPI_PROP_DISCONNECTED_STRING                  = 237;
const int DISPID_RDPSRAPI_PROP_USESMARTSIZING                       = 238;
const int DISPID_RDPSRAPI_PROP_SESSION_COLORDEPTH                   = 239;
const int DISPID_RDPSRAPI_PROP_REASON                               = 240;
const int DISPID_RDPSRAPI_PROP_CODE                                 = 241;
const int DISPID_RDPSRAPI_PROP_CTRL_LEVEL                           = 242;
const int DISPID_RDPSRAPI_PROP_REMOTENAME                           = 243;
const int DISPID_RDPSRAPI_PROP_COUNT                                = 244;


const int DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED               = 301;
const int DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED            = 302;
const int DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE                  = 303;
const int DISPID_RDPSRAPI_EVENT_ON_ERROR                            = 304;
const int DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED                 = 305;
const int DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED              = 306;
const int DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED             = 307;
const int DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED             = 308;
const int DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST         = 309;
const int DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED           = 310;
const int DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED          = 311;
const int DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN             = 312;
const int DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE            = 313;
const int DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED     = 314;
const int DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED    = 315;
const int DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN                 = 316;
const int DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE                = 317;
const int DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE               = 318;
const int DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN                      = 319;
const int DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE                     = 320;
const int DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE                    = 321;
const int DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE                 = 322;
const int DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED              = 323;
const int DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED                    = 324;
const int DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED  = 325;

const int DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED              = 340;

typedef enum {
	CTRL_LEVEL_MIN           = 0,
	CTRL_LEVEL_INVALID       = 0,
	CTRL_LEVEL_NONE          = 1,
	CTRL_LEVEL_VIEW          = 2,
	CTRL_LEVEL_INTERACTIVE   = 3,
	CTRL_LEVEL_MAX           = 3
} CTRL_LEVEL;

typedef enum {
    ATTENDEE_DISCONNECT_REASON_MIN = 0,
    ATTENDEE_DISCONNECT_REASON_APP = 0,
    ATTENDEE_DISCONNECT_REASON_ERR = 1,
    ATTENDEE_DISCONNECT_REASON_CLI = 2,
    ATTENDEE_DISCONNECT_REASON_MAX = 2
} ATTENDEE_DISCONNECT_REASON;

typedef enum {
    CHANNEL_PRIORITY_LO,
    CHANNEL_PRIORITY_MED,
    CHANNEL_PRIORITY_HI
}   CHANNEL_PRIORITY;

typedef enum {
    CHANNEL_FLAGS_LEGACY       = 0x01,
    CHANNEL_FLAGS_UNCOMPRESSED = 0x02
} CHANNEL_FLAGS;

typedef enum {
    CHANNEL_ACCESS_ENUM_NONE,
    CHANNEL_ACCESS_ENUM_SENDRECEIVE
} CHANNEL_ACCESS_ENUM;

typedef enum {
    ATTENDEE_FLAGS_LOCAL = 1
} RDPENCOMAPI_ATTENDEE_FLAGS;

typedef enum {
    WND_FLAG_PRIVILEGED = 1
} RDPSRAPI_WND_FLAGS;

typedef enum {
    APP_FLAG_PRIVILEGED = 1
} RDPSRAPI_APP_FLAGS;
	
[
    object,
    uuid(aa1e42b5-496d-4ca4-a690-348dcb2ec4ad),
    hidden,
    pointer_default(unique)
]
interface IRDPSRAPIDebug : IUnknown
{
    [
        propput,
        id(DISPID_RDPSRAPI_PROP_DBG_CLX_CMDLINE)
    ]
    HRESULT
    CLXCmdLine(
        [in] BSTR  CLXCmdLine
        );

    [
        propget,
        id(DISPID_RDPSRAPI_PROP_DBG_CLX_CMDLINE)
    ]
    HRESULT CLXCmdLine(
        [out, retval] BSTR* pCLXCmdLine
        );

}; // IRDPSRAPIDebug


///////////////////////////////////////////////////////////////////////////
// REV 2.0 definitions. 
///////////////////////////////////////////////////////////////////////////
interface IRDPSRAPIApplication;

[
    object,
    uuid(beafe0f9-c77b-4933-ba9f-a24cddcc27cf),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIWindow: IDispatch
{
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_ID)
    ]
    HRESULT 
    Id(
        [out, retval] long* pRetVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_APPLICATION)
    ]
    HRESULT 
    Application(
        [out, retval] IRDPSRAPIApplication** pApplication
        );
        
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_SHARED)
    ]
    HRESULT 
    Shared(
        [out, retval] VARIANT_BOOL* pRetVal
        );
    
    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_SHARED)
    ]
    HRESULT 
    Shared(
        [in] VARIANT_BOOL NewVal
        );
        
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_WINDOWNAME)
    ]
    HRESULT 
    Name(
        [out, retval] BSTR* pRetVal
        );

    [
        id(DISPID_RDPSRAPI_METHOD_SHOW_WINDOW)
    ]
    HRESULT 
    Show();

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_WNDFLAGS)
    ]
    HRESULT
    Flags(
        [out, retval] unsigned long* pdwFlags
        );
        
}; // IRDPSRAPIWindow

[
    object,
    uuid(8a05ce44-715a-4116-a189-a118f30a07bd),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIWindowList: IDispatch
{       
    [
        propget, 
        restricted, 
        id(DISPID_NEWENUM)
    ]
    HRESULT 
    _NewEnum(
        [out, retval] IUnknown** retval
        );
        
    [
        propget, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Item(
        [in] long item, 
        [out, retval] IRDPSRAPIWindow** pWindow
        );

}; // IRDPSRAPIWindowList

[
    object,
    uuid(41e7a09d-eb7a-436e-935d-780ca2628324),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIApplication: IDispatch
{
    [
        propget, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Windows(
        [out, retval] IRDPSRAPIWindowList** pWindowList
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_ID)
    ]
    HRESULT 
    Id(
        [out, retval] long* pRetVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_SHARED)
    ]
    HRESULT 
    Shared(
        [out, retval] VARIANT_BOOL* pRetVal
        );

    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_SHARED)
    ]
    HRESULT Shared(
        [in] VARIANT_BOOL NewVal
        ); 

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_APPNAME)
    ]
    HRESULT Name(
        [out, retval] BSTR* pRetVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_APPFLAGS)
    ]
    HRESULT
    Flags(
        [out, retval] unsigned long* pdwFlags
        );

}; // IRDPSRAPIApplication

[
    object,
    uuid(d4b4aeb3-22dc-4837-b3b6-42ea2517849a),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIApplicationList: IDispatch
{
    [
        propget, 
        restricted, 
        id(DISPID_NEWENUM)
    ]
    HRESULT 
    _NewEnum(
        [out, retval] IUnknown** retval
        );

    [
        propget, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Item(
        [in] long item, 
        [out, retval] IRDPSRAPIApplication** pApplication
        );

}; // IRDPSRAPIApplicationList

[
    object,
    uuid(d20f10ca-6637-4f06-b1d5-277ea7e5160d),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIApplicationFilter: IDispatch
{
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_APPLICATION_LIST)
    ]
    HRESULT 
    Applications(
        [out, retval] IRDPSRAPIApplicationList** pApplications
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_WINDOW_LIST)
    ]
    HRESULT 
    Windows(
        [out, retval] IRDPSRAPIWindowList** pWindows
        );
        
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_APPFILTERENABLED)
    ]
    HRESULT 
    Enabled(
        [out, retval] VARIANT_BOOL* pRetVal
        );

    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_APPFILTERENABLED)
    ]
    HRESULT 
    Enabled(
        [in] VARIANT_BOOL NewVal
        );

}; // IRDPSRAPIApplicationFilter

[
    object,
    uuid(339b24f2-9bc0-4f16-9aac-f165433d13d4),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPISessionProperties: IDispatch
{
    [
        propget, 
        id(DISPID_VALUE)
    ] 
    HRESULT 
    Property(
        [in] BSTR PropertyName, 
        [out, retval] VARIANT *pVal
        );
    
    [
        propput, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Property(
        [in] BSTR PropertyName, 
        [in] VARIANT newVal
        );
};

[
    object,
    uuid(4fac1d43-fc51-45bb-b1b4-2b53aa562fa3),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIInvitation: IDispatch
{

    [
    propget, 
        id(DISPID_RDPSRAPI_PROP_CONNECTION_STRING)
    ] 
    HRESULT 
    ConnectionString(
        [out, retval] BSTR *pbstrVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_GROUP_NAME)
    ] 
    HRESULT 
    GroupName(
        [out, retval] BSTR *pbstrVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_PASSWORD)
    ] 
    HRESULT 
    Password(
        [out, retval] BSTR *pbstrVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_ATTENDEELIMIT)
    ]
    HRESULT 
    AttendeeLimit(
        [out, retval] long* pRetVal
        );

    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_ATTENDEELIMIT)
    ]
    HRESULT 
    AttendeeLimit(
        [in] long NewVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_REVOKED)
    ]
    HRESULT 
    Revoked(
        [out, retval] VARIANT_BOOL* pRetVal
        );

    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_REVOKED)
    ]
    HRESULT 
    Revoked(
        [in] VARIANT_BOOL NewVal
        );
        
}; // IRDPSRAPIInvitation

[
    object,
    uuid(4722b049-92c3-4c2d-8a65-f7348f644dcf),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIInvitationManager: IDispatch
{

    [
        propget, 
        restricted, 
        id(DISPID_NEWENUM)
    ]
    HRESULT 
    _NewEnum(
        [out, retval] IUnknown** retval
        );

    [
        propget, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Item(
        [in] VARIANT item,  
        [out, retval] IRDPSRAPIInvitation** ppInvitation
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_COUNT)
    ] 
    HRESULT 
    Count(
        [out, retval] long *pRetVal
        );

    [
        id(DISPID_RDPSRAPI_METHOD_CREATE_INVITATION)
    ]
    HRESULT 
    CreateInvitation(
        [in] BSTR bstrAuthString,
        [in] BSTR bstrGroupName,
        [in] BSTR bstrPassword,
        [in] long AttendeeLimit,
        [out, retval] IRDPSRAPIInvitation** ppInvitation
        );
        
}; // IRDPSRAPIInvitationManager

[
    object,
    uuid(f74049a4-3d06-4028-8193-0a8c29bc2452),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPITcpConnectionInfo : IDispatch
{
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_PROTOCOL_TYPE)
    ] 
    HRESULT 
    Protocol(
        [out, retval] long* plProtocol
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_LOCAL_PORT)
    ] 
    HRESULT 
    LocalPort(
        [out, retval] long* plPort
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_LOCAL_IP)
    ] 
    HRESULT 
    LocalIP(
        [out, retval] BSTR* pbsrLocalIP
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_PEER_PORT)
    ] 
    HRESULT 
    PeerPort(
        [out, retval] long* plPort
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_PEER_IP)
    ] 
    HRESULT 
    PeerIP(
        [out, retval] BSTR* pbstrIP
        );
        
}; // IRDPSRAPITcpConnectionInfo


[
    object,
    uuid(ec0671b3-1b78-4b80-a464-9132247543e3),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIAttendee : IDispatch
{
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_ID)
    ]
    HRESULT 
    Id(
        [out, retval] long* pId
        );
    
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_REMOTENAME)
    ] 
    HRESULT 
    RemoteName(
        [out, retval] BSTR *pVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_CTRL_LEVEL)
    ] 
    HRESULT 
    ControlLevel(
        [out, retval] CTRL_LEVEL *pVal
        );

    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_CTRL_LEVEL)
    ]
    HRESULT 
    ControlLevel(
        [in] CTRL_LEVEL pNewVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_INVITATION)
    ] 
    HRESULT 
    Invitation(
        [out, retval] IRDPSRAPIInvitation** ppVal
        );
        
    [
        id(DISPID_RDPSRAPI_METHOD_TERMINATE_CONNECTION)
    ]
    HRESULT 
    TerminateConnection();


    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_ATTENDEE_FLAGS)
    ] 
    HRESULT 
    Flags(
        [out, retval] long* plFlags
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_CONINFO)
    ] 
    HRESULT 
    ConnectivityInfo(
        [out, retval] IUnknown** ppVal
        );
        
}; // IRDPSRAPIAttendee

[
    object,
    uuid(ba3a37e8-33da-4749-8da0-07fa34da7944),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIAttendeeManager : IDispatch
{
    [
        propget, 
        restricted, 
        id(DISPID_NEWENUM)
    ]
    HRESULT 
    _NewEnum(
        [out, retval] IUnknown** retval
        );

    [
        propget, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Item(
        [in] long id, 
        [out, retval] IRDPSRAPIAttendee** ppItem
        );
}; // IAttendeeManager

[
    object,
    uuid(c187689f-447c-44a1-9c14-fffbb3b7ec17),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIAttendeeDisconnectInfo : IDispatch
{

    [
        propget, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Attendee(
        [out, retval] IRDPSRAPIAttendee** retval
        );
        
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_REASON)
    ]
    HRESULT 
    Reason(
        [out, retval] ATTENDEE_DISCONNECT_REASON* pReason
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_CODE)
    ]
    HRESULT 
    Code(
        [out, retval] long* pVal
        );    

};

[
    object,
    uuid(05e12f95-28b3-4c9a-8780-d0248574a1e0),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIVirtualChannel : IDispatch
{
    [
        id(DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_SEND_DATA)
    ]
    HRESULT
    SendData(
        [in] BSTR             bstrData,
        [in] long             lAttendeeId,
        [in] unsigned long    ChannelSendFlags 
        );

    [
        id(DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_SET_ACCESS)
    ]
    HRESULT
    SetAccess(
        [in] long                lAttendeeId,
        [in] CHANNEL_ACCESS_ENUM AccessType
        );
       
    [
        propget,
        id(DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETNAME)
    ]
    HRESULT
    Name(
        [out, retval] BSTR* pbstrName
        );
        
    [
        propget,
        id(DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETFLAGS)
    ]
    HRESULT
    Flags(
        [out, retval] long* plFlags
        );

    [
        propget,
        id(DISPID_RDPSRAPI_PROP_VIRTUAL_CHANNEL_GETPRIORITY)
    ]
    HRESULT
    Priority(
        [out, retval] CHANNEL_PRIORITY* pPriority
        );    
}; //IVirtual Channel

[
    object,
    uuid(0d11c661-5d0d-4ee4-89df-2166ae1fdfed),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIVirtualChannelManager : IDispatch
{
    [
        propget, 
        restricted, 
        id(DISPID_NEWENUM)
    ]
    HRESULT 
    _NewEnum(
        [out, retval] IUnknown** retval
        );

    [
        propget, 
        id(DISPID_VALUE)
    ]
    HRESULT 
    Item(
        [in] VARIANT  item,
        [out, retval] IRDPSRAPIVirtualChannel** pChannel
        );

    [
        id(DISPID_RDPSRAPI_METHOD_VIRTUAL_CHANNEL_CREATE) 
    ]
    HRESULT
    CreateVirtualChannel(
        [in] BSTR                               bstrChannelName,
        [in] CHANNEL_PRIORITY                   Priority,
        [in] unsigned long                      ChannelFlags,
        [out, retval] IRDPSRAPIVirtualChannel** ppChannel
        );

}; //IRDPSRAPIVirtualChannelList

[
    object,
    uuid(c6bfcd38-8ce9-404d-8ae8-f31d00c65cb5),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPIViewer : IDispatch
{

    [
        id(DISPID_RDPSRAPI_METHOD_VIEWERCONNECT)
    ]
    HRESULT 
    Connect(
        [in] BSTR bstrConnectionString,
        [in] BSTR bstrName,
        [in] BSTR bstrPassword
        );
        
    [
        id(DISPID_RDPSRAPI_METHOD_VIEWERDISCONNECT)
    ]
    HRESULT 
    Disconnect();

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_ATTENDEES)
    ]
    HRESULT 
    Attendees(
        [out, retval] IRDPSRAPIAttendeeManager **ppVal
        );
    
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_INVITATIONS)
    ]
    HRESULT
    Invitations(
        [out, retval] IRDPSRAPIInvitationManager **ppVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_APPLICATION_FILTER)
    ]
    HRESULT 
    ApplicationFilter(
        [out, retval] IRDPSRAPIApplicationFilter **ppVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_CHANNELMANAGER)
    ]
    HRESULT 
    VirtualChannelManager(
        [out, retval] IRDPSRAPIVirtualChannelManager** ppVal
        );


    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_USESMARTSIZING)
    ]
    HRESULT 
    SmartSizing(
        [in] VARIANT_BOOL vbSmartSizing
        );
    
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_USESMARTSIZING)
    ]
    HRESULT 
    SmartSizing(
        [out, retval] VARIANT_BOOL* pvbSmartSizing
        );

    [
        id(DISPID_RDPSRAPI_METHOD_REQUEST_CONTROL)
    ]
    HRESULT 
    RequestControl(
        [in] CTRL_LEVEL CtrlLevel
        );

    [
        propput,
        id(DISPID_RDPSRAPI_PROP_DISCONNECTED_STRING)
    ]
    HRESULT 
    DisconnectedText(
        [in] BSTR bstrDisconnectedText
        );

    [
        propget,
        id(DISPID_RDPSRAPI_PROP_DISCONNECTED_STRING)
    ]
    HRESULT
    DisconnectedText(
        [out, retval] BSTR* pbstrDisconnectedText
        );



    [
        id(DISPID_RDPSRAPI_METHOD_REQUEST_COLOR_DEPTH_CHANGE)
    ]
    HRESULT 
    RequestColorDepthChange(
        [in] long Bpp
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_SESSION_PROPERTIES)
    ]
    HRESULT 
    Properties(
        [out, retval] IRDPSRAPISessionProperties **ppVal
        );

    [
        id(DISPID_RDPSRAPI_METHOD_STARTREVCONNECTLISTENER)
    ]
    HRESULT 
    StartReverseConnectListener(
        [in]          BSTR  bstrConnectionString,
        [in]          BSTR  bstrUserName,
        [in]          BSTR  bstrPassword,            
        [out, retval] BSTR* pbstrReverseConnectString
        );
        
}; // IRDPSRAPIViewer

[
    object,
    uuid(56bfce32-83e9-414d-82e8-f31d01c62cb5),
    dual,
    pointer_default(unique)
]
interface IRDPViewerRenderingSurface : IUnknown
{
    [
        id(DISPID_RDPSRAPI_METHOD_SET_RENDERING_SURFACE)
    ]
    HRESULT 
    SetRenderingSurface(
        [in]          IUnknown*  pRenderingSurface,
        [in]          long		 surfaceWidth,
        [in]          long  	 surfaceHeight            
        );
};  // IRDPViewerRenderingSurface

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

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

[
    object,
    uuid(eeb20886-e470-4cf6-842b-2739c0ec5cfb),
    dual,
    pointer_default(unique)
]
interface IRDPSRAPISharingSession : IDispatch
{
    [
        id(DISPID_RDPSRAPI_METHOD_OPEN)
    ]
    HRESULT 
    Open();        

    [
      id(DISPID_RDPSRAPI_METHOD_CLOSE)
    ]
    HRESULT 
    Close();
    
    [
        propput, 
        id(DISPID_RDPSRAPI_PROP_SESSION_COLORDEPTH)
    ]
    HRESULT 
    ColorDepth(
        [in] long colorDepth
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_SESSION_COLORDEPTH)
    ]
    HRESULT 
    ColorDepth(
        [out, retval] long* pColorDepth
        );


    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_SESSION_PROPERTIES)
    ]
    HRESULT 
    Properties(
        [out, retval] IRDPSRAPISessionProperties **ppVal
        );
        
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_ATTENDEES)
    ]
    HRESULT 
    Attendees(
        [out, retval] IRDPSRAPIAttendeeManager **ppVal
        );
    
    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_INVITATIONS)
    ]
    HRESULT
    Invitations(
        [out, retval] IRDPSRAPIInvitationManager **ppVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_APPLICATION_FILTER)
    ]
    HRESULT 
    ApplicationFilter(
        [out, retval] IRDPSRAPIApplicationFilter **ppVal
        );

    [
        propget, 
        id(DISPID_RDPSRAPI_PROP_CHANNELMANAGER)
    ]
    HRESULT 
    VirtualChannelManager(
        [out, retval] IRDPSRAPIVirtualChannelManager** ppVal
        );

    [
        id(DISPID_RDPSRAPI_METHOD_PAUSE)
    ]
    HRESULT
    Pause();

    [
        id(DISPID_RDPSRAPI_METHOD_RESUME)
    ]
    HRESULT
    Resume();

    [
        id(DISPID_RDPSRAPI_METHOD_CONNECTTOCLIENT)
    ]
    HRESULT 
    ConnectToClient(
        [in] BSTR bstrConnectionString
        );

    [
        id(DISPID_RDPSRAPI_METHOD_SETSHAREDRECT)
    ]
    HRESULT 
    SetDesktopSharedRect(
        [in] long left, 
        [in] long top, 
        [in] long right, 
        [in] long bottom
        );

    [
        id(DISPID_RDPSRAPI_METHOD_GETSHAREDRECT)
    ]
    HRESULT 
    GetDesktopSharedRect(
        [out] long* pleft, 
        [out] long* ptop, 
        [out] long* pright,
        [out] long* pbottom
        );            
};

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

[
    uuid(CC802D05-AE07-4C15-B496-DB9D22AA0A84),
    version(1.0)
]
library RDPCOMAPILib
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

#pragma region Application Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)")
	
	typedef enum {
	    CONST_MAX_CHANNEL_MESSAGE_SIZE          = 1024,
	    CONST_MAX_CHANNEL_NAME_LEN              = 8,
	    CONST_MAX_LEGACY_CHANNEL_MESSAGE_SIZE   = 409600,
	    CONST_ATTENDEE_ID_EVERYONE              = -1,
	    CONST_ATTENDEE_ID_HOST                  = 0, 
	    CONST_CONN_INTERVAL                     = 50
	} RDPENCOMAPI_CONSTANTS;   	
	
	[
	    uuid(98a97042-6698-40e9-8efd-b3200990004b)
	]
	dispinterface _IRDPSessionEvents
	{
	    properties:
	    methods:
	    
	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED)
	    ]
	    void 
	    OnAttendeeConnected(
	        [in] IDispatch* pAttendee
	        );
	        
	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED)
	    ]
	    void 
	    OnAttendeeDisconnected(
	        [in] IDispatch* pDisconnectInfo
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE)
	    ]
	    void 
	    OnAttendeeUpdate(
	        [in] IDispatch* pAttendee
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED)
	    ]
	    void 
	    OnConnectionEstablished();

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED)
	    ]
	    void 
	    OnConnectionFailed();        

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED)
	    ]
	    void 
	    OnConnectionTerminated(
	        [in] long discReason, 
	        [in] long ExtendedInfo
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED)
	    ]
	    void 
	    OnConnectionAuthenticated();
	        
	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_ERROR)
	    ]
	    void 
	    OnError(
	        [in] VARIANT ErrorInfo
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN)
	    ]
	    void 
	    OnApplicationOpen(
	        [in] IDispatch* pApplication
	        );
	        
	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE)
	    ]
	    void 
	    OnApplicationClose(
	        [in] IDispatch* pApplication
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE)
	    ]
	    void 
	    OnApplicationUpdate(
	        [in] IDispatch* pApplication
	        );
	        
	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN)
	    ]
	    void 
	    OnWindowOpen(
	        [in] IDispatch* pWindow
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE)
	    ]
	    void 
	    OnWindowClose(
	        [in] IDispatch* pWindow
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE)
	    ]
	    void 
	    OnWindowUpdate(
	        [in] IDispatch* pWindow
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST)
	    ]
	    void 
	    OnControlLevelChangeRequest(
	        [in] IDispatch* pAttendee,
	        [in] CTRL_LEVEL RequestedLevel
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED)
	    ]
	    void 
	    OnGraphicsStreamPaused();

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED)
	    ]
	    void 
	    OnGraphicsStreamResumed();

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED)
	    ]
	    void OnChannelDataReceived(
	        [in] IUnknown*        pChannel,
	        [in] long             lAttendeeId,
	        [in] BSTR             bstrData
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED)
	    ]
	    void OnChannelDataSent(
	        [in] IUnknown* pChannel,
	        [in] long      lAttendeeId,            
	        [in] long      BytesSent  
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED)
	    ]
	    void OnSharedRectChanged(
	        [in] long      left,            
	        [in] long      top,
	        [in] long      right,
	        [in] long      bottom
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED)
	    ]
	    void OnFocusReleased(
	        [in] int iDirection
	        );

	    [
	        id(DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED)
	    ]
	    void OnSharedDesktopSettingsChanged(
	        [in] long width,
	        [in] long height,
	        [in] long colordepth
	        );

        [
            id(DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED)
        ]
        void 
        OnViewingSizeChanged(
            [in] long      left,            
            [in] long      top,
            [in] long      right,
            [in] long      bottom
        );	        
	        
	}; // _IRDPSessionEvents

	// Any types not mentioned explicitly in an interface method must be
	// listed here in order to appear in the type library.
	[hidden]
	typedef struct __ReferenceRemainingTypes__
	{
	    CTRL_LEVEL __ctrlLevel__;
	    ATTENDEE_DISCONNECT_REASON __attendeeDisconnectReason__;
	    CHANNEL_PRIORITY __channelPriority__;
	    CHANNEL_FLAGS __channelFlags__;
	    CHANNEL_ACCESS_ENUM __channelAccessEnum__; 
	    RDPENCOMAPI_ATTENDEE_FLAGS __rdpencomapiAttendeeFlags__;
	    RDPSRAPI_WND_FLAGS __rdpsrapiWndFlags__; 
	    RDPSRAPI_APP_FLAGS __rdpsrapiAppFlags__;
	} __ReferenceRemainingTypes__;
	
    //
    // CoClasses
    //
    [
        uuid(32be5ed2-5c86-480f-a914-0ff8885a1b3f)
    ]
    coclass RDPViewer
    {
        [default]         interface     IRDPSRAPIViewer;
        [default, source] dispinterface _IRDPSessionEvents;
    };

    ///////////////////////////////////////////////////////////////////////////
    // REV 2.0 co classes
    ///////////////////////////////////////////////////////////////////////////

    [
        uuid(dd7594ff-ea2a-4c06-8fdf-132de48b6510),
        noncreatable
    ]
    coclass RDPSRAPISessionProperties
    {
        [default] interface IRDPSRAPISessionProperties;
    };

    [
        uuid(53d9c9db-75ab-4271-948a-4c4eb36a8f2b),
        noncreatable
    ]
    coclass RDPSRAPIInvitationManager
    {
        [default] interface IRDPSRAPIInvitationManager;
    };

    [
        uuid(49174dc6-0731-4b5e-8ee1-83a63d3868fa),
        noncreatable
    ]
    coclass RDPSRAPIInvitation
    {
        [default] interface IRDPSRAPIInvitation;
    };

    [
        uuid(d7b13a01-f7d4-42a6-8595-12fc8c24e851),
        noncreatable
    ]
    coclass RDPSRAPIAttendeeManager
    {
        [default] interface IRDPSRAPIAttendeeManager;
    };

    [
        uuid(74f93bb5-755f-488e-8a29-2390108aef55),
        noncreatable
    ]
    coclass RDPSRAPIAttendee
    {
        [default] interface IRDPSRAPIAttendee;
    };

    [
        uuid(b47d7250-5bdb-405d-b487-caad9c56f4f8),
        noncreatable
    ]
    coclass RDPSRAPIAttendeeDisconnectInfo
    {
        [default] interface IRDPSRAPIAttendeeDisconnectInfo;
    };

    [
        uuid(e35ace89-c7e8-427e-a4f9-b9da072826bd),
        noncreatable
    ]
    coclass RDPSRAPIApplicationFilter
    {
        [default] interface IRDPSRAPIApplicationFilter;
    };

    [
        uuid(9e31c815-7433-4876-97fb-ed59fe2baa22),
        noncreatable
    ]
    coclass RDPSRAPIApplicationList
    {
        [default] interface IRDPSRAPIApplicationList;
    };

    [
        uuid(c116a484-4b25-4b9f-8a54-b934b06e57fa),
        noncreatable
    ]
    coclass RDPSRAPIApplication
    {
        [default] interface IRDPSRAPIApplication;
    };

    [
        uuid(9c21e2b8-5dd4-42cc-81ba-1c099852e6fa),
        noncreatable
    ]
    coclass RDPSRAPIWindowList
    {
        [default] interface IRDPSRAPIWindowList;
    };

    [
        uuid(03cf46db-ce45-4d36-86ed-ed28b74398bf),
        noncreatable
    ]
    coclass RDPSRAPIWindow
    {
        [default] interface IRDPSRAPIWindow;
    };

    [
        uuid(be49db3f-ebb6-4278-8ce0-d5455833eaee),
        noncreatable
    ]
    coclass RDPSRAPITcpConnectionInfo
    {
        [default] interface IRDPSRAPITcpConnectionInfo;
    };

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

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

    [
        uuid(9B78F0E6-3E05-4A5B-B2E8-E743A8956B65)
    ]
    coclass RDPSession
    {
        [default]         interface     IRDPSRAPISharingSession;
        [default, source] dispinterface _IRDPSessionEvents;
    };     

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

