|
|
//
// mproxy.h
//
#ifndef MPROXY_H
#define MPROXY_H
#include "private.h"
#include "marshal.h"
#include "mstub.h"
#include "ptrary.h"
#include "strary.h"
#include "transmit.h"
IUnknown *ProxyCreator(SYSTHREAD *psfn, REFIID riid, ULONG ulStubId, DWORD dwStubTime, DWORD dwThreadId, DWORD dwCurThreadId, DWORD dwCurProcessId);
typedef struct tag_MARSHALINTERFACEPARAM { ULONG ulStubId; ULONG dwStubTime; BOOL fNULLPointer; BOOL fNULLStack; } MARSHALINTERFACEPARAM;
#define MSGMAPSIZE 0x100
//////////////////////////////////////////////////////////////////////////////
//
// CMarshalParamCreator
//
//////////////////////////////////////////////////////////////////////////////
class CMarshalParamCreator { public: CMarshalParamCreator() { _ulCur = 0; _ulParamNum = 0; _pMsg = NULL; _fMsgCreated = FALSE; }
~CMarshalParamCreator() { if (_fMsgCreated) cicMemFree(_pMsg); }
void Clear() { if (_fMsgCreated) cicMemFree(_pMsg);
_ulCur = 0; _ulParamNum = 0; _pMsg = NULL; _fMsgCreated = FALSE; }
BOOL Set(MARSHALMSG *pMsg, ULONG cbSize) { _pMsg = pMsg; _pMsg->cbBufSize = cbSize; return TRUE; }
BOOL Init(DWORD dwSrcThreadId, DWORD dwSrcProcessId, REFIID riid, ULONG ulMethodId, ULONG ulParamNum, ULONG ulStubId, DWORD dwStubTime, BOOL fUseulRet = FALSE) { _ulParamNum = ulParamNum; ULONG cbSize = sizeof(MARSHALMSG) + ulParamNum * sizeof(MARSHALPARAM *);
if (!_pMsg) { _pMsg = (MARSHALMSG *)cicMemAllocClear(MSGMAPSIZE); if (!_pMsg) return FALSE;
_fMsgCreated = TRUE; _pMsg->cbBufSize = MSGMAPSIZE; }
LENGTH_ALIGN(cbSize, CIC_ALIGNMENT); _pMsg->cbSize = cbSize; _pMsg->iid = riid; _pMsg->ulMethodId = ulMethodId; _pMsg->ulParamNum = 0; _pMsg->dwSrcThreadId = dwSrcThreadId; _pMsg->dwSrcProcessId = dwSrcProcessId; _pMsg->ulStubId = ulStubId; _pMsg->dwStubTime = dwStubTime; if (!fUseulRet) _pMsg->hrRet = E_FAIL; return TRUE; }
HRESULT Add(ULONG cbBufSize, DWORD dwFlags, const void *pv) { ULONG cbOrgBufSize = cbBufSize; LENGTH_ALIGN(cbBufSize, CIC_ALIGNMENT); ULONG cbMsgSize = _pMsg->cbSize + cbBufSize + sizeof(MARSHALPARAM); LENGTH_ALIGN(cbMsgSize, CIC_ALIGNMENT); MARSHALPARAM *pParam;
if (_pMsg->cbBufSize < cbMsgSize) { Assert(0); return E_OUTOFMEMORY; }
pParam = (MARSHALPARAM *)((BYTE *)_pMsg + _pMsg->cbSize); _pMsg->ulParamOffset[_ulCur] = _pMsg->cbSize; pParam->cbBufSize = cbBufSize; pParam->dwFlags = dwFlags;
if (cbBufSize) { if (pv) { BYTE *pb = (BYTE *)ParamToBufferPointer(pParam); memcpy(pb, pv, cbOrgBufSize); if (cbBufSize - cbOrgBufSize) memset(pb + cbOrgBufSize, 0, cbBufSize - cbOrgBufSize); } else { memset(ParamToBufferPointer(pParam), 0, cbBufSize); } }
_pMsg->cbSize = cbMsgSize; _pMsg->ulParamNum++;
_ulCur++; return S_OK; }
MARSHALMSG *Get() {return _pMsg;} HRESULT GetHresult() {return _pMsg->hrRet;}
MARSHALPARAM *GetMarshalParam(ULONG ulParam) { return (MARSHALPARAM *)(((BYTE *)_pMsg) + _pMsg->ulParamOffset[ulParam]); }
HRESULT _RealSendReceive(CProxy *pProxy, ULONG ulBlockId) { HRESULT hr = pProxy->SendReceive(_pMsg, ulBlockId); return hr; }
HRESULT SendReceive(CProxy *pProxy, ULONG ulBlockId) { HRESULT hr = _RealSendReceive(pProxy, ulBlockId); if (FAILED(hr)) return hr; return _pMsg->hrRet; }
#ifdef UNKNOWN_MARSHAL
HRESULT SendReceiveULONG(CProxy *pProxy, ULONG ulBlockId) { HRESULT hr = _RealSendReceive(pProxy, ulBlockId); if (FAILED(hr)) return hr; return S_OK; } #endif
private: MARSHALMSG *_pMsg; ULONG _ulParamNum; ULONG _ulCur; BOOL _fMsgCreated; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyIUnknown
//
//////////////////////////////////////////////////////////////////////////////
class CProxyIUnknown : public IUnknown, public CProxy { public: CProxyIUnknown(SYSTHREAD *psfn);
virtual ~CProxyIUnknown() { Assert(!_cRef); }
//
// IUnknown methods
//
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
HRESULT _QueryInterface(REFIID riid, void **ppvObj);
private: DBG_ID_DECLARE; };
extern const IID IID_CPROXYPRIV; inline CProxyIUnknown *GetCProxyIUnknown(IUnknown *punk) { CProxyIUnknown *pv;
punk->QueryInterface(IID_CPROXYPRIV, (void **)&pv);
return pv; }
#define CPROXYIUNKOWNIMPL() \
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) \ { \ return CProxyIUnknown::QueryInterface(riid, ppvObj); \ } \ STDMETHODIMP_(ULONG) AddRef(void) \ { \ return CProxyIUnknown::AddRef(); \ } \ STDMETHODIMP_(ULONG) Release(void) \ { \ return CProxyIUnknown::Release(); \ }
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarMgr
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarMgr : public CProxyIUnknown, public ITfLangBarMgr { public: CProxyITfLangBarMgr(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL()
//
// ITfLangBarMgr methods
//
STDMETHODIMP AdviseEventSink(ITfLangBarEventSink *pSink, HWND hwnd, DWORD dwFlags, DWORD *pdwCookie);
STDMETHODIMP UnadviseEventSink(DWORD dwCookie);
STDMETHODIMP GetThreadMarshalInterface(DWORD dwThreadId, DWORD dwType, REFIID riid, IUnknown **ppunk);
STDMETHODIMP GetThreadLangBarItemMgr(DWORD dwThreadId, ITfLangBarItemMgr **pplbi, DWORD *pdwThreadId) ;
STDMETHODIMP GetInputProcessorProfiles(DWORD dwThreadId, ITfInputProcessorProfiles **ppaip, DWORD *pdwThreadId) ;
STDMETHODIMP RestoreLastFocus(DWORD *pdwThreadId, BOOL fPrev);
STDMETHODIMP SetModalInput(ITfLangBarEventSink *pSink, DWORD dwThreadId, DWORD dwFlags);
STDMETHODIMP ShowFloating(DWORD dwFlags);
STDMETHODIMP GetShowFloatingStatus(DWORD *pdwFlags); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarItemMgr
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarItemMgr : public ITfLangBarItemMgr, public CProxyIUnknown { public: CProxyITfLangBarItemMgr(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL()
STDMETHODIMP EnumItems(IEnumTfLangBarItems **ppEnum);
STDMETHODIMP GetItem(REFGUID rguid, ITfLangBarItem **ppItem);
STDMETHODIMP AddItem(ITfLangBarItem *punk);
STDMETHODIMP RemoveItem(ITfLangBarItem *punk);
STDMETHODIMP AdviseItemSink(ITfLangBarItemSink *punk, DWORD *pdwCookie, REFGUID rguidItem);
STDMETHODIMP UnadviseItemSink(DWORD dwCookie);
STDMETHODIMP GetItemFloatingRect(DWORD dwThreadId, REFGUID rguid, RECT *prc); STDMETHODIMP GetItemsStatus(ULONG ulCount, const GUID *prgguid, DWORD *pdwStatus);
STDMETHODIMP GetItemNum(ULONG *pulCount);
STDMETHODIMP GetItems(ULONG ulCount, ITfLangBarItem **ppItem, TF_LANGBARITEMINFO *pInfo, DWORD *pdwStatus, ULONG *pcFetched);
STDMETHODIMP AdviseItemsSink(ULONG ulCount, ITfLangBarItemSink **ppunk, const GUID *pguidItem, DWORD *pdwCookie);
STDMETHODIMP UnadviseItemsSink(ULONG ulCount, DWORD *pdwCookie);
DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarItemSink
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarItemSink : public ITfLangBarItemSink, public CProxyIUnknown { public: CProxyITfLangBarItemSink(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() STDMETHODIMP OnUpdate(DWORD dwFlags); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyIEnumEnumTfLangBarItems
//
//////////////////////////////////////////////////////////////////////////////
class CProxyIEnumTfLangBarItems : public IEnumTfLangBarItems, public CProxyIUnknown { public: CProxyIEnumTfLangBarItems(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() STDMETHODIMP Clone(IEnumTfLangBarItems **ppEnum); STDMETHODIMP Next(ULONG ulCount, ITfLangBarItem **ppItem, ULONG *pcFetched); STDMETHODIMP Reset(); STDMETHODIMP Skip(ULONG ulCount); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarItem
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarItem : public ITfLangBarItem, public CProxyIUnknown { public: CProxyITfLangBarItem(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo); STDMETHODIMP GetStatus(DWORD *pdwStatus); STDMETHODIMP Show(BOOL fShow); STDMETHODIMP GetTooltipString(BSTR *pbstrToolTip); DBG_ID_DECLARE; };
#define CPROXYLANGBARITEMIMPL() \
STDMETHODIMP GetInfo(TF_LANGBARITEMINFO *pInfo) \ {return CProxyITfLangBarItem::GetInfo(pInfo);} \ STDMETHODIMP GetStatus(DWORD *pdwStatus) \ {return CProxyITfLangBarItem::GetStatus(pdwStatus);} \ STDMETHODIMP Show(BOOL fShow) \ {return CProxyITfLangBarItem::Show(fShow);} \ STDMETHODIMP GetTooltipString(BSTR *pbstr) \ {return CProxyITfLangBarItem::GetTooltipString(pbstr);}
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarItemButton
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarItemButton : public ITfLangBarItemButton, public CProxyITfLangBarItem { public: CProxyITfLangBarItemButton(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() CPROXYLANGBARITEMIMPL() STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea); STDMETHODIMP InitMenu(ITfMenu *pMenu); STDMETHODIMP OnMenuSelect(UINT wID); STDMETHODIMP GetIcon(HICON *phIcon); STDMETHODIMP GetText(BSTR *pbstrText); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarItemBitmapButton
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarItemBitmapButton : public ITfLangBarItemBitmapButton, public CProxyITfLangBarItem { public: CProxyITfLangBarItemBitmapButton(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() CPROXYLANGBARITEMIMPL() STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea); STDMETHODIMP InitMenu(ITfMenu *pMenu); STDMETHODIMP OnMenuSelect(UINT wID); STDMETHODIMP GetPreferredSize(const SIZE *pszDefault,SIZE *psz); STDMETHODIMP DrawBitmap(LONG bmWidth, LONG bmHeight, DWORD dwFlags, HBITMAP *phbmp, HBITMAP *phbmpMask); STDMETHODIMP GetText(BSTR *pbstrText); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarItemBitmap
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarItemBitmap : public ITfLangBarItemBitmap, public CProxyITfLangBarItem { public: CProxyITfLangBarItemBitmap(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() CPROXYLANGBARITEMIMPL() STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea); STDMETHODIMP GetPreferredSize(const SIZE *pszDefault,SIZE *psz); STDMETHODIMP DrawBitmap(LONG bmWidth, LONG bmHeight, DWORD dwFlags, HBITMAP *phbmp, HBITMAP *phbmpMask); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfLangBarItemBalloon
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfLangBarItemBalloon : public ITfLangBarItemBalloon, public CProxyITfLangBarItem { public: CProxyITfLangBarItemBalloon(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() CPROXYLANGBARITEMIMPL() STDMETHODIMP OnClick(TfLBIClick click, POINT pt, const RECT *prcArea); STDMETHODIMP GetPreferredSize(const SIZE *pszDefault,SIZE *psz); STDMETHODIMP GetBalloonInfo(TF_LBBALLOONINFO *pInfo); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfMenu
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfMenu : public ITfMenu, public CProxyIUnknown { public: CProxyITfMenu(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() STDMETHODIMP AddMenuItem(UINT uId, DWORD dwFlags, HBITMAP hbmp, HBITMAP hbmpMask, const WCHAR *pch, ULONG cch, ITfMenu **ppMenu); DBG_ID_DECLARE; };
//////////////////////////////////////////////////////////////////////////////
//
// CProxyITfMenu
//
//////////////////////////////////////////////////////////////////////////////
class CProxyITfInputProcessorProfiles : public ITfInputProcessorProfiles, public CProxyIUnknown { public: CProxyITfInputProcessorProfiles(SYSTHREAD *psfn); CPROXYIUNKOWNIMPL() STDMETHODIMP Register(REFCLSID rclsid);
STDMETHODIMP Unregister(REFCLSID rclsid);
STDMETHODIMP AddLanguageProfile(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, const WCHAR *pchDesc, ULONG cchDesc, const WCHAR *pchIconFile, ULONG cchFile, ULONG uIconIndex);
STDMETHODIMP RemoveLanguageProfile(REFCLSID rclsid, LANGID langid, REFGUID guidProfile);
STDMETHODIMP EnumInputProcessorInfo(IEnumGUID **ppEnum);
STDMETHODIMP GetDefaultLanguageProfile(LANGID langid, REFGUID catid, CLSID *pclsid, GUID *pguidProfile);
STDMETHODIMP SetDefaultLanguageProfile(LANGID langid, REFCLSID rclsid, REFGUID guidProfiles);
STDMETHODIMP ActivateLanguageProfile(REFCLSID rclsid, LANGID langid, REFGUID guidProfiles);
STDMETHODIMP GetActiveLanguageProfile(REFCLSID rclsid, LANGID *plangid, GUID *pguidProfile);
STDMETHODIMP GetLanguageProfileDescription(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BSTR *pbstrProfile);
STDMETHODIMP GetCurrentLanguage(LANGID *plangid);
STDMETHODIMP ChangeCurrentLanguage(LANGID langid);
STDMETHODIMP GetLanguageList(LANGID **ppLangId, ULONG *pulCount);
STDMETHODIMP EnumLanguageProfiles(LANGID langid, IEnumTfLanguageProfiles **ppEnum);
STDMETHODIMP EnableLanguageProfile(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL fEnable);
STDMETHODIMP IsEnabledLanguageProfile(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL *pfEnable);
STDMETHODIMP EnableLanguageProfileByDefault(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, BOOL fEnable);
STDMETHODIMP SubstituteKeyboardLayout(REFCLSID rclsid, LANGID langid, REFGUID guidProfile, HKL hKL);
DBG_ID_DECLARE; };
#endif // MPROXY_H
|