dcomProxy.h
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:11k
- /* dcomProxy.h - VxWorks DCOM runtime marshaling support */
- /* Copyright (c) 1998 Wind River Systems, Inc. */
- /*
- modification history
- --------------------
- 02i,02aug01,dbs add [v1_enum] support
- 02h,31jul01,dbs remove obsolete InterfaceProxy class, add p/s registration
- macro
- 02g,28feb01,nel SPR#35698. Add boolean type.
- 02f,19sep00,nel Change constness of widlMarshal to match T3.
- 02e,24aug00,dbs fix many OPC-related SPRs
- 02d,18jul00,dbs add CV array type and enum type
- 02c,02mar00,dbs add revised VTBL macros
- 02b,11feb00,dbs add void_t() to allow void-pointers in marshaling
- 02a,07feb00,dbs simplify NdrType classes, enhance marshaling of arrays to
- support all kinds
- 01z,02feb00,dbs change proxy vtbl to be template-based
- 01y,14oct99,dbs make double an explicit typedesc
- 01x,22sep99,dbs add uhyper type
- 01w,16sep99,dbs marshaling enhancements, part 2
- 01v,14sep99,dbs change REFIIDs to const IID& for WIDL compatibility, add
- VARIANT, pointer and string types
- 01u,12aug99,dbs improve NDR structure support
- 01t,05aug99,dbs remove byte typedef
- 01s,30jul99,dbs tighten up type-safety of NDR types
- 01r,25jun99,dbs add channel-ID to stub-msg
- 01q,03jun99,aim removed BYTE_ORDER and LITTLE_ENDIAN defs
- 01p,02jun99,dbs remove OS-specific macros
- 01o,28may99,dbs make stub disp-tbl a struct
- 01n,27may99,dbs remove DCE-specific stub-function type
- 01m,25may99,dbs remove NDRTYPES::alloc/free methods
- 01l,20may99,dbs move NDR phase into streams
- 01k,18may99,dbs add proxy/stub marshaling phase to NDR-streams
- 01j,14may99,dbs add alignment requirement to NdrType
- 01i,14may99,dbs remove obsolete PFNSTUB type
- 01h,14may99,dbs add new NDR support
- 01g,11may99,dbs simplify proxy remoting architecture
- 01f,11may99,dbs add fwd-decl of IRpcStubBuffer etc, rename symbols
- like VXCOM_* to VXDCOM_*
- 01e,04may99,dbs remove cplusplus check
- 01d,30apr99,dbs fix up bracketing in vtbl macros
- 01c,29apr99,dbs fix -Wall warnings
- 01b,22apr99,dbs add HRESULT member to RPCOLEMESSAGE
- 01a,20apr99,dbs added mod-hist
- */
- /* This header is to be included in generated proxy/stub code. */
- #ifndef __INCdcomProxy_h
- #define __INCdcomProxy_h
- #include "dcomLib.h"
- #include "comObjLib.h"
- //////////////////////////////////////////////////////////////////////////
- //
- // DATA REPRESENTATION -- we use the NDR format, which is actually
- // defined as a vector of 4 bytes, the first of which contains the
- // integer ordering field. However, its difficult in C to pass this
- // around, so we use an unsigned-long representation instead.
- //
- #if (_BYTE_ORDER == _LITTLE_ENDIAN)
- #define VXDCOM_NDR_CHAR_REP 0x00
- #define VXDCOM_NDR_INT_REP 0x01
- #define VXDCOM_NDR_FLOAT_REP 0x00
- #define VXDCOM_DREP_LITTLE_ENDIAN 0x00000010
- #define VXDCOM_DREP_BIG_ENDIAN 0x00000000
- #define VXDCOM_DREP_MASK 0x000000FF
- #define VXDCOM_DREP_LOCAL VXDCOM_DREP_LITTLE_ENDIAN
- #else /* big endian */
- #define VXDCOM_NDR_CHAR_REP 0x00
- #define VXDCOM_NDR_INT_REP 0x00
- #define VXDCOM_NDR_FLOAT_REP 0x00
- #define VXDCOM_DREP_LITTLE_ENDIAN 0x10000000
- #define VXDCOM_DREP_BIG_ENDIAN 0x00000000
- #define VXDCOM_DREP_MASK 0xFF000000
- #define VXDCOM_DREP_LOCAL VXDCOM_DREP_BIG_ENDIAN
- #endif
- #define VXDCOM_NDR_DATAREP0 ((VXDCOM_NDR_INT_REP << 4) | VXDCOM_NDR_CHAR_REP)
- #define VXDCOM_NDR_DATAREP1 (VXDCOM_NDR_FLOAT_REP)
- #define VXDCOM_NDR_DATAREP2 (0)
- #define VXDCOM_NDR_DATAREP3 (0)
- typedef unsigned long RPCOLEDATAREP;
- //////////////////////////////////////////////////////////////////////////
- //
- // Forward type declarations...
- //
- class NdrTypeFactory;
- class NdrMarshalStream;
- class NdrUnmarshalStream;
- class RpcProxyMsg;
- class NDRTYPES;
- ///////////////////////////////////////////////////////////////////////////
- //
- // IUnknown proxy functions
- //
- extern HRESULT IUnknown_QueryInterface_vxproxy (IUnknown*, REFIID, void**);
- extern ULONG IUnknown_AddRef_vxproxy (IUnknown*);
- extern ULONG IUnknown_Release_vxproxy (IUnknown*);
- ///////////////////////////////////////////////////////////////////////////
- //
- // ndr_make_right - re-formats a 2-byte, 4-byte or 8-byte number
- // into the format indicated by the dataRep field...
- //
- template <typename T>
- inline void ndr_make_right (T& t, ULONG drepOther)
- {
- if (VXDCOM_DREP_LOCAL == drepOther)
- return;
- char *a = (char*) &t;
- char *b = ((char*) &t) + sizeof (T) - 1;
- char tmp;
- for (size_t n=0; n < (sizeof (T) / 2); ++n)
- {
- tmp = *a;
- *a = *b;
- *b = tmp;
- ++a;
- --b;
- }
- }
- //////////////////////////////////////////////////////////////////////////
- //
- // NDR Utility macros...
- //
- #define NDR_SIZEOF(type) ((size_t) ((char*)(((type*)0) + 1)))
- #define NDR_OFFSETOF(type,member) ((size_t) &((type*) 0)->member)
- //////////////////////////////////////////////////////////////////////////
- //
- // Define NDR/IDL types that aren't part of C/C++
- //
- typedef unsigned long DREP;
- //////////////////////////////////////////////////////////////////////////
- //
- class NdrType
- {
- public:
- enum TypeKind
- {
- TK_SIMPLE=0,
- TK_STRUCT,
- TK_ARRAY,
- TK_CSTRUCT,
- TK_CARRAY,
- TK_VARRAY,
- TK_CVARRAY,
- TK_UNION,
- TK_NE_UNION,
- TK_PTR,
- TK_BSTR,
- TK_INTERFACE
- };
- void* operator new (size_t, NdrTypeFactory*);
- void operator delete (void*);
- NdrType (NDRTYPES& n) : m_dwRefCount (0), m_ndrtypes (n) {}
- virtual ~NdrType () {}
- virtual TypeKind kind () const =0;
- virtual size_t size (NdrUnmarshalStream*) =0;
- virtual size_t alignment () const =0;
- virtual void resize (size_t) =0;
- virtual long value () const =0;
- virtual void bind (void*) =0;
- virtual HRESULT marshal1 (NdrMarshalStream*) =0;
- virtual HRESULT marshal2 (NdrMarshalStream*);
- virtual HRESULT unmarshal1 (NdrUnmarshalStream*) =0;
- virtual HRESULT unmarshal2 (NdrUnmarshalStream*);
- virtual HRESULT marshal (NdrMarshalStream*);
- virtual HRESULT unmarshal (NdrUnmarshalStream*);
- ULONG AddRef () { return ++m_dwRefCount; }
- ULONG Release ()
- {
- ULONG n = --m_dwRefCount;
- if (n == 0)
- delete this;
- return n;
- }
- void arraySizeSet (int n);
- int arraySizeGet ();
- private:
- DWORD m_dwRefCount;
- NDRTYPES& m_ndrtypes;
- };
- //////////////////////////////////////////////////////////////////////////
- //
- // Define the generic 'type descriptor' as ref-counting pointer to an
- // NdrType (subclass) instance.
- //
- typedef CComPtr<NdrType> NdrTypeDesc;
- //////////////////////////////////////////////////////////////////////////
- //
- // NDR Structure support -- the nSizeIs member indicates the
- // associated structure member which provides the dynamic sizing
- // information for a particular data member. For fixed-size structure
- // elements, this value will be -1 (i.e. there is no sizing info) and
- // for those with a size_is attribute the field will hold the index
- // (in the range 0..N-1 where N is the number of struct members) of
- // the data member that is nominated in the size_is field.
- //
- // For conformant structures, i.e. those whose last element is a
- // conformant-array, they may use the cstruct_t type descriptor, and
- // then won't require the last member to have nSizeIs set.
- //
- struct NdrMemberInfo
- {
- NdrTypeDesc pType;
- size_t nOffset;
- int nSizeIs;
-
- NdrMemberInfo (const NdrTypeDesc& pt, size_t offset, int nsize = -1)
- : pType (pt), nOffset (offset), nSizeIs (nsize)
- {}
- NdrMemberInfo () : pType (0), nOffset (0), nSizeIs (-1)
- {}
- };
- #define NDR_MEMBER(sname,mem,typ) NdrMemberInfo(typ,NDR_OFFSETOF(sname,mem))
- #define NDR_MEMBERX(sname,mem,typ,sz) NdrMemberInfo(typ,NDR_OFFSETOF(sname,mem),sz)
- //////////////////////////////////////////////////////////////////////////
- //
- struct RpcMode
- {
- enum Mode_t { OBJECT=0, DCE=1 };
- };
- //////////////////////////////////////////////////////////////////////////
- //
- // RPC proxy message
- //
- class RPC_PROXY_MSG
- {
- public:
- RPC_PROXY_MSG (const IID& riid, RpcMode::Mode_t mode, ULONG opnum, void*);
- ~RPC_PROXY_MSG ();
- NdrMarshalStream* marshalStreamGet ();
- HRESULT SendReceive ();
- NdrUnmarshalStream* unmarshalStreamGet ();
- RpcProxyMsg* m_pImpl;
- };
- //////////////////////////////////////////////////////////////////////////
- //
- // RPC stub message
- //
- class RPC_STUB_MSG
- {
- public:
- RPC_STUB_MSG (NdrUnmarshalStream*, NdrMarshalStream*, int =0);
- ~RPC_STUB_MSG () {}
- NdrUnmarshalStream* unmarshalStreamGet ();
- NdrMarshalStream* marshalStreamGet ();
- int channelIdGet ();
-
- private:
-
- NdrUnmarshalStream* m_pUnmshlStrm;
- NdrMarshalStream* m_pMshlStrm;
- int m_channelId;
- };
- //////////////////////////////////////////////////////////////////////////
- //
- // Stub dispatch function type...
- //
- typedef HRESULT (STDMETHODCALLTYPE * PFN_ORPC_STUB) (IUnknown*, RPC_STUB_MSG&);
- ///////////////////////////////////////////////////////////////////////////
- //
- // Stub dispatch-table type...
- //
- struct VXDCOM_STUB_DISPTBL
- {
- unsigned int nFuncs;
- const PFN_ORPC_STUB* funcs;
- };
- //////////////////////////////////////////////////////////////////////////
- //
- // autoregistration helper class for proxy/stubs
- //
- class vxdcom_ps_autoreg
- {
- public:
- vxdcom_ps_autoreg
- (
- const IID& iid,
- const void* pv,
- const VXDCOM_STUB_DISPTBL* ps
- );
- };
- #define VXDCOM_PS_AUTOREGISTER(itf)
- static vxdcom_ps_autoreg
- _the_##itf##_ps_autoreg (IID_##itf,
- &itf##_vxproxy_vtbl,
- &itf##_vxstub_disptbl)
- //////////////////////////////////////////////////////////////////////////
- //
- // NDR Types
- //
- class NDRTYPES
- {
- public:
- int arraySize;
- public:
- NDRTYPES (int hint=256);
- ~NDRTYPES ();
- NdrTypeDesc byte_t ();
- NdrTypeDesc short_t ();
- NdrTypeDesc long_t ();
- NdrTypeDesc enum_t ();
- NdrTypeDesc v1enum_t ();
- NdrTypeDesc hyper_t ();
- NdrTypeDesc float_t ();
- NdrTypeDesc double_t ();
- NdrTypeDesc bstr_t ();
- NdrTypeDesc struct_t (int nelems, const NdrMemberInfo m[], int nSizeIs = -1);
- NdrTypeDesc cstruct_t (int nelems, const NdrMemberInfo m[], int nSizeIs);
- NdrTypeDesc array_t (const NdrTypeDesc& eltype, size_t elsz, size_t nelems=0);
- NdrTypeDesc carray_t (const NdrTypeDesc& eltype, size_t elsz, size_t nelems=0);
- NdrTypeDesc cvarray_t (const NdrTypeDesc& eltype, size_t elsz, size_t nelems=0, size_t nmax=0);
- NdrTypeDesc interfaceptr_t (const IID&);
- NdrTypeDesc variant_t ();
- NdrTypeDesc cstring_t ();
- NdrTypeDesc wstring_t ();
- NdrTypeDesc pointer_t (const NdrTypeDesc& pointeeType);
- NdrTypeDesc refptr_t (const NdrTypeDesc& pointeeType);
- // map C types to IDL types
- NdrTypeDesc void_t () { return byte_t (); }
- NdrTypeDesc boolean_t () { return byte_t (); }
- NdrTypeDesc char_t () { return byte_t (); }
- NdrTypeDesc uchar_t () { return byte_t (); }
- NdrTypeDesc ushort_t () { return short_t (); }
- NdrTypeDesc ulong_t () { return long_t (); }
- NdrTypeDesc uhyper_t () { return hyper_t (); }
- NdrTypeDesc int_t () { return long_t (); }
- NdrTypeDesc uint_t () { return long_t (); }
- NdrTypeDesc hresult_t () { return long_t (); }
- NdrTypeDesc longlong_t () { return hyper_t (); }
-
- private:
- NdrTypeFactory* m_pFactory;
- };
- HRESULT widlMarshal (void const*, NdrMarshalStream*, const NdrTypeDesc&);
- HRESULT widlUnmarshal (void*, NdrUnmarshalStream*, const NdrTypeDesc&);
- #endif