//+---------------------------------------------------------------------------
//
//  Contents:   Conferencing Services Object interfaces
//
//  Copyright 1995 - 2002 Microsoft Corporation. All Rights Reserved.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
// PARTICULAR PURPOSE. 
//----------------------------------------------------------------------------

cpp_quote("//+-------------------------------------------------------------------------")
cpp_quote("//")
cpp_quote("//  Microsoft Windows")
cpp_quote("//  Copyright 1995 - 2002 Microsoft Corporation. All Rights Reserved.")
cpp_quote("//")
cpp_quote("//  File: imsconf2.h")
cpp_quote("//")
cpp_quote("//--------------------------------------------------------------------------")

//////////////////////////////////////////////////////////////////////////////////
// GUID usage:
//
// {068B0700-718C-11d0-8B1A-00A0C91BC90E} - {068B08FF-718C-11d0-8B1A-00A0C91BC90E}
//

import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";

interface INmManager;
interface INmManagerNotify;
interface INmSysInfo;
interface INmMember;
interface INmCall;
interface INmCallNotify;
interface INmConference;
interface INmConferenceNotify;
interface INmChannel;
interface INmChannelNotify;
interface INmChannelData;
interface INmChannelDataNotify;
interface INmChannelFt;
interface INmChannelFtNotify;
interface INmChannelVideo;
interface INmChannelVideoNotify;
interface INmChannelAudio;
interface INmChannelAudioNotify;
interface INmChannelAppShare;
interface INmChannelAppShareNotify;
interface INmFt;
interface INmSharableApp;
interface IEnumNmConference;
interface IEnumNmMember;
interface IEnumNmChannel;
interface IEnumNmCall;
interface IEnumNmSharableApp;


cpp_quote("")
cpp_quote("////////////////////////////////////////////////////////////////////////////")
cpp_quote("//")
cpp_quote("// Constants")
cpp_quote("")


cpp_quote("// NetMeeting Channel Types")
cpp_quote("#define NMCH_NONE                     0x00000000")
cpp_quote("#define NMCH_DATA                     0x00000001")
cpp_quote("#define NMCH_AUDIO                    0x00000002")
cpp_quote("#define NMCH_VIDEO                    0x00000004")
cpp_quote("#define NMCH_SHARE                    0x00000010")
cpp_quote("#define NMCH_FT                       0x00000020")
cpp_quote("#define NMCH_ALL                      0x0000FFFF")
cpp_quote("#define NMCH_SECURE                   0x00010000")

cpp_quote("")
cpp_quote("// Initialization options")
cpp_quote("#define NM_INIT_NORMAL                0x00000000")
cpp_quote("#define NM_INIT_CONTROL               0x00000001")
cpp_quote("#define NM_INIT_NO_LAUNCH             0x00000002")
cpp_quote("#define NM_INIT_BACKGROUND            0x00000005")

cpp_quote("")
cpp_quote("// INmChannelDataNotify.DataReceived dwFlags")
cpp_quote("#define NM_DF_BROADCAST               0x00000010") // data was broadcast to everyone
cpp_quote("#define NM_DF_PRIVATE                 0x00000020") // data was private
cpp_quote("#define NM_DF_SEGMENT_END             0x00000040") // end of data block
cpp_quote("#define NM_DF_SEGMENT_BEGIN           0x00000080") // start of data block

cpp_quote("")
cpp_quote("// Audio")
cpp_quote("#define NM_MAX_AUDIO_LEVEL            0x0000FFFF")

cpp_quote("")
cpp_quote("// Video")
cpp_quote("#define NM_VIDEO_NO_AUTOSIZE          0x00000000")
cpp_quote("#define NM_VIDEO_SMALL                0x00000001")
cpp_quote("#define NM_VIDEO_MEDIUM               0x00000002")
cpp_quote("#define NM_VIDEO_LARGE                0x00000004")
cpp_quote("#define NM_VIDEO_MIN_QUALITY          0x00000000")
cpp_quote("#define NM_VIDEO_MAX_QUALITY          0x0000001F")
cpp_quote("#define NM_VIDEO_SOURCE_DIALOG        0x00000001")
cpp_quote("#define NM_VIDEO_FORMAT_DIALOG        0x00000002")

cpp_quote("")
cpp_quote("// Version Numbers")
cpp_quote("#define NM_VER_UNKNOWN                0x00000000")
cpp_quote("#define NM_VER_1                      0x00000001")
cpp_quote("#define NM_VER_2                      0x00000002")
cpp_quote("#define NM_VER_NetMeeting2_11         0x00000003")
cpp_quote("#define NM_VER_NetMeeting3            0x00000004")
cpp_quote("#define NM_VER_FUTURE                 0x0000000F")
cpp_quote("")


