import "imsconf3.idl";


typedef enum tagNmGkState
{
	NM_GK_INVALID,
	NM_GK_NOT_IN_GK_MODE,
	NM_GK_IDLE,
	NM_GK_LOGGING_ON,
	NM_GK_LOGGED_ON
} NM_GK_STATE;


typedef enum tagNmStreamEvent{
	NM_STREAMEVENT_DEVICE_OPENED                 = 0,
	NM_STREAMEVENT_DEVICE_FAILURE                = 1,
	NM_STREAMEVENT_DEVICE_CLOSED
} NM_STREAMEVENT;

typedef enum tagNmSysOpt{
    NM_SYSOPT_LOGGED_ON                          = 69,
    NM_SYSOPT_BANDWIDTH                          = 70,
    NM_SYSOPT_CAPTURE_DEVICE                     = 71,
    NM_SYSOPT_DIRECTSOUND                        = 72,
    NM_SYSOPT_FULLDUPLEX                         = 73,

} NM_SYSOPT;

typedef enum tagNmGkNotifyCode
{	
	NM_GKNC_INVALID								= 0,	
	NM_GKNC_LOGON_TIMEOUT						= 1,
	NM_GKNC_REG_CONFIRM							= 2,
	NM_GKNC_UNREG_CONFIRM						= 3,						
	NM_GKNC_REJECTED							= 4,			
	NM_GKNC_UNREG_REQ							= 5

} NM_GK_NOTIFY_CODE;



cpp_quote("#define NMCH_SRVC                     0x00000040")

cpp_quote("#define NM_INIT_OBJECT                0x00000004")

// Internal extensions to the NM_ADDR_TYPE
cpp_quote("#define NM_ADDR_ALIAS_ID ((NM_ADDR_TYPE)8)")
cpp_quote("#define NM_ADDR_ALIAS_E164 ((NM_ADDR_TYPE)9)")

// Internal extensions to the NM_AUDPROP
cpp_quote("#define NM_AUDPROP_FULL_DUPLEX ((NM_AUDPROP)3)")
cpp_quote("#define NM_AUDPROP_WAVE_DEVICE ((NM_AUDPROP)4)")
cpp_quote("#define NM_AUDPROP_AUTOMIX ((NM_AUDPROP)5)")
cpp_quote("#define NM_AUDPROP_DTMF_DIGIT ((NM_AUDPROP)6)")

// Internal extensions to the NM_VIDPROP
cpp_quote("#define NM_VIDPROP_SUSPEND_CAPTURE ((NM_VIDPROP)10)")
cpp_quote("#define NM_VIDPROP_IMAGE_SIZES ((NM_VIDPROP)11)")
cpp_quote("#define NM_VIDPROP_FRAME ((NM_VIDPROP)12)")
cpp_quote("#define NM_VIDPROP_NUM_CAPTURE_DEVS ((NM_VIDPROP)13)")
cpp_quote("#define NM_VIDPROP_CAPTURE_DEV_ID ((NM_VIDPROP)14)")
cpp_quote("#define NM_VIDPROP_MAX_CAPTURE_NAME ((NM_VIDPROP)15)")
cpp_quote("#define NM_VIDPROP_CAPTURE_LIST ((NM_VIDPROP)16)")


// Internal extensions to the NM_SYSPROP
cpp_quote("#define NM_SYSPROP_SHARING_MSG ((NM_SYSPROP)61)")
cpp_quote("#define NM_SYSPROP_ICA_ENABLE ((NM_SYSPROP)60)")
cpp_quote("#define NM_SYSPROP_WB_HELPFILE ((NM_SYSPROP)81)")
cpp_quote("#define NM_SYSPROP_CB_HELPFILE ((NM_SYSPROP)82)")

cpp_quote("#define CONFN_FT_FAILED ((CONFN)0x000217)")
cpp_quote("#define CONFN_FT_MULT_CANCELED ((CONFN)0x000218)")
cpp_quote("#define CONFN_FT_REJECTED ((CONFN)0x000219)")
cpp_quote("#define CONFN_FT_RECDIR ((CONFN)0x00021A)")

