/*++

Copyright (c) 1999-2000  Microsoft Corporation

Module Name:

    RDSHOST.IDL

Abstract:

    Remote Desktopping Server-Side IDL for Core Remote Desktopping Interfaces
    and Classes

Author:

    Tad Brockway 02/00

Revision History:

--*/

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

    /**
    ** Remote Desktop Sharing class.
    **/
    typedef [
        uuid(34b3166d-870a-4f39-9e2a-09fd8d31ad83),
        helpstring("Remote Desktop Sharing Class")
    ]
    enum {
        [helpstring("REMOTE DESKTOP SHARING CLASS")] DESKTOPSHARING_DEFAULT = 0x0000,
        NO_DESKTOP_SHARING = 0x0001,
        VIEWDESKTOP_PERMISSION_REQUIRE = 0x0002,
        VIEWDESKTOP_PERMISSION_NOT_REQUIRE = 0x0004,
        CONTROLDESKTOP_PERMISSION_REQUIRE = 0x0008,
        CONTROLDESKTOP_PERMISSION_NOT_REQUIRE = 0x00010,
    } REMOTE_DESKTOP_SHARING_CLASS;


    /**
    **  ISAFRemoteDesktopSession Interface
    **/
    cpp_quote("")
    cpp_quote("#define DISPID_RDSSESSION_CHANNELMANAGER			1")
    cpp_quote("#define DISPID_RDSSESSION_CONNECTPARMS			2")
    cpp_quote("#define DISPID_RDSSESSION_SHARINGCLASS			3")
    cpp_quote("#define DISPID_RDSSESSION_ONCONNECTED            4")
    cpp_quote("#define DISPID_RDSSESSION_ONDISCONNECTED			5")
    cpp_quote("#define	DISPID_RDSSESSION_CLOSERDSSESSION		6")
    cpp_quote("#define  DISPID_RDSSESSION_DISCONNECT            7")
    cpp_quote("")
    #define DISPID_RDSSESSION_CHANNELMANAGER            1
    #define DISPID_RDSSESSION_CONNECTPARMS              2
    #define DISPID_RDSSESSION_SHARINGCLASS              3
    #define DISPID_RDSSESSION_ONCONNECTED               4
    #define DISPID_RDSSESSION_ONDISCONNECTED            5
    #define DISPID_RDSSESSION_CLOSERDSSESSION           6
    #define DISPID_RDSSESSION_DISCONNECT                7

    [
        object,
        uuid(9D8C82C9-A89F-42C5-8A52-FE2A77B00E82),
        dual,
        helpstring("ISAFRemoteDesktopSession Interface"),
        pointer_default(unique)
    ]
    interface ISAFRemoteDesktopSession : IDispatch
    {
        [propget, id(DISPID_RDSSESSION_CHANNELMANAGER), helpstring("ChannelManager")] 
            HRESULT ChannelManager([out, retval]ISAFRemoteDesktopChannelMgr **mgr);

        [propget, id(DISPID_RDSSESSION_CONNECTPARMS), helpstring("ConnectParms")] 
            HRESULT ConnectParms([out, retval]BSTR *parms);

        [propput, id(DISPID_RDSSESSION_SHARINGCLASS), helpstring("Sharing Class")] 
            HRESULT SharingClass([in] REMOTE_DESKTOP_SHARING_CLASS sharingClass);
        [propget, id(DISPID_RDSSESSION_SHARINGCLASS), helpstring("Sharing Class")] 
            HRESULT SharingClass([out, retval]REMOTE_DESKTOP_SHARING_CLASS *sharingClass);

        [id(DISPID_RDSSESSION_CLOSERDSSESSION), helpstring("method CloseRemoteDesktopSession")] 
            HRESULT CloseRemoteDesktopSession();
        [id(DISPID_RDSSESSION_DISCONNECT), helpstring("method Disconnect")] 
            HRESULT Disconnect();

        [propput, id(DISPID_RDSSESSION_ONCONNECTED), helpstring("OnConnected")] 
            HRESULT OnConnected([in] IDispatch *iDisp);
        [propput, id(DISPID_RDSSESSION_ONDISCONNECTED), helpstring("OnDisconnected")] 
            HRESULT OnDisconnected([in] IDispatch *iDisp);
    };

    /**
    **  IRDSThreadBridge Interface
    **/
    [
        object,
        uuid(35B9A4B1-7CA6-4aec-8762-1B590056C05D),
        dual,
        helpstring("IRDSThreadBridge Interface"),
        pointer_default(unique)
    ]
    interface IRDSThreadBridge : IUnknown
    {
        [id(1), helpstring("method ClientConnectedNotify")] HRESULT ClientConnectedNotify();
        [id(2), helpstring("method ClientDisconnectedNotify")] HRESULT ClientDisconnectedNotify();
        [id(3), helpstring("method DataReadyNotify")] HRESULT DataReadyNotify([in]BSTR msg);
    };


    /**
    **  ISAFRemoteDesktopServerHost Interface
    **/
    cpp_quote("")
    cpp_quote("#define DISPID_RDSSERVERHOST_CREATERDSSESSION		1")
    cpp_quote("#define DISPID_RDSSERVERHOST_OPENRDSSESSION			2")
    cpp_quote("#define DISPID_RDSSERVERHOST_CLOSERDSSESSION			3")
    cpp_quote("#define DISPID_RDSSERVERHOST_DISCONNECTRDSSESSION	4")
    cpp_quote("#define DISPID_RDSSERVERHOST_CREATERDSSESSIONEX	    5")
    cpp_quote("#define DISPID_RDSSERVERHOST_CONNECTEXPERT           6")
    
    cpp_quote("")
    #define DISPID_RDSSERVERHOST_CREATERDSSESSION       1
    #define DISPID_RDSSERVERHOST_OPENRDSSESSION         2
    #define DISPID_RDSSERVERHOST_CLOSERDSSESSION        3
    #define DISPID_RDSSERVERHOST_DISCONNECTRDSSESSION   4
    #define DISPID_RDSSERVERHOST_CREATERDSSESSIONEX     5
    #define DISPID_RDSSERVERHOST_CONNECTEXPERT          6
    [
        object,
        uuid(C9CCDEB3-A3DD-4673-B495-C1C89494D90E),
        dual,
        helpstring("ISAFRemoteDesktopServerHost Interface"),
        pointer_default(unique)
    ]
    interface ISAFRemoteDesktopServerHost : IDispatch
    {
        [id(DISPID_RDSSERVERHOST_CREATERDSSESSION), helpstring("method CreateRemoteDesktopSession")] 
            HRESULT CreateRemoteDesktopSession(
                        [in] REMOTE_DESKTOP_SHARING_CLASS sharingClass, 
                        [in] BOOL fEnableCallback,
                        [in] LONG timeOut,
                        [in] BSTR userHelpBlob,
                        [out, retval] ISAFRemoteDesktopSession **
                    );
        [id(DISPID_RDSSERVERHOST_CREATERDSSESSIONEX), helpstring("method CreateRemoteDesktopSessionEx")] 
            HRESULT CreateRemoteDesktopSessionEx(
                        [in] REMOTE_DESKTOP_SHARING_CLASS sharingClass, 
                        [in] BOOL fEnableCallback, 
                        [in] LONG timeOut,
                        [in] BSTR userHelpBlob, 
                        [in] LONG tsSessionID,
                        [in] BSTR userSID,
                        [out, retval] ISAFRemoteDesktopSession **
                    );

        [id(DISPID_RDSSERVERHOST_OPENRDSSESSION), helpstring("method OpenRemoteDesktopSession")] 
            HRESULT OpenRemoteDesktopSession([in] BSTR parms, [out, retval] ISAFRemoteDesktopSession **);

        [id(DISPID_RDSSERVERHOST_CLOSERDSSESSION), helpstring("method CloseRemoteDesktopSession")] 
            HRESULT CloseRemoteDesktopSession([in] ISAFRemoteDesktopSession *);

        [id(DISPID_RDSSERVERHOST_CONNECTEXPERT), helpstring("method ConnectToExpert")]
            HRESULT ConnectToExpert([in] BSTR expertConnectParm, [in] LONG timeout, [out, retval] LONG* SafErrorCode);
    };