cpp_quote("")
cpp_quote("// User Categories")
cpp_quote("#define NM_CATEGORY_PERSONAL          0x00000001")
cpp_quote("#define NM_CATEGORY_BUSINESS          0x00000002")
cpp_quote("#define NM_CATEGORY_ADULT             0x00000004")
cpp_quote("")

cpp_quote("")
cpp_quote("////////////////////////////////////////////////////////////////////////////")
cpp_quote("//  Error Codes")
cpp_quote("")
cpp_quote("#define NM_E(e) (0x81000000UL | (ULONG) (e))")
cpp_quote("")
cpp_quote("enum {")

cpp_quote("")
cpp_quote("// NetMeeting specific error codes")
cpp_quote("//")
cpp_quote("  NM_S_NEXT_CONFERENCE          = ((ULONG) 0x0201),") // INmSysInfo.SetProperty
cpp_quote("  NM_S_ON_RESTART               = ((ULONG) 0x0202),") // INmSysInfo.SetProperty
cpp_quote("")

cpp_quote("")
cpp_quote("// Call specific error codes")
cpp_quote("//")
cpp_quote("  NM_CALLERR_NOT_INITIALIZED    = NM_E(0x0100),") // Local system not initialized
cpp_quote("  NM_CALLERR_MEDIA              = NM_E(0x0101),") // Invalid channel/media types
cpp_quote("  NM_CALLERR_NAME_RESOLUTION    = NM_E(0x0102),") // Name resolution failed
cpp_quote("  NM_CALLERR_PASSWORD           = NM_E(0x0103),") // Invalid conference password
cpp_quote("  NM_CALLERR_CONFERENCE_NAME    = NM_E(0x0104),") // Problem with the conference name
cpp_quote("  NM_CALLERR_IN_CONFERENCE      = NM_E(0x0105),") // Remote system is in a conference
cpp_quote("  NM_CALLERR_NOT_FOUND          = NM_E(0x0106),") // User/Address not found
cpp_quote("  NM_CALLERR_MCU                = NM_E(0x0107),") // Can't invite MCU into existing conference
cpp_quote("  NM_CALLERR_REJECTED           = NM_E(0x0108),") // Remote system rejected the request
cpp_quote("  NM_CALLERR_AUDIO              = NM_E(0x0109),") // Audio connection failed
cpp_quote("  NM_CALLERR_AUDIO_LOCAL        = NM_E(0x010A),") // Local audio device already in use
cpp_quote("  NM_CALLERR_AUDIO_REMOTE       = NM_E(0x010B),") // Remote audio device in use
cpp_quote("  NM_CALLERR_ALREADY_CALLING    = NM_E(0x01FD),") // Already calling this person
cpp_quote("  NM_CALLERR_LOOPBACK           = NM_E(0x01FE),") // Called Local Machine
cpp_quote("  NM_CALLERR_UNKNOWN            = NM_E(0x01FF),") // Unknown call error
cpp_quote("")
cpp_quote("// other error codes")
cpp_quote("//")
cpp_quote("  NM_E_NOT_INITIALIZED          = NM_E(0x0200),") // INmManager not Initialized
cpp_quote("  NM_E_CHANNEL_ALREADY_EXISTS   = NM_E(0x0201),") // Data channel already exists
cpp_quote("  NM_E_NO_T120_CONFERENCE       = NM_E(0x0202),") // Not in a T.120 data conference
cpp_quote("  NM_E_NOT_ACTIVE               = NM_E(0x0203),") // NetMeeting is not running
cpp_quote("  NM_E_FILE_TOO_BIG             = NM_E(0x0204),") // The file we attempted to send is too big
cpp_quote("  NM_E_USER_CANCELED_SETUP	   = NM_E(0x0205),") // User canceled NetMeeting setup wizard
cpp_quote("  NM_E_ALREADY_RUNNING		   = NM_E(0x0206),") // This means that NetMeeting is already running
cpp_quote("  NM_E_SHARING_NOT_AVAILABLE	   = NM_E(0x0207),") // This means that Shring is not available
cpp_quote("};")
cpp_quote("")

typedef enum tagNmConferenceState{
    NM_CONFERENCE_IDLE                           = 0,
    NM_CONFERENCE_WAITING                        = 1,
    NM_CONFERENCE_INITIALIZING                   = 2,
    NM_CONFERENCE_ACTIVE                         = 3,
} NM_CONFERENCE_STATE;