//--------------------------------------------------------------------------
// INmManager2 Interface
[
    object,
    uuid(068B0801-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmManager2 : INmManager
{
    HRESULT GetPreviewChannel(
        [out] INmChannelVideo **ppChannelVideo);

    //
    // BOGUS BOGUS BOGUS -- For RDS service since it is put into system
    // directory.
    //
    HRESULT CreateASObject(
        [in] IUnknown * pASNotify,
        [in] ULONG      flags,
        [out] IUnknown ** ppAS);

	HRESULT AllowH323(
		[in] BOOL fAllowH323);

    HRESULT CallEx(
        [out] INmCall **ppCall,		// Can be NULL
        [in] DWORD dwFlags,
        [in] NM_ADDR_TYPE addrType,
        [in] BSTR bstrName,
        [in] BSTR bstrSetup,
        [in] BSTR bstrDest,
        [in] BSTR bstrAlias,
        [in] BSTR bstrURL,
        [in] BSTR bstrConference,
        [in] BSTR bstrPassword,
        [in] BSTR bstrUserData);

    HRESULT CreateConferenceEx(
        [out] INmConference **ppConference,     // Can be NULL
        [in]  BSTR bstrName,
        [in]  BSTR bstrPassword,
        [in]  DWORD dwTypeFlags,
        [in]  DWORD attendeePermissions,
        [in]  DWORD maxParticipants);
}


//--------------------------------------------------------------------------
// INmSysInfo2 Interface
[
    object,
    uuid(068B0803-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmSysInfo2 : INmSysInfo
{
    HRESULT GetOption(
        [in] NM_SYSOPT uOption,
        [out] ULONG * plValue);
    HRESULT SetOption(
        [in] NM_SYSOPT uOption,
        [in] ULONG plValue);
    HRESULT ProcessSecurityData(
    	[in] DWORD dwTaskCode,
    	[in] DWORD_PTR dwParam1,
    	[in] DWORD_PTR dwParam2,
    	[out] DWORD * pdwResult);
    HRESULT GkLogon(
        [in] BSTR bstrAddr,
        [in] BSTR bstrAliasID,
        [in] BSTR bstrAliasE164);
    HRESULT GkLogoff();
    HRESULT GkState(
        [out] NM_GK_STATE* plState);
}

//--------------------------------------------------------------------------
// INmSysInfoNotify Interface
[
	object,
	uuid(AF9A9EAF-41BC-11d2-930E-0000F875AE17),
	pointer_default(unique)
]
interface INmSysInfoNotify : IUnknown
{
	HRESULT GateKeeperNotify( [in] NM_GK_NOTIFY_CODE GkEvent );
}


//--------------------------------------------------------------------------
// INmCallNotify2 Interface
[
    object,
    uuid(068B0805-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmCallNotify2 : INmCallNotify
{
    HRESULT CallError(
        [in] UINT cns);

    HRESULT RemoteConference(
        [in] BOOL fMCU,
        [in] BSTR *pwszConfNames,
        [in, out] BSTR *pbstrConfToJoin);

    HRESULT RemotePassword(
        [in] BSTR bstrConference,
        [in, out] BSTR *pbstrPassword,
        [in] BYTE *pb,
        [in] DWORD cb,
        [in] BOOL fIsService);
}


//--------------------------------------------------------------------------
// INmConference2 Interface
[
    object,
    uuid(068B0810-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmConference2 : INmConference
{
    HRESULT DisconnectAV(
        [in] INmMember *pMember);
    HRESULT ConnectAV(
        [in] INmMember *pMember);
    HRESULT GetConferenceHandle(
        [out] HANDLE_PTR *pdwHandle);

    HRESULT CreateDataChannelEx(
        [out] INmChannelData **ppChannel,
        [in] REFGUID rguid,
        [in] BYTE * pER);

}

// INmConferenceNotify2 Interface
// same as above interface but also provides stream event notifications
[
    object,
    uuid(711ec740-6867-11d2-a9a8-00c04fd91a6f),
    pointer_default(unique)
]
interface INmConferenceNotify2 : INmConferenceNotify
{
	HRESULT StreamEvent(
	    [in] NM_STREAMEVENT uEvent,
		[in] UINT uSubCode,
		[in] INmChannel *pChannel);
}


//--------------------------------------------------------------------------
// INmChannelData2 Interface
[
    object,
    uuid(068B0822-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelData2 : INmChannelData
{
    HRESULT RegistryAllocateHandle(
    [in]	ULONG numberOfHandlesRequested);
}


//--------------------------------------------------------------------------
// INmChannelDataNotify2 Interface
[
    object,
    uuid(068B0823-718C-11d0-8B1A-00A0C91BC90E),
    pointer_default(unique)
]
interface INmChannelDataNotify2 : INmChannelDataNotify
{
    HRESULT AllocateHandleConfirm(
        [in] ULONG handle_value,
        [in] ULONG chandles);
}



//--------------------------------------------------------------------------
// IInternalFtObj
[
    object,
    uuid(053BBEFB-B3BA-11d2-9358-0000F875AE17),
    pointer_default(unique)
]
interface IInternalFtObj : IUnknown
{
	HRESULT GetHEvent(UINT *phEvent);
	HRESULT OnFileProgress(UINT hFile, ULONG lFileSize, ULONG lBytesTransmitted);
	HRESULT FileTransferDone();
	HRESULT OnError();
}


//--------------------------------------------------------------------------
// IInternalMemberObj
[
    object,
    uuid(6EC88CF8-A41B-11d2-9349-0000F875AE17),
    pointer_default(unique)
]
interface IInternalMemberObj : IUnknown
{
    HRESULT GetInternalINmMember([out] INmMember** ppMember);
}

//--------------------------------------------------------------------------
// IInternalSysInfoObj
[
    object,
    uuid(34871E81-D33A-11d2-92C7-00C04F68D5AE),
    pointer_default(unique)
]
interface IInternalSysInfoObj : IUnknown
{
	HRESULT SetID([in] DWORD ID);
}

//--------------------------------------------------------------------------
// IInternalConfExe
[
    object,
    uuid(97799F9C-A969-11d2-9355-0000F875AE17),
    pointer_default(unique)
]
interface IInternalConfExe : IUnknown
{
	HRESULT LoggedIn();
	HRESULT IsRunning();
	HRESULT InConference();
	HRESULT LDAPLogon([in] BOOL bLogon);
	HRESULT GetLocalCaps([out] DWORD* pdwLocalCaps);
	HRESULT IsNetMeetingRunning();
	HRESULT GetActiveConference([out] INmConference** ppConf);
	HRESULT ShellCalltoProtocolHandler([in] BSTR url, [in] BOOL bStrict);
	HRESULT Launch();
	HRESULT LaunchApplet([in] NM_APPID appid, [in,ptr] BSTR strCmdLine);
    HRESULT GetUserData([in] REFGUID rguid, [out, size_is(,*pcb)] BYTE **ppb, [out] ULONG *pcb);
    HRESULT SetUserData([in] REFGUID rguid, [in, size_is(cb)] BYTE *pb, [in] ULONG cb);
	HRESULT SetSysInfoID([in] DWORD dwID);
	HRESULT DisableH323([in] BOOL bDisableH323);
	HRESULT DisableInitialILSLogon([in] BOOL bDisableH323);
	HRESULT SetCallerIsRTC([in] BOOL bCallerIsRTC);
}


//--------------------------------------------------------------------------
// IInternalConferenceObj
[
    object,
    uuid(507708C5-A74A-11d2-9351-0000F875AE17),
    pointer_default(unique)
]
interface IInternalConferenceObj : IUnknown
{
    HRESULT GetInternalINmConference([out] INmConference** ppConference);
	HRESULT GetMemberFromNodeID([in] DWORD dwNodeID, [out] INmMember** ppMember);
	HRESULT RemoveAllMembersAndChannels();
	HRESULT AppSharingStateChanged([in] BOOL bActive);
	HRESULT SharableAppStateChanged([in] HWND hWnd, [in] NM_SHAPP_STATE state);
	HRESULT ASLocalMemberChanged();
	HRESULT ASMemberChanged([in] UINT gccID);
	HRESULT FireNotificationsToSyncState();
	HRESULT AppSharingChannelChanged();
	HRESULT FireNotificationsToSyncToInternalObject();
	HRESULT EnsureFTChannel();
	HRESULT AudioChannelActiveState(BOOL bActive, BOOL bIsIncoming);
	HRESULT VideoChannelActiveState(BOOL bActive, BOOL bIsIncoming);
	HRESULT VideoChannelPropChanged(DWORD dwProp, BOOL bIsIncoming);
	HRESULT VideoChannelStateChanged(NM_VIDEO_STATE uState, BOOL bIsIncoming);
}


//--------------------------------------------------------------------------
// IInternalChannelObj
[
    object,
    uuid(43DB3A8E-A440-11d2-934A-0000F875AE17),
    pointer_default(unique)
]
interface IInternalChannelObj : IUnknown
{
    HRESULT GetInternalINmChannel([out] INmChannel** ppChannel);
	HRESULT ChannelRemoved();
	HRESULT NotifySinksOfLocalMember();
	HRESULT NotifySinksOfAllMembers();
	HRESULT Activate([in] BOOL bActive);
	HRESULT SDKMemberChanged([in] INmMember* pSDKMember);
	HRESULT SDKMemberAdded([in] INmMember* pSDKMember);
	HRESULT SDKMemberRemoved([in] INmMember* pSDKMember);
	HRESULT FireNotificationsToSyncState();
}

//--------------------------------------------------------------------------
// IInternalCall
[
    object,
    uuid(57E03C63-A719-11d2-9351-0000F875AE17),
    pointer_default(unique)
]
interface IInternalCallObj : IUnknown
{
    HRESULT GetInternalINmCall([out] INmCall** ppCall);
}


[
    uuid(507708CA-A74A-11d2-9351-0000F875AE17),
    version(1.0),
    helpstring("NetMeeting Internal SDK Type Library")
]
library SDKInternal
{
    [
        uuid(507708CC-A74A-11d2-9351-0000F875AE17),
        helpstring("NmSysInfo object")
    ]
    coclass NmSysInfo
    {
        [default] interface INmSysInfo;
    };

	[
        uuid(068B0800-718C-11d0-8B1A-00A0C91BC90E),
        helpstring("NetMeeting Manager v2")
    ]
    coclass NmManager2
    {
        [default] interface INmManager2;
    };

};