/**
**  RDSServerHost Type Lib
**/
cpp_quote("")
cpp_quote("#define DISPID_RDSSESSIONSEVENTS_CLIENTCONNECTED		1")
cpp_quote("#define DISPID_RDSSESSIONSEVENTS_CLIENTDISCONNECTED	2")
cpp_quote("")
#define DISPID_RDSSESSIONSEVENTS_CLIENTCONNECTED    1
#define DISPID_RDSSESSIONSEVENTS_CLIENTDISCONNECTED 2

cpp_quote("")
cpp_quote("#define DISPID_RDSCHANNELEVENTS_CHANNELDATAREADY     1")
cpp_quote("")
#define DISPID_RDSCHANNELEVENTS_CHANNELDATAREADY    1
[
    uuid(1B16CE61-2406-412F-969E-21BC082F76E8),
    version(1.0),
    helpstring("RDSServerHost 1.0 Type Library")
]
library RDSSERVERHOSTLib
{
    importlib("stdole2.tlb");

/*  TODO:   Find a way to define this in a common location, instead of in the client and server IDL */
    //
    //  Changes made here must be reflected in the client RDCHost IDL.
    //
    cpp_quote("")
    cpp_quote("#define DISPID_RDSCHANNELEVENTS_CHANNELDATAREADY     1")
    cpp_quote("")
    #define DISPID_RDSCHANNELEVENTS_CHANNELDATAREADY    1
    [
        uuid(59AE79BC-9721-42df-9396-9D98E7F7A396),
        helpstring("_ISAFRemoteDesktopDataChannelEvents Interface")
    ]
    dispinterface _ISAFRemoteDesktopDataChannelEvents
    {
        properties:
        methods:
        [id(DISPID_RDSCHANNELEVENTS_CHANNELDATAREADY), helpstring("method ChannelDataReady")]
            void ChannelDataReady([in]BSTR channelName);
    };


    [
        uuid(8C71C09E-3176-4be6-B294-EA3C41CABB99),
        helpstring("TSRDPServerDataChannel Class")
    ]
    coclass TSRDPServerDataChannel
    {
        [default] interface ISAFRemoteDesktopDataChannel;
        [default, source] dispinterface _ISAFRemoteDesktopDataChannelEvents;
    };

    [
        uuid(92550D33-3272-43b6-B536-2DB08C1D569C),
        helpstring("SAFRemoteDesktopChannelMgr Class")
    ]
    coclass TSRDPServerDataChannelMgr
    {
        [default] interface ISAFRemoteDesktopChannelMgr;
        interface IRDSThreadBridge;
    };

    [
        uuid(5EA6F67B-7713-45F3-B535-0E03DD637345),
        helpstring("RemoteDesktopServerHost Class")
    ]
    coclass SAFRemoteDesktopServerHost
    {
        [default] interface ISAFRemoteDesktopServerHost;
    };
    [
        uuid(434AD1CF-4054-44A8-933F-C69889CA22D7),
        helpstring("_ISAFRemoteDesktopSessionEvents Interface")
    ]
    dispinterface _ISAFRemoteDesktopSessionEvents
    {
        properties:
        methods:

        [id(DISPID_RDSSESSIONSEVENTS_CLIENTCONNECTED), helpstring("method ClientConnected")] 
            void ClientConnected();

        [id(DISPID_RDSSESSIONSEVENTS_CLIENTDISCONNECTED), helpstring("method ClientDisconnected")] 
            void ClientDisconnected();
    };

    [
        uuid(3D5D6889-14CC-4E28-8464-6B02A26F506D),
        helpstring("RemoteDesktopServer Class")
    ]
    coclass SAFRemoteDesktopSession
    {
        [default] interface ISAFRemoteDesktopSession;
        [default, source] dispinterface _ISAFRemoteDesktopSessionEvents;
    };
};