typedef enum tagNmCallType{
    NM_CALL_DEFAULT                              = 0,
    NM_CALL_T120                                 = 1,
    NM_CALL_H323                                 = 2,
} NM_CALL_TYPE;

typedef enum tagNmAddrType{
    NM_ADDR_UNKNOWN                              = 0,
    NM_ADDR_IP                                   = 1,
    NM_ADDR_MACHINENAME                          = 2,
    NM_ADDR_PSTN                                 = 3,
    NM_ADDR_ULS                                  = 4,
    NM_ADDR_H323_GATEWAY                         = 5,
    NM_ADDR_CALLTO                               = 6,
    NM_ADDR_T120_TRANSPORT                       = 7,
} NM_ADDR_TYPE;

typedef enum tagNmCallState{
    NM_CALL_INVALID                              = 0,
    NM_CALL_INIT                                 = 1,
    NM_CALL_RING                                 = 2,
    NM_CALL_SEARCH                               = 3,
    NM_CALL_WAIT                                 = 4,
    NM_CALL_ACCEPTED                             = 5,
    NM_CALL_REJECTED                             = 6,
    NM_CALL_CANCELED                             = 7,
} NM_CALL_STATE;

typedef enum tagNmMemberNotify{
    NM_MEMBER_ADDED                              = 0,
    NM_MEMBER_REMOVED                            = 1,
    NM_MEMBER_UPDATED                            = 2,
} NM_MEMBER_NOTIFY;

typedef enum tagNmChannelNotify{
    NM_CHANNEL_ADDED                             = 0,
    NM_CHANNEL_REMOVED                           = 1,
    NM_CHANNEL_UPDATED                           = 2,
} NM_CHANNEL_NOTIFY;

typedef enum tagNmFtState{
    NM_FT_INVALID                                = 0,
    NM_FT_SENDING                                = 1,
    NM_FT_RECEIVING                              = 2,
    NM_FT_COMPLETE                               = 3,
} NM_FT_STATE;

typedef enum tagNmAudioState{
    NM_AUDIO_IDLE                                = 0,
    NM_AUDIO_LOCAL_PAUSED                        = 1,
    NM_AUDIO_TRANSFERRING                        = 3,
} NM_AUDIO_STATE;

typedef enum tagNmAudProp{
    NM_AUDPROP_LEVEL                             = 1,
    NM_AUDPROP_PAUSE                             = 2,
} NM_AUDPROP;

typedef enum tagNmVideoState{
    NM_VIDEO_IDLE                                = 0,
    NM_VIDEO_LOCAL_PAUSED                        = 1,
    NM_VIDEO_PREVIEWING                          = 2,
    NM_VIDEO_TRANSFERRING                        = 3,
    NM_VIDEO_BOTH_PAUSED                         = 5,
    NM_VIDEO_REMOTE_PAUSED                       = 7,
} NM_VIDEO_STATE;

typedef enum tagNmVidProp{
    NM_VIDPROP_PAUSE                             = 1,
    NM_VIDPROP_WINDOW_AUTO_SIZE                  = 2,
    NM_VIDPROP_WINDOW_SIZE                       = 3,
    NM_VIDPROP_WINDOW_POSITION                   = 4,
    NM_VIDPROP_WINDOW_TOP_MOST                   = 5,
    NM_VIDPROP_WINDOW_VISIBLE                    = 6,
    NM_VIDPROP_IMAGE_PREFERRED_SIZE              = 7,
    NM_VIDPROP_IMAGE_QUALITY                     = 8,
    NM_VIDPROP_CAMERA_DIALOG                     = 9,
} NM_VIDPROP;

typedef enum tagNmShareState{
    NM_SHARE_UNKNOWN                             = 0,
    NM_SHARE_WORKING_ALONE                       = 1,
    NM_SHARE_COLLABORATING                       = 2,
    NM_SHARE_IN_CONTROL                          = 3,
} NM_SHARE_STATE;

typedef enum tagNmShAppState{
    NM_SHAPP_NOT_SHARED                          = 0,
    NM_SHAPP_SHARED                              = 1,
} NM_SHAPP_STATE;

