summaryrefslogtreecommitdiff
path: root/iup/srcole/tDispatch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'iup/srcole/tDispatch.cpp')
-rwxr-xr-xiup/srcole/tDispatch.cpp236
1 files changed, 236 insertions, 0 deletions
diff --git a/iup/srcole/tDispatch.cpp b/iup/srcole/tDispatch.cpp
new file mode 100755
index 0000000..9db30a3
--- /dev/null
+++ b/iup/srcole/tDispatch.cpp
@@ -0,0 +1,236 @@
+// tDispatch.cpp: implementation of the tDispatch class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "tDispatch.h"
+#include "tOleHandler.h"
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+
+/*
+ * tDispatch::tDispatch
+ * tDispatch::~tDispatch
+ *
+ * Parameters (Constructor):
+ * pTen PCTenant of the tenant we're in.
+ * pUnkOuter LPUNKNOWN to which we delegate.
+ */
+
+tDispatch::tDispatch(tOleHandler *pTen, LPUNKNOWN pUnkOuter)
+ {
+ m_cRef=0;
+ m_pTen=pTen;
+ m_pUnkOuter=pUnkOuter;
+ return;
+ }
+
+tDispatch::~tDispatch(void)
+ {
+ return;
+ }
+
+
+
+
+/*
+ * tDispatch::QueryInterface
+ * tDispatch::AddRef
+ * tDispatch::Release
+ */
+
+STDMETHODIMP tDispatch::QueryInterface(REFIID riid, PPVOID ppv)
+ {
+ return m_pUnkOuter->QueryInterface(riid, ppv);
+ }
+
+STDMETHODIMP_(ULONG) tDispatch::AddRef(void)
+ {
+ ++m_cRef;
+ return m_pUnkOuter->AddRef();
+ }
+
+STDMETHODIMP_(ULONG) tDispatch::Release(void)
+ {
+ m_cRef--;
+ return m_pUnkOuter->Release();
+ }
+
+
+
+
+/*
+ * tDispatch::GetTypeInfoCount
+ * tDispatch::GetTypeInfo
+ * tDispatch::GetIDsOfNames
+ *
+ * Unimplemented members, not needed for ambient properties.
+ */
+
+STDMETHODIMP tDispatch::GetTypeInfoCount(UINT *pctInfo)
+ {
+ *pctInfo=0;
+ return NOERROR;
+ }
+
+STDMETHODIMP tDispatch::GetTypeInfo(UINT itinfo
+ , LCID lcid, ITypeInfo **pptInfo)
+ {
+ *pptInfo=NULL;
+ return ResultFromScode(E_NOTIMPL);
+ }
+
+STDMETHODIMP tDispatch::GetIDsOfNames(REFIID riid
+ , OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID *rgDispID)
+ {
+ *rgszNames=NULL;
+ *rgDispID=NULL;
+ return ResultFromScode(E_NOTIMPL);
+ }
+
+
+
+
+/*
+ * tDispatch::Invoke
+ *
+ * Purpose:
+ * Calls a method in the dispatch interface or manipulates a
+ * property.
+ *
+ * Parameters:
+ * dispIDMember DISPID of the method or property of interest.
+ * riid REFIID reserved, must be NULL.
+ * lcid LCID of the locale.
+ * wFlags USHORT describing the context of the invocation.
+ * pDispParams DISPPARAMS * to the array of arguments.
+ * pVarResult VARIANT * in which to store the result. Is
+ * NULL if the caller is not interested.
+ * pExcepInfo EXCEPINFO * to exception information.
+ * puArgErr UINT * in which to store the index of an
+ * invalid parameter if DISP_E_TYPEMISMATCH
+ * is returned.
+ *
+ * Return Value:
+ * HRESULT NOERROR or a general error code.
+ */
+
+
+STDMETHODIMP tDispatch::Invoke(DISPID dispIDMember, REFIID riid
+ , LCID lcid, unsigned short wFlags, DISPPARAMS *pDispParams
+ , VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+ {
+ HRESULT hr;
+ VARIANT varResult;
+
+ if (IID_NULL!=riid)
+ return ResultFromScode(E_INVALIDARG);
+
+ /*
+ * We ignore lcid in this function. A multilingual application
+ * might use it to determine the meaning of certain parameters
+ * or perhaps as an indication of how to format data like
+ * time, date, and currency or any other language or locale-
+ * sensitive data.
+ */
+
+ /*
+ * Variable handling: since ambient properties is just a
+ * collection of singular read-only values, we don't have to
+ * worry about input parameters.
+ */
+
+ /*
+ * If the caller is not interested in the return value, then
+ * pVarResult is NULL. But since we're dealing with ambient
+ * properties, there should always be an interest. In any case,
+ * if we're given a NULL, we'll point it to a dummy structure so
+ * the rest of the code can assume that pVarResult is non-NULL.
+ */
+ if(NULL==pVarResult)
+ pVarResult=&varResult;
+
+ VariantInit(pVarResult);
+
+ //The most common case is boolean, use as an initial type
+ V_VT(pVarResult)=VT_BOOL;
+
+ /*
+ * Process the requested ambient property. Anything but a
+ * request for a property is invalid, so we can check that
+ * before looking at the specific ID. We can only get away
+ * with this because all properties are read-only.
+ */
+
+ if (!(DISPATCH_PROPERTYGET & wFlags))
+ return ResultFromScode(DISP_E_MEMBERNOTFOUND);
+
+ hr=NOERROR;
+
+ switch (dispIDMember)
+ {
+ case DISPID_AMBIENT_BACKCOLOR:
+ V_I4(pVarResult)=m_pTen->m_ambientProp.getBackColor();
+ V_VT(pVarResult)=VT_I4;
+ break;
+
+ case DISPID_AMBIENT_FORECOLOR:
+ V_I4(pVarResult)=m_pTen->m_ambientProp.getForeColor();
+ V_VT(pVarResult)=VT_I4;
+ break;
+
+ case DISPID_AMBIENT_FONT:
+ /*
+ * If we failed to create the font, act like we
+ * don't support it.
+ */
+ if (!m_pTen->m_ambientProp.has_font())
+ return ResultFromScode(DISP_E_MEMBERNOTFOUND);
+
+ //The correct type is an IFontDisp pointer
+ V_DISPATCH(pVarResult)=m_pTen->m_ambientProp.getFontRef();
+ V_VT(pVarResult)=VT_FONT;
+ break;
+
+ case DISPID_AMBIENT_LOCALEID:
+ V_I4(pVarResult)=m_pTen->m_ambientProp.getLCID();
+ V_VT(pVarResult)=VT_I4;
+ break;
+
+ case DISPID_AMBIENT_USERMODE:
+ V_BOOL(pVarResult)=!m_pTen->m_ambientProp.getDesignMode();
+ V_VT(pVarResult) = VT_BOOL;
+ break;
+
+ case DISPID_AMBIENT_UIDEAD:
+ //V_BOOL(pVarResult)=m_pTen->m_ambientProp.getUIDead();
+ V_BOOL(pVarResult)=FALSE;
+ V_VT(pVarResult) = VT_BOOL;
+
+ break;
+
+ case DISPID_AMBIENT_SUPPORTSMNEMONICS:
+ V_BOOL(pVarResult)=TRUE;
+ break;
+
+ case DISPID_AMBIENT_SHOWGRABHANDLES:
+ //V_BOOL(pVarResult)=m_pTen->m_ambientProp.m_fHatchHandles;
+ V_BOOL(pVarResult)=FALSE;
+ V_VT(pVarResult) = VT_BOOL;
+ break;
+
+ case DISPID_AMBIENT_SHOWHATCHING:
+// V_BOOL(pVarResult)=m_pTen->m_ambientProp.m_fHatchHandles;
+ V_BOOL(pVarResult)=FALSE;
+ V_VT(pVarResult) = VT_BOOL;
+ break;
+
+ default:
+ hr=ResultFromScode(DISP_E_MEMBERNOTFOUND);
+ break;
+ }
+
+ return hr;
+ }