diff fuhtark_test/include/winapi/mspaddr.h @ 1500:91c8c3b7cbf0

add: futhark tests for generating vulkan api
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 21:36:48 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fuhtark_test/include/winapi/mspaddr.h	Wed Nov 26 21:36:48 2025 +0700
@@ -0,0 +1,274 @@
+#ifndef __MSPADDR_H_
+#define __MSPADDR_H_
+
+typedef struct {
+  LIST_ENTRY Link;
+  MSP_EVENT_INFO MSPEventInfo;
+} MSPEVENTITEM,*PMSPEVENTITEM;
+
+MSPEVENTITEM *AllocateEventItem(SIZE_T nExtraBytes = 0);
+WINBOOL FreeEventItem(MSPEVENTITEM *pEventItemToFree);
+
+typedef HRESULT (*PFNCREATETERM)(CComPtr<IMoniker> pMoniker,MSP_HANDLE htAddress,ITTerminal **pTerm);
+
+typedef struct {
+  DWORD dwMediaType;
+  const CLSID *clsidClassManager;
+  PFNCREATETERM pfnCreateTerm;
+} STATIC_TERMINAL_TYPE;
+
+class ATL_NO_VTABLE CPlugTerminalClassInfo : public IDispatchImpl<ITPluggableTerminalClassInfo,&IID_ITPluggableTerminalClassInfo,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModel>,public CMSPObjectSafetyImpl
+{
+public:
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  virtual HRESULT FinalConstruct(void);
+  BEGIN_COM_MAP(CPlugTerminalClassInfo)
+    COM_INTERFACE_ENTRY(ITPluggableTerminalClassInfo)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(IObjectSafety)
+    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
+  END_COM_MAP()
+public:
+  CPlugTerminalClassInfo() : m_bstrName(NULL),m_bstrCompany(NULL),m_bstrVersion(NULL),m_bstrCLSID(NULL),m_bstrTerminalClass(NULL),m_lMediaType(1),m_Direction(TD_CAPTURE),m_pFTM(NULL)
+  {
+  }
+  ~CPlugTerminalClassInfo() {
+    if(m_bstrName) {
+      SysFreeString(m_bstrName);
+    }
+    if(m_bstrCompany) {
+      SysFreeString(m_bstrCompany);
+    }
+    if(m_bstrVersion) {
+      SysFreeString(m_bstrVersion);
+    }
+    if(m_bstrCLSID) {
+      SysFreeString(m_bstrCLSID);
+    }
+    if(m_bstrTerminalClass) {
+      SysFreeString(m_bstrTerminalClass);
+    }
+    if(m_pFTM) {
+      m_pFTM->Release();
+    }
+  }
+public:
+  STDMETHOD(get_Name)(BSTR *pName);
+  STDMETHOD(get_Company)(BSTR *pCompany);
+  STDMETHOD(get_Version)(BSTR *pVersion);
+  STDMETHOD(get_TerminalClass)(BSTR *pTerminalClass);
+  STDMETHOD(get_CLSID)(BSTR *pCLSID);
+  STDMETHOD(get_Direction)(TERMINAL_DIRECTION *pDirection);
+  STDMETHOD(get_MediaTypes)(long *pMediaTypes);
+private:
+  CMSPCritSection m_CritSect;
+  BSTR m_bstrName;
+  BSTR m_bstrCompany;
+  BSTR m_bstrVersion;
+  BSTR m_bstrTerminalClass;
+  BSTR m_bstrCLSID;
+  long m_lMediaType;
+  TERMINAL_DIRECTION m_Direction;
+  IUnknown *m_pFTM;
+private:
+  STDMETHOD(put_Name)(BSTR bstrName);
+  STDMETHOD(put_Company)(BSTR bstrCompany);
+  STDMETHOD(put_Version)(BSTR bstrVersion);
+  STDMETHOD(put_TerminalClass)(BSTR bstrTerminalClass);
+  STDMETHOD(put_CLSID)(BSTR bstrCLSID);
+  STDMETHOD(put_Direction)(TERMINAL_DIRECTION nDirection);
+  STDMETHOD(put_MediaTypes)(long nMediaTypes);
+  friend class CMSPAddress;
+};
+
+class ATL_NO_VTABLE CPlugTerminalSuperclassInfo : public IDispatchImpl<ITPluggableTerminalSuperclassInfo,&IID_ITPluggableTerminalSuperclassInfo,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModel>,public CMSPObjectSafetyImpl
+{
+public:
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  virtual HRESULT FinalConstruct(void);
+  BEGIN_COM_MAP(CPlugTerminalSuperclassInfo)
+    COM_INTERFACE_ENTRY(ITPluggableTerminalSuperclassInfo)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(IObjectSafety)
+    COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
+  END_COM_MAP()
+public:
+  CPlugTerminalSuperclassInfo() : m_bstrCLSID(NULL),m_bstrName(NULL),m_pFTM(NULL) {
+  }
+  ~CPlugTerminalSuperclassInfo() {
+    if(m_bstrName) {
+      SysFreeString(m_bstrName);
+    }
+    if(m_bstrCLSID) {
+      SysFreeString(m_bstrCLSID);
+    }
+    if(m_pFTM) {
+      m_pFTM->Release();
+    }
+  }
+public:
+  STDMETHOD(get_Name)(BSTR *pName);
+  STDMETHOD(get_CLSID)(BSTR *pCLSID);
+private:
+  CMSPCritSection m_CritSect;
+  BSTR m_bstrCLSID;
+  BSTR m_bstrName;
+  IUnknown *m_pFTM;
+private:
+  STDMETHOD(put_Name)(BSTR bstrName);
+  STDMETHOD(put_CLSID)(BSTR bstrCLSID);
+  friend class CMSPAddress;
+};
+
+class ATL_NO_VTABLE CMSPAddress : public CComObjectRootEx<CComMultiThreadModelNoCS>,public ITMSPAddress,public IDispatchImpl<ITTerminalSupport2,&IID_ITTerminalSupport2,&LIBID_TAPI3Lib>
+{
+public:
+  BEGIN_COM_MAP(CMSPAddress)
+    COM_INTERFACE_ENTRY(ITMSPAddress)
+    COM_INTERFACE_ENTRY(IDispatch)
+    COM_INTERFACE_ENTRY(ITTerminalSupport)
+    COM_INTERFACE_ENTRY(ITTerminalSupport2)
+  END_COM_MAP()
+  DECLARE_GET_CONTROLLING_UNKNOWN()
+  DECLARE_VQI()
+  CMSPAddress();
+  virtual ~CMSPAddress();
+  virtual ULONG MSPAddressAddRef(void) = 0;
+  virtual ULONG MSPAddressRelease(void) = 0;
+  STDMETHOD (Initialize) (MSP_HANDLE htEvent);
+  STDMETHOD (Shutdown) ();
+  STDMETHOD (CreateMSPCall) (MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType,IUnknown *pOuterUnknown,IUnknown **ppMSPCall) = 0;
+  STDMETHOD (ShutdownMSPCall) (IUnknown *pMSPCall) = 0;
+  STDMETHOD (ReceiveTSPData) (IUnknown *pMSPCall,LPBYTE pBuffer,DWORD dwBufferSize);
+  STDMETHOD (GetEvent) (DWORD *pdwSize,BYTE *pBuffer);
+  STDMETHOD (get_StaticTerminals) (VARIANT *pVariant);
+  STDMETHOD (EnumerateStaticTerminals) (IEnumTerminal **ppTerminalEnumerator);
+  STDMETHOD (get_DynamicTerminalClasses) (VARIANT *pVariant);
+  STDMETHOD (EnumerateDynamicTerminalClasses) (IEnumTerminalClass **ppTerminalClassEnumerator);
+  STDMETHOD (CreateTerminal) (BSTR pTerminalClass,long lMediaType,TERMINAL_DIRECTION Direction,ITTerminal **ppTerminal);
+  STDMETHOD (GetDefaultStaticTerminal) (long lMediaType,TERMINAL_DIRECTION Direction,ITTerminal **ppTerminal);
+  STDMETHOD (get_PluggableSuperclasses)(VARIANT *pVariant);
+  STDMETHOD (EnumeratePluggableSuperclasses)(IEnumPluggableSuperclassInfo **ppSuperclassEnumerator);
+  STDMETHOD (get_PluggableTerminalClasses)(BSTR bstrTerminalSuperclass,long lMediaType,VARIANT *pVariant);
+  STDMETHOD (EnumeratePluggableTerminalClasses)(CLSID iidTerminalSuperclass,long lMediaType,IEnumPluggableTerminalClassInfo **ppClassEnumerator);
+protected:
+  virtual HRESULT GetStaticTerminals (DWORD *pdwNumTerminals,ITTerminal **ppTerminals);
+  virtual HRESULT GetDynamicTerminalClasses (DWORD *pdwNumClasses,IID *pTerminalClasses);
+public:
+  virtual WINBOOL IsValidSetOfMediaTypes(DWORD dwMediaType,DWORD dwMask);
+  virtual HRESULT PostEvent(MSPEVENTITEM *EventItem);
+  virtual DWORD GetCallMediaTypes(void) = 0;
+protected:
+  virtual HRESULT IsMonikerInTerminalList(IMoniker *pMoniker);
+  virtual HRESULT UpdateTerminalListForPnp(WINBOOL bDeviceArrival);
+  virtual HRESULT UpdateTerminalList(void);
+  virtual HRESULT ReceiveTSPAddressData(PBYTE pBuffer,DWORD dwSize);
+public:
+  virtual HRESULT PnpNotifHandler(WINBOOL bDeviceArrival);
+protected:
+  HANDLE m_htEvent;
+  LIST_ENTRY m_EventList;
+  CMSPCritSection m_EventDataLock;
+  ITTerminalManager *m_pITTerminalManager;
+  CMSPArray <ITTerminal *> m_Terminals;
+  WINBOOL m_fTerminalsUpToDate;
+  CMSPCritSection m_TerminalDataLock;
+private:
+  static const STATIC_TERMINAL_TYPE m_saTerminalTypes[];
+  static const DWORD m_sdwTerminalTypesCount;
+};
+
+template <class T> HRESULT CreateMSPCallHelper(CMSPAddress *pCMSPAddress,MSP_HANDLE htCall,DWORD dwReserved,DWORD dwMediaType,IUnknown *pOuterUnknown,IUnknown **ppMSPCall,T **ppCMSPCall)
+{
+  LOG((MSP_TRACE,"CreateMSPCallHelper - enter"));
+  HRESULT hr;
+  T *pMSPCall;
+  IUnknown *pUnknown = NULL;
+  if(IsBadReadPtr(pCMSPAddress,sizeof(CMSPAddress))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad address pointer - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadReadPtr(pOuterUnknown,sizeof(IUnknown))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad outer unknown - we require aggregation - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadReadPtr(ppMSPCall,sizeof(IUnknown *))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad iunknown return ptr - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadReadPtr(ppCMSPCall,sizeof(T *))) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - bad class return ptr - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(! pCMSPAddress->IsValidSetOfMediaTypes(dwMediaType,pCMSPAddress->GetCallMediaTypes())) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - unsupported media types - exit TAPI_E_INVALIDMEDIATYPE"));
+    return TAPI_E_INVALIDMEDIATYPE;
+  }
+  CComAggObject<T> *pCall;
+  pCall = new CComAggObject<T>(pOuterUnknown);
+  if(!pCall) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - could not create agg call instance - exit E_OUTOFMEMORY"));
+    return E_OUTOFMEMORY;
+  }
+  hr = pCall->QueryInterface(IID_IUnknown,(void **)&pUnknown);
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - QueryInterface failed: %x",hr));
+    delete pCall;
+    return hr;
+  }
+  hr = pCall->FinalConstruct();
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - FinalConstruct failed: %x.",hr));
+    pUnknown->Release();
+    return hr;
+  }
+  pMSPCall = dynamic_cast<T *>(&(pCall->m_contained));
+  if(!pMSPCall) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - can not cast to agg object to class pointer - exit E_UNEXPECTED"));
+    pUnknown->Release();
+    return E_UNEXPECTED;
+  }
+  hr = pMSPCall->Init(pCMSPAddress,htCall,dwReserved,dwMediaType);
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"CreateMSPCallHelper - call init failed: %x",hr));
+    pUnknown->Release();
+    return hr;
+  }
+  *ppMSPCall = pUnknown;
+  *ppCMSPCall = pMSPCall;
+  LOG((MSP_TRACE,"CreateMSPCallHelper - exit S_OK"));
+  return hr;
+}
+
+template <class T> HRESULT ShutdownMSPCallHelper(IUnknown *pUnknown,T **ppCMSPCall)
+{
+  LOG((MSP_TRACE,"ShutdownMSPCallHelper - enter"));
+  if(IsBadReadPtr(pUnknown,sizeof(IUnknown))) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - bad IUnknown pointer - exit E_POINTER"));
+    return E_POINTER;
+  }
+  if(IsBadWritePtr(ppCMSPCall,sizeof(T *))) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - bad return pointer - exit E_POINTER"));
+    return E_POINTER;
+  }
+  T *pMSPCall;
+  CComAggObject<T> *pCall = dynamic_cast<CComAggObject<T> *> (pUnknown);
+  if(!pCall) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - can't cast unknown to agg object pointer - exit E_UNEXPECTED"));
+    return E_UNEXPECTED;
+  }
+  pMSPCall = dynamic_cast<T *> (&(pCall->m_contained));
+  if(!pMSPCall) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - can't cast contained unknown to class pointer - exit E_UNEXPECTED"));
+    return E_UNEXPECTED;
+  }
+  HRESULT hr = pMSPCall->ShutDown();
+  if(FAILED(hr)) {
+    LOG((MSP_ERROR,"ShutdownMSPCallHelper - ShutDownMSPCall failed: %x",hr));
+    return hr;
+  }
+  *ppCMSPCall = pMSPCall;
+  LOG((MSP_TRACE,"ShutdownMSPCallHelper - exit S_OK"));
+  return S_OK;
+}
+#endif