typedef enum tagNmSysProp{
    NM_SYSPROP_EMAIL_NAME                        = 1,
    NM_SYSPROP_SERVER_NAME                       = 2,
    NM_SYSPROP_RESOLVE_NAME                      = 3,
    NM_SYSPROP_FIRST_NAME                        = 4,
    NM_SYSPROP_LAST_NAME                         = 5,
    NM_SYSPROP_USER_NAME                         = 6,
    NM_SYSPROP_USER_CITY                         = 7,
    NM_SYSPROP_USER_COUNTRY                      = 8,
    NM_SYSPROP_USER_COMMENTS                     = 9,
    NM_SYSPROP_USER_CATEGORY                     = 10,
    NM_SYSPROP_USER_PHONENUM                     = 11,
    NM_SYSPROP_USER_LOCATION                     = 12,
    NM_SYSPROP_H323_GATEWAY                      = 20,
    NM_SYSPROP_H323_GATEWAY_ENABLE               = 21,
    NM_SYSPROP_INSTALL_DIRECTORY                 = 50,
    NM_SYSPROP_APP_NAME                          = 51,
    NM_SYSPROP_LOGGED_ON                         = 69,
    NM_SYSPROP_IS_RUNNING                        = 100,
    NM_SYSPROP_IN_CONFERENCE                     = 101,
	NM_SYSPROP_BUILD_VER						 = 200,
	NM_SYSPROP_DISABLE_H323						 = 201,
	NM_SYSPROP_DISABLE_INITIAL_ILS_LOGON		 = 202,
	NM_SYSPROP_CALLERISRTC						 = 300
} NM_SYSPROP;

typedef enum tagConfn{

// File Transfer
    CONFN_FT_UI                                  = 0x000211,
    CONFN_FT_OFFERED                             = 0x000212,
    CONFN_FT_STARTED                             = 0x000213,
    CONFN_FT_PROGRESS                            = 0x000214,
    CONFN_FT_COMPLETE                            = 0x000215,
    CONFN_FT_CANCELED                            = 0x000216,
// Sharing
    CONFN_CLICK_CONTROL                          = 0x000220,
    CONFN_CLICK_OBSCURE                          = 0x000221,
    CONFN_CLICK_REMOTE_NOT_COLLABORATING         = 0x000222,
    CONFN_CLICK_LOCAL_NOT_COLLABORATING          = 0x000223,

// Call control
    CONFN_CALL_INCOMPATIBLE                      = 0x000400,
    CONFN_CALL_OLDER                             = 0x000401,
    CONFN_CALL_NEWER                             = 0x000402,
    CONFN_CALL_IGNORED                           = 0x000403,
    CONFN_CALL_FAILED                            = 0x000404,
    CONFN_CALL_IN_CONFERENCE                     = 0x000405,

// Manager notifications
    CONFN_NM_STARTED                             = 0x000600,
    CONFN_NM_STOPPED                             = 0x000601,

} CONFN;



// INmObject constants
typedef enum NM_APPID {
	NM_APPID_CHAT				= 1,
	NM_APPID_WHITEBOARD			= 2,
	NM_APPID_T126_WHITEBOARD	= 3,
	NM_APPID_FILE_TRANSFER		= 4,
	NM_APPID_APPSHARING			= 5

} NM_APPID;

typedef enum NM_VUI {
	NM_VUI_CHECK = 0,
	NM_VUI_SHOW = 1
} NM_VUI;

