summaryrefslogtreecommitdiff
path: root/src/vm/dispparammarshaler.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/dispparammarshaler.h')
-rw-r--r--src/vm/dispparammarshaler.h227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/vm/dispparammarshaler.h b/src/vm/dispparammarshaler.h
new file mode 100644
index 0000000000..b230d7905d
--- /dev/null
+++ b/src/vm/dispparammarshaler.h
@@ -0,0 +1,227 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// File: DispParamMarshaler.h
+//
+
+//
+// Definition of dispatch parameter marshalers.
+//
+
+
+#ifndef _DISPPARAMMARSHALER_H
+#define _DISPPARAMMARSHALER_H
+
+#ifndef FEATURE_COMINTEROP
+#error FEATURE_COMINTEROP is required for this file
+#endif // FEATURE_COMINTEROP
+
+#ifndef CROSSGEN_COMPILE
+
+#include "vars.hpp"
+#include "mlinfo.h"
+
+class DispParamMarshaler
+{
+public:
+ DispParamMarshaler()
+ {
+ LIMITED_METHOD_CONTRACT;
+ }
+
+ virtual ~DispParamMarshaler()
+ {
+ LIMITED_METHOD_CONTRACT;
+ }
+
+ virtual BOOL RequiresManagedCleanup();
+ virtual void MarshalNativeToManaged(VARIANT *pSrcVar, OBJECTREF *pDestObj);
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+ virtual void MarshalManagedToNativeRef(OBJECTREF *pSrcObj, VARIANT *pRefVar);
+ virtual void CleanUpManaged(OBJECTREF *pObj);
+};
+
+
+
+class DispParamCurrencyMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamCurrencyMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamCurrencyMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+};
+
+
+class DispParamOleColorMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamOleColorMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamOleColorMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual void MarshalNativeToManaged(VARIANT *pSrcVar, OBJECTREF *pDestObj);
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+ virtual void MarshalManagedToNativeRef(OBJECTREF *pSrcObj, VARIANT *pRefVar);
+};
+
+
+class DispParamErrorMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamErrorMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamErrorMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+};
+
+
+
+class DispParamInterfaceMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamInterfaceMarshaler(BOOL bDispatch, MethodTable* pIntfMT, MethodTable *pClassMT, BOOL bClassIsHint) :
+ m_bDispatch(bDispatch),
+ m_pIntfMT(pIntfMT),
+ m_pClassMT(pClassMT),
+ m_bClassIsHint(bClassIsHint)
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamInterfaceMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual void MarshalNativeToManaged(VARIANT *pSrcVar, OBJECTREF *pDestObj);
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+
+private:
+ // if return type is an interface, then the method table of the interface is cached here.
+ // we need to cache this and use it when we call GetCOMIPFromObjectRef
+ MethodTable* m_pIntfMT;
+ MethodTable* m_pClassMT;
+ BOOL m_bDispatch;
+ BOOL m_bClassIsHint;
+};
+
+#ifdef FEATURE_CLASSIC_COMINTEROP
+class DispParamArrayMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamArrayMarshaler(VARTYPE ElementVT, MethodTable *pElementMT) :
+ m_ElementVT(ElementVT),
+ m_pElementMT(pElementMT)
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamArrayMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual void MarshalNativeToManaged(VARIANT *pSrcVar, OBJECTREF *pDestObj);
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+ virtual void MarshalManagedToNativeRef(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+
+private:
+ VARTYPE m_ElementVT;
+ MethodTable* m_pElementMT;
+};
+#endif // FEATURE_CLASSIC_COMINTEROP
+
+
+class DispParamRecordMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamRecordMarshaler(MethodTable *pRecordMT) :
+ m_pRecordMT(pRecordMT)
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamRecordMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual void MarshalNativeToManaged(VARIANT *pSrcVar, OBJECTREF *pDestObj);
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+
+private:
+ MethodTable* m_pRecordMT;
+};
+
+class DispParamDelegateMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamDelegateMarshaler(MethodTable *pDelegateMT) :
+ m_pDelegateMT(pDelegateMT)
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamDelegateMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual void MarshalNativeToManaged(VARIANT *pSrcVar, OBJECTREF *pDestObj);
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+
+private:
+ MethodTable* m_pDelegateMT;
+};
+
+
+class DispParamCustomMarshaler : public DispParamMarshaler
+{
+public:
+ DispParamCustomMarshaler(CustomMarshalerHelper *pCMHelper, VARTYPE vt) :
+ m_pCMHelper(pCMHelper),
+ m_vt(vt)
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual ~DispParamCustomMarshaler()
+ {
+ WRAPPER_NO_CONTRACT;
+ }
+
+ virtual BOOL RequiresManagedCleanup();
+ virtual void MarshalNativeToManaged(VARIANT *pSrcVar, OBJECTREF *pDestObj);
+ virtual void MarshalManagedToNative(OBJECTREF *pSrcObj, VARIANT *pDestVar);
+ virtual void MarshalManagedToNativeRef(OBJECTREF *pSrcObj, VARIANT *pRefVar);
+ virtual void CleanUpManaged(OBJECTREF *pObj);
+
+private:
+ CustomMarshalerHelper* m_pCMHelper;
+ VARTYPE m_vt;
+};
+
+#endif //#ifndef CROSSGEN_COMPILE
+#endif // _DISPPARAMMARSHALER_H