/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error This stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __h323priv_h__
#define __h323priv_h__

#ifndef __IH323LineEx_FWD_DEFINED__
#define __IH323LineEx_FWD_DEFINED__
typedef struct IH323LineEx IH323LineEx;
#endif

#ifndef __IKeyFrameControl_FWD_DEFINED__
#define __IKeyFrameControl_FWD_DEFINED__
typedef struct IKeyFrameControl IKeyFrameControl;
#endif

#include "ipmsp.h"

#ifdef __cplusplus
extern "C"{
#endif

  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);

  typedef enum H245_CAPABILITY {
    HC_G711 = 0,HC_G723 = HC_G711 + 1,HC_H263QCIF = HC_G723 + 1,HC_H261QCIF = HC_H263QCIF + 1
  } H245_CAPABILITY;

  extern RPC_IF_HANDLE __MIDL_itf_h323priv_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_h323priv_0000_v0_0_s_ifspec;

#ifndef __IH323LineEx_INTERFACE_DEFINED__
#define __IH323LineEx_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IH323LineEx;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IH323LineEx : public IUnknown {
  public:
    virtual HRESULT WINAPI SetExternalT120Address(WINBOOL fEnable,DWORD dwIP,WORD wPort) = 0;
    virtual HRESULT WINAPI SetDefaultCapabilityPreferrence(DWORD dwNumCaps,H245_CAPABILITY *pCapabilities,DWORD *pWeights) = 0;
    virtual HRESULT WINAPI SetAlias(WCHAR *strAlias,DWORD dwLength) = 0;
  };
#else
  typedef struct IH323LineExVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IH323LineEx *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IH323LineEx *This);
      ULONG (WINAPI *Release)(IH323LineEx *This);
      HRESULT (WINAPI *SetExternalT120Address)(IH323LineEx *This,WINBOOL fEnable,DWORD dwIP,WORD wPort);
      HRESULT (WINAPI *SetDefaultCapabilityPreferrence)(IH323LineEx *This,DWORD dwNumCaps,H245_CAPABILITY *pCapabilities,DWORD *pWeights);
      HRESULT (WINAPI *SetAlias)(IH323LineEx *This,WCHAR *strAlias,DWORD dwLength);
    END_INTERFACE
  } IH323LineExVtbl;
  struct IH323LineEx {
    CONST_VTBL struct IH323LineExVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IH323LineEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IH323LineEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IH323LineEx_Release(This) (This)->lpVtbl->Release(This)
#define IH323LineEx_SetExternalT120Address(This,fEnable,dwIP,wPort) (This)->lpVtbl->SetExternalT120Address(This,fEnable,dwIP,wPort)
#define IH323LineEx_SetDefaultCapabilityPreferrence(This,dwNumCaps,pCapabilities,pWeights) (This)->lpVtbl->SetDefaultCapabilityPreferrence(This,dwNumCaps,pCapabilities,pWeights)
#define IH323LineEx_SetAlias(This,strAlias,dwLength) (This)->lpVtbl->SetAlias(This,strAlias,dwLength)
#endif
#endif
  HRESULT WINAPI IH323LineEx_SetExternalT120Address_Proxy(IH323LineEx *This,WINBOOL fEnable,DWORD dwIP,WORD wPort);
  void __RPC_STUB IH323LineEx_SetExternalT120Address_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IH323LineEx_SetDefaultCapabilityPreferrence_Proxy(IH323LineEx *This,DWORD dwNumCaps,H245_CAPABILITY *pCapabilities,DWORD *pWeights);
  void __RPC_STUB IH323LineEx_SetDefaultCapabilityPreferrence_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IH323LineEx_SetAlias_Proxy(IH323LineEx *This,WCHAR *strAlias,DWORD dwLength);
  void __RPC_STUB IH323LineEx_SetAlias_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IKeyFrameControl_INTERFACE_DEFINED__
#define __IKeyFrameControl_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IKeyFrameControl;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IKeyFrameControl : public IUnknown {
  public:
    virtual HRESULT WINAPI UpdatePicture(void) = 0;
    virtual HRESULT WINAPI PeriodicUpdatePicture(WINBOOL fEnable,DWORD dwInterval) = 0;
  };
#else
  typedef struct IKeyFrameControlVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IKeyFrameControl *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IKeyFrameControl *This);
      ULONG (WINAPI *Release)(IKeyFrameControl *This);
      HRESULT (WINAPI *UpdatePicture)(IKeyFrameControl *This);
      HRESULT (WINAPI *PeriodicUpdatePicture)(IKeyFrameControl *This,WINBOOL fEnable,DWORD dwInterval);
    END_INTERFACE
  } IKeyFrameControlVtbl;
  struct IKeyFrameControl {
    CONST_VTBL struct IKeyFrameControlVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IKeyFrameControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IKeyFrameControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IKeyFrameControl_Release(This) (This)->lpVtbl->Release(This)
#define IKeyFrameControl_UpdatePicture(This) (This)->lpVtbl->UpdatePicture(This)
#define IKeyFrameControl_PeriodicUpdatePicture(This,fEnable,dwInterval) (This)->lpVtbl->PeriodicUpdatePicture(This,fEnable,dwInterval)
#endif
#endif
  HRESULT WINAPI IKeyFrameControl_UpdatePicture_Proxy(IKeyFrameControl *This);
  void __RPC_STUB IKeyFrameControl_UpdatePicture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IKeyFrameControl_PeriodicUpdatePicture_Proxy(IKeyFrameControl *This,WINBOOL fEnable,DWORD dwInterval);
  void __RPC_STUB IKeyFrameControl_PeriodicUpdatePicture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifdef __cplusplus
}
#endif

#endif