//--------------------------------------------------------------------------
// INmManager Interface
[
    object,
    uuid(068B0701-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmManager : IUnknown
{
    typedef [unique] INmManager *LPNMMANAGER;

	[local]
    HRESULT Initialize(
        [in, out] ULONG * puOptions, // Can be NULL
        [in, out] ULONG * puchCaps); // Can be NULL

	[call_as(Initialize)]
	HRESULT RemoteInitialize(
		[in, out] ULONG * puOptions,
        [in, out] ULONG * puchCaps);

    HRESULT GetSysInfo(
        [out] INmSysInfo **ppSysInfo);

    HRESULT EnumConference(
        [out] IEnumNmConference **ppEnum);

	[local]
    HRESULT CreateConference(
        [out] INmConference **ppConference,
        [in] BSTR bstrName,
        [in] BSTR bstrPassword,
        [in] ULONG uchCaps);

	[call_as(CreateConference)]
    HRESULT RemoteCreateConference(
        [out] INmConference **ppConference,
        [in] BSTR bstrName,
        [in] BSTR bstrPassword,
        [in] ULONG uchCaps);


    HRESULT EnumCall(
        [out] IEnumNmCall **ppEnum);

	[local]
    HRESULT CreateCall(
        [out] INmCall **ppCall,		// Can be NULL
        [in] NM_CALL_TYPE callType,
        [in] NM_ADDR_TYPE addrType,
        [in] BSTR bstrAddr,
        [in] INmConference * pConference);

	[call_as(CreateCall)]
    HRESULT RemoteCreateCall(
        [out] INmCall **ppCall,
        [in] NM_CALL_TYPE callType,
        [in] NM_ADDR_TYPE addrType,
        [in] BSTR bstrAddr,
        [in] INmConference * pConference);

	[local]
    HRESULT CallConference(
        [out] INmCall **ppCall,
        [in] NM_CALL_TYPE callType,
        [in] NM_ADDR_TYPE addrType,
        [in] BSTR bstrAddr,
        [in] BSTR bstrName,
        [in] BSTR bstrPassword);

	[call_as(CallConference)]
    HRESULT RemoteCallConference(
        [out] INmCall **ppCall,
        [in] NM_CALL_TYPE callType,
        [in] NM_ADDR_TYPE addrType,
        [in] BSTR bstrAddr,
        [in] BSTR bstrName,
        [in] BSTR bstrPassword);

}

//--------------------------------------------------------------------------
// INmManagerNotify Interface
[
    object,
    uuid(068B0702-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmManagerNotify : IUnknown
{
    typedef [unique] INmManagerNotify *LPNMMANAGERNOTIFY;

    HRESULT NmUI(
        [in] CONFN uNotify);

    HRESULT ConferenceCreated(
        [in] INmConference *pConference);

    HRESULT CallCreated(
        [in] INmCall *pCall);
}


//--------------------------------------------------------------------------
// INmSysInfo Interface
[
	local,
    object,
    uuid(068B0703-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmSysInfo : IUnknown
{
    typedef [unique] INmSysInfo *LPNMSYSINFO;

    HRESULT IsInstalled(
        void);

    HRESULT GetProperty(
        [in] NM_SYSPROP uProp,
        [out] BSTR *pbstrName);

    HRESULT SetProperty(
        [in] NM_SYSPROP uProp,
        [in] BSTR bstrName);

    HRESULT GetUserData(
        [in] REFGUID rguid,
        [out] BYTE **ppb,
        [out] ULONG *pcb);

    HRESULT SetUserData(
        [in] REFGUID rguid,
        [in] BYTE *pb,
        [in] ULONG cb);

    HRESULT GetNmApp(
        [in] REFGUID rguid,
        [out] BSTR *pbstrApplication,
        [out] BSTR *pbstrCommandLine,
        [out] BSTR *pbstrDirectory);

    HRESULT SetNmApp(
        [in] REFGUID rguid,
        [in] BSTR bstrApplication,
        [in] BSTR bstrCommandLine,
        [in] BSTR bstrDirectory);

    HRESULT GetNmchCaps(
        [out] ULONG *pchCaps);

    HRESULT GetLaunchInfo(
        [out] INmConference **ppConference,	// Can be NULL
        [out] INmMember **ppMember);		// Can be NULL

}


//--------------------------------------------------------------------------
// INmCall Interface
[
    object,
    uuid(068B0704-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmCall : IUnknown
{
    typedef [unique] INmCall *LPNMCALL;

    HRESULT IsIncoming(
        void);

    HRESULT GetState(
        [out] NM_CALL_STATE *pState);

    HRESULT GetName(
        [out] BSTR *pbstrName);

    HRESULT GetAddr(
        [out] BSTR *pbstrAddr,
        [out] NM_ADDR_TYPE *puType);

    HRESULT GetUserData(
        [in] REFGUID rguid,
        [out, size_is(,*pcb)] BYTE **ppb,
        [out] ULONG *pcb);

    HRESULT GetConference(
        [out] INmConference **ppConference);

    HRESULT Accept(
        void);

    HRESULT Reject(
        void);

    HRESULT Cancel(
        void);
}

//--------------------------------------------------------------------------
// INmCallNotify Interface
[
    object,
    uuid(068B0705-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmCallNotify : IUnknown
{
    HRESULT NmUI(
        [in] CONFN uNotify);

    HRESULT StateChanged(
        [in] NM_CALL_STATE uState);

    HRESULT Failed(
        [in] ULONG uError);

    HRESULT Accepted(
        [in] INmConference *pConference);
}

//--------------------------------------------------------------------------
// INmConference Interface
[
    object,
    uuid(068B0710-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmConference : IUnknown
{
    typedef [unique] INmConference *LPNMCONFERENCE;

    HRESULT GetName(
        [out] BSTR *pbstrName);

    HRESULT GetID(
        [out] ULONG *puID);

    HRESULT GetState(
        [out] NM_CONFERENCE_STATE *pState);

    HRESULT GetNmchCaps(
        [out] ULONG *puchCaps);

    HRESULT GetTopProvider(
        [out] INmMember **ppMember);

    HRESULT EnumMember(
        [out] IEnumNmMember **ppEnum);

    HRESULT GetMemberCount(
        [out] ULONG * puCount);

    HRESULT EnumChannel(
        [out] IEnumNmChannel **ppEnum);

    HRESULT GetChannelCount(
        [out] ULONG * puCount);

	[local]
    HRESULT CreateDataChannel(
        [out] INmChannelData **ppChannel, // Can be NULL
        [in] REFGUID rguid);

	[call_as(CreateDataChannel)]
    HRESULT RemoteCreateDataChannel(
        [out] INmChannelData **ppChannel,
        [in] REFGUID rguid);


    HRESULT IsHosting(
        void);

    HRESULT Host(
        void);
        
    HRESULT Leave(
        void);

    HRESULT LaunchRemote(
        [in] REFGUID rguid,
        [in] INmMember *pMember);
}

//--------------------------------------------------------------------------
// INmConferenceNotify Interface
[
    object,
    uuid(068B0711-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmConferenceNotify : IUnknown
{
    HRESULT NmUI(
        [in] CONFN uNotify);

    HRESULT StateChanged(
        [in] NM_CONFERENCE_STATE uState);

    HRESULT MemberChanged(
        [in] NM_MEMBER_NOTIFY uNotify,
        [in] INmMember *pMember);

    HRESULT ChannelChanged(
        [in] NM_CHANNEL_NOTIFY uNotify,
        [in] INmChannel *pChannel);
}

//--------------------------------------------------------------------------
// INmMember Interface
[
    object,
    uuid(068B0712-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmMember : IUnknown
{
    HRESULT GetName(
        [out] BSTR *pbstrName);

    HRESULT GetID(
        [out] ULONG *puID);

    HRESULT GetNmVersion(
        [out] ULONG *puVersion);

    HRESULT GetAddr(
        [out] BSTR *pbstrAddr,
        [out] NM_ADDR_TYPE *puType);

    HRESULT GetUserData(
        [in] REFGUID rguid,
        [out, size_is(,*pcb)] BYTE **ppb,
        [out] ULONG *pcb);

    HRESULT GetConference(
        [out] INmConference **ppConference);

    HRESULT GetNmchCaps(
        [out] ULONG *puchCaps);

    HRESULT GetShareState(
        [out] NM_SHARE_STATE *puState);

    HRESULT IsSelf(
        void);

    HRESULT IsMCU(
        void);

    HRESULT Eject(
        void);
}


//--------------------------------------------------------------------------
// INmChannel Interface
[
    object,
    uuid(068B0720-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannel : IUnknown
{
    HRESULT IsSameAs(
        [in] INmChannel *pChannel);

    HRESULT IsActive(
        void);
        
    HRESULT SetActive(
        [in] BOOL fActive);

    HRESULT GetConference(
        [out] INmConference **ppConference);

    HRESULT GetInterface(
        [out] IID *piid);

    HRESULT GetNmch(
        [out] ULONG *puCh);

    HRESULT EnumMember(
        [out] IEnumNmMember **ppEnum);

    HRESULT GetMemberCount(
        [out] ULONG * puCount);
}


//--------------------------------------------------------------------------
// INmChannelNotify Interface
[
    object,
    uuid(068B0721-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelNotify : IUnknown
{
    HRESULT NmUI(
        [in] CONFN uNotify);

    HRESULT MemberChanged(
        [in] NM_MEMBER_NOTIFY uNotify,
        [in] INmMember *pMember);
}


//--------------------------------------------------------------------------
// INmChannelData Interface
[
    object,
    uuid(068B0722-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelData : INmChannel
{
    HRESULT GetGuid(
        [out] GUID *pguid);

    HRESULT SendData(
        [in] INmMember *pMember,
        [in] ULONG uSize,
        [in, size_is(uSize)] byte *pvBuffer,
        [in] ULONG uOptions);
}


//--------------------------------------------------------------------------
// INmChannelDataNotify Interface
[
    object,
    uuid(068B0723-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelDataNotify : INmChannelNotify
{
    HRESULT DataSent(
        [in] INmMember *pMember,
        [in] ULONG uSize,
        [in, size_is(uSize)] byte *pvBuffer);

    HRESULT DataReceived(
        [in] INmMember *pMember,
        [in] ULONG uSize,
        [in, size_is(uSize)] byte *pvBuffer,
        [in] ULONG dwFlags);
}


//--------------------------------------------------------------------------
// INmChannelAudio Interface
[
    object,
    uuid(068B0724-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelAudio : INmChannel
{
    HRESULT IsIncoming(
        void);

    HRESULT GetState(
        [out] NM_AUDIO_STATE *puState);

    HRESULT GetProperty(
        [in] NM_AUDPROP uID,
        [out] ULONG *puValue);

    HRESULT SetProperty(
        [in] NM_AUDPROP uID,
        [in] ULONG uValue);
}

//--------------------------------------------------------------------------
// INmChannelAudioNotify Interface
[
    object,
    uuid(068B0725-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelAudioNotify : INmChannelNotify
{
    HRESULT StateChanged(
        [in] NM_AUDIO_STATE uState);

    HRESULT PropertyChanged(
        [in] DWORD dwReserved);
}


//--------------------------------------------------------------------------
// INmChannelVideo Interface
[
    object,
    uuid(068B0726-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelVideo : INmChannel
{
    HRESULT IsIncoming(
        void);

    HRESULT GetState(
        [out] NM_VIDEO_STATE *puState);

    HRESULT GetProperty(
        [in] NM_VIDPROP uID,
        [out] ULONG *puValue);

    HRESULT SetProperty(
        [in] NM_VIDPROP uID,
        [in] ULONG uValue);
}


//--------------------------------------------------------------------------
// INmChannelVideoNotify Interface
[
    object,
    uuid(068B0727-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelVideoNotify : INmChannelNotify
{
    HRESULT StateChanged(
        [in] NM_VIDEO_STATE uState);

    HRESULT PropertyChanged(
        [in] DWORD dwReserved);
}




//--------------------------------------------------------------------------
// INmChannelFt Interface
[
    object,
    uuid(068B0728-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelFt : INmChannel
{
	[local]
    HRESULT SendFile(
        [out] INmFt **ppFt,			// Can be NULL
        [in] INmMember *pMember,
        [in] BSTR bstrFile,
        [in] ULONG uOptions);

	[call_as(SendFile)]
    HRESULT RemoteSendFile(
        [out] INmFt **ppFt,
        [in] INmMember *pMember,
        [in] BSTR bstrFile,
        [in] ULONG uOptions);


	[local]
    HRESULT SetReceiveFileDir(
        [in] BSTR bstrDir);

	[call_as(SetReceiveFileDir)]
    HRESULT RemoteSetReceiveFileDir(
        [in] BSTR bstrDir);

    HRESULT GetReceiveFileDir(
        [out] BSTR *pbstrDir);
}


//--------------------------------------------------------------------------
// INmChannelFtNotify Interface
[
    object,
    uuid(068B0729-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelFtNotify : INmChannelNotify
{
    HRESULT FtUpdate(
        [in] CONFN uNotify,
        [in] INmFt *pFt);
}


//--------------------------------------------------------------------------
// INmFt Interface
[
    object,
    uuid(068B0732-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmFt : IUnknown
{
    HRESULT IsIncoming(
        void);

    HRESULT GetState(
        [out] NM_FT_STATE *puState);

    HRESULT GetName(
        [out] BSTR *pbstrName);

    HRESULT GetSize(
        [out] ULONG *puBytes);

    HRESULT GetBytesTransferred(
        [out] ULONG *puBytes);

    HRESULT GetMember(
        [out] INmMember **ppMember);

    HRESULT Cancel(
        void);
}


//--------------------------------------------------------------------------
// INmChannelAppShare Interface
[
    object,
    uuid(068B072A-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelAppShare : INmChannel
{
    HRESULT GetState(
        [out] NM_SHARE_STATE *puState);

    HRESULT SetState(
        [in] NM_SHARE_STATE uState);

    HRESULT EnumSharableApp(
        [out] IEnumNmSharableApp **ppEnum);
}

//--------------------------------------------------------------------------
// INmChannelAppShareNotify Interface
[
    object,
    uuid(068B072B-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelAppShareNotify : INmChannelNotify
{
    HRESULT StateChanged(
        [in] NM_SHAPP_STATE uState,
        [in] INmSharableApp *pApp);
}


//--------------------------------------------------------------------------
// INmSharableApp Interface
[
    object,
    uuid(068B0734-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmSharableApp : IUnknown
{
    HRESULT GetName(
        [out] BSTR *pbstrName);

    HRESULT GetHwnd(
        [out] HWND * phwnd);

     HRESULT GetState(
        [out] NM_SHAPP_STATE *puState);

     HRESULT SetState(
        [in] NM_SHAPP_STATE uState);
}



cpp_quote("")
cpp_quote("////////////////////////////////////////////////////////////////////////////")
cpp_quote("//  Enumerator Definitions")


//--------------------------------------------------------------------------
// IEnumNmConference Interface
[
    object,
    uuid(068B0741-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface IEnumNmConference : IUnknown
{ 
	[local]
    HRESULT Next(
        [in] ULONG cConference,
        [out] INmConference **rgpConference,
        [out] ULONG *pcFetched);

	[call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cConference,
        [out, size_is(cConference), length_is(*pcFetched) ] INmConference **rgpConference,
        [out] ULONG *pcFetched,
		[out] ULONG *pcItems,
		[in] BOOL bGetNumberRemaining);

    HRESULT Skip(
        [in] ULONG cConference);
        
    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumNmConference **ppEnum);
}


//--------------------------------------------------------------------------
// IEnumNmMember Interface
[
    object,
    uuid(068B0742-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface IEnumNmMember : IUnknown
{ 
	[local]
    HRESULT Next(
        [in] ULONG cMember,
        [out] INmMember **rgpMember,
        [out] ULONG *pcFetched);

	[call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cMember,
        [out, size_is(cMember), length_is(*pcFetched) ] INmMember **rgpMember,
        [out] ULONG *pcFetched,
		[out] ULONG *pcItems,
		[in] BOOL bGetNumberRemaining);

    HRESULT Skip(
        [in] ULONG cMember);
        
    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumNmMember **ppEnum);
}


//--------------------------------------------------------------------------
// IEnumNmChannel Interface
[
    object,
    uuid(068B0743-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface IEnumNmChannel : IUnknown
{ 
	[local]
    HRESULT Next(
        [in] ULONG cChannel,
        [out, size_is(cChannel), length_is(*pcFetched)] INmChannel **rgpChannel,
        [out] ULONG *pcFetched);

	[call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cChannel,
        [out, size_is(cChannel), length_is(*pcFetched)] INmChannel **rgpChannel,
        [out] ULONG *pcFetched,
		[out] ULONG *pcItems,
		[in] BOOL bGetNumberRemaining);

    HRESULT Skip(
        [in] ULONG cChannel);
        
    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumNmChannel **ppEnum);
}


//--------------------------------------------------------------------------
// IEnumNmCall Interface
[
    object,
    uuid(068B0744-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface IEnumNmCall : IUnknown
{ 
	[local]
	HRESULT Next(
        [in] ULONG cCall,
        [out] INmCall **rgpCall,
        [out] ULONG *pcFetched);

	[call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cCall,
        [out, size_is(cCall), length_is(*pcFetched)] INmCall **rgpCall,
        [out] ULONG *pcFetched,
		[out] ULONG *pcItems,
		[in] BOOL bGetNumberRemaining);

    HRESULT Skip(
        [in] ULONG cCall);
        
    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumNmCall **ppEnum);
}


//--------------------------------------------------------------------------
// IEnumNmSharableApp Interface
[
    object,
    uuid(068B0745-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface IEnumNmSharableApp : IUnknown
{ 
	[local]
    HRESULT Next(
        [in] ULONG cApp,
        [out] INmSharableApp **rgpApp,
        [out] ULONG *pcFetched);

	[call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG cApp,
        [out, size_is(cApp), length_is(*pcFetched)] INmSharableApp **rgpApp,
        [out] ULONG *pcFetched,
		[out] ULONG *pcItems,
		[in] BOOL bGetNumberRemaining);

    HRESULT Skip(
        [in] ULONG cApp);
        
    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumNmSharableApp **ppEnum);
}

[
	object,
	uuid(068B0780-718C-11d0-8B1A-00A0C91BC90E), // IID_INmObject
	pointer_default(unique)
]
interface INmObject : IUnknown
{
	HRESULT CallDialog([in] long hwnd, [in] int options);

	HRESULT ShowLocal([in] NM_APPID appId);

	[local]		
	HRESULT VerifyUserInfo([in] long hwnd, [in] NM_VUI options);

	[call_as(VerifyUserInfo)]
	HRESULT RemoteVerifyUserInfo([in] long hwnd, [in] NM_VUI options);

};

[
    uuid(068B07FF-718C-11d0-8B1A-00A0C91BC90E),
    version(1.0),
    helpstring("NmManager 2.0 Type Library")
]
library NmManager
{

    [
        uuid(068B0700-718C-11d0-8B1A-00A0C91BC90E),
        helpstring("NetMeeting Manager")
    ]
    coclass NmManager
    {
        [default] interface INmManager;
    };
};
