NdrTypes.h
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:16k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* NdrTypes.h - ORPC NDR (un)marshaling types */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01s,02aug01,dbs  add [v1_enum] support
  7. 01r,08feb01,nel  SPR#63885. SAFEARRAYs added. 
  8. 01q,24aug00,dbs  fix many OPC-related SPRs, copied over from T2 VxDCOM
  9. 01p,18jul00,dbs  add enum NDR type
  10. 01o,29feb00,dbs  fix typo and previous unmarshaling bug
  11. 01n,28feb00,dbs  fix nasty bug when unmarshaling arrays of pointers
  12. 01m,24feb00,dbs  add back-ptr to NDRTYPES
  13. 01l,07feb00,dbs  simplify NdrType classes, enhance marshaling of arrays to
  14.                  support all kinds
  15. 01k,14oct99,dbs  apply fix for ARM double format
  16. 01j,23sep99,dbs  add final parts of VARIANT marshaling
  17. 01i,16sep99,dbs  marshaling enhancements, part 2
  18. 01h,14sep99,dbs  add VARIANT, pointer and string types - first stage
  19. 01g,16aug99,dbs  add variant and string support
  20. 01f,12aug99,dbs  improve struct support
  21. 01e,30jul99,dbs  tighten up type-safety of NDR types
  22. 01d,24may99,dbs  fix interface-ptr marshaling
  23. 01c,20may99,dbs  add type-kind method to all classes
  24. 01b,14may99,dbs  add alignment requirement to NdrType
  25. 01a,12may99,dbs  created
  26. */
  27. #ifndef __INCNdrTypes_h
  28. #define __INCNdrTypes_h
  29. #include "dcomProxy.h"
  30. #include "NdrStreams.h"
  31. //////////////////////////////////////////////////////////////////////////
  32. //
  33. // NdrSimple<T> -- an NdrType subclass for all basic C/C++ primitive
  34. // types.
  35. //
  36. template <typename PrimT>
  37. class NdrSimple : public NdrType
  38.     {
  39.   public:
  40.     NdrSimple (NDRTYPES& n) : NdrType (n), m_pValue (0) {}
  41.     TypeKind kind () const { return TK_SIMPLE; }
  42.     void resize (size_t) {}
  43.     size_t size (NdrUnmarshalStream*) { return sizeof (PrimT); }
  44.     size_t alignment () const { return sizeof (PrimT); }
  45.     long value () const { return (long) *m_pValue; }
  46.     void bind (void* pv) { m_pValue = (PrimT*) pv; }
  47.     
  48.     HRESULT  marshal1 (NdrMarshalStream* pStrm)
  49. {
  50. pStrm->align (sizeof (PrimT));
  51. return pStrm->insert (sizeof (PrimT), m_pValue, true);
  52. }
  53.     
  54.     HRESULT  unmarshal1 (NdrUnmarshalStream* pStrm)
  55. {
  56. pStrm->align (sizeof (PrimT));
  57. return pStrm->extract (sizeof (PrimT), m_pValue, true);
  58. }
  59.   private:
  60.     PrimT* m_pValue;
  61.     };
  62. //////////////////////////////////////////////////////////////////////////
  63. //
  64. // NdrEnum -- an NdrType subclass for handling old-style (16-bit)
  65. // enumerated values. These are conveyed on the wire as 16-bit values
  66. // (if declared as IDL enums) but need to be marshaled from (and
  67. // unmarshaled to) true 'enum' types as understood by the local
  68. // compiler.
  69. //
  70. class NdrEnum : public NdrType
  71.     {
  72.     enum DUMMY { DUMMY_VALUE0=0, DUMMY_VALUE1=1 };
  73.     
  74.   public:
  75.     NdrEnum (NDRTYPES& n)
  76.       : NdrType (n),
  77.         m_pValue (0),
  78.         m_bV1Enum (false)
  79. {}
  80.     TypeKind kind () const { return TK_SIMPLE; }
  81.     void resize (size_t) {}
  82.     size_t size (NdrUnmarshalStream*) { return sizeof (DUMMY); }
  83.     size_t alignment () const;
  84.     long value () const { return  (long) *m_pValue; }
  85.     void bind (void* pv) { m_pValue = (DUMMY*) pv; }
  86.     
  87.     void        init (bool isV1Enum = false) { m_bV1Enum = isV1Enum; }
  88.     
  89.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  90.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  91.   private:
  92.     DUMMY* m_pValue;
  93.     bool        m_bV1Enum;
  94.     };
  95. //////////////////////////////////////////////////////////////////////////
  96. //
  97. // NdrStruct -- an NdrType subclass that represents 'structures' at
  98. // the 'C' or IDL level. The init() method is given an array of
  99. // StructMemberInfo items, each of which describes one member of the
  100. // structure, in terms of its type (via an NdrType pointer) and its
  101. // offset within the structure, plus the index of the 'size_is'
  102. // member, i.e. the one holding the array-length.
  103. //
  104. class NdrStruct : public NdrType
  105.     {
  106.   public:
  107.     NdrStruct (NDRTYPES& n)
  108.       : NdrType (n),
  109. m_nMembers (0),
  110. m_pMemberInfo (0),
  111. m_pInstance (0),
  112. m_nSizeIs (0)
  113. {}
  114.     virtual ~NdrStruct ();
  115.     void init (size_t nmems, const NdrMemberInfo mems [], int nsize_is);
  116.     TypeKind kind () const { return TK_STRUCT; }
  117.     void resize (size_t) {}
  118.     size_t size (NdrUnmarshalStream*);
  119.     size_t alignment () const;
  120.     long value () const { return 0; }
  121.     void bind (void*);
  122.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  123.     HRESULT marshal2 (NdrMarshalStream* pStrm);
  124.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  125.     HRESULT unmarshal2 (NdrUnmarshalStream* pStrm);
  126.     
  127.   protected:
  128.     size_t m_nMembers; // number of members
  129.     NdrMemberInfo* m_pMemberInfo; // member descriptions
  130.     void* m_pInstance; // ptr to current instance
  131.     int m_nSizeIs; // index of 'size_is' member
  132.     };
  133. //////////////////////////////////////////////////////////////////////////
  134. //
  135. // NdrPointer -- an NdrType subclass that represents a [unique] or
  136. // [ptr] pointer to some other type...
  137. //
  138. class NdrPointer : public NdrType
  139.     {
  140.   public:
  141.     NdrPointer (NDRTYPES& n, bool bRefPtr=false)
  142.       : NdrType (n),
  143. m_pPtr (0),
  144. m_pointeeType (0),
  145. m_refptr (bRefPtr)
  146. {}
  147.     void init (const NdrTypeDesc& pt) { m_pointeeType=pt; }
  148.     TypeKind kind () const { return TK_PTR; }
  149.     void resize (size_t);
  150.     size_t size (NdrUnmarshalStream*) { return sizeof (void*); }
  151.     size_t alignment () const { return sizeof (long); }
  152.     long value () const { return 0; }
  153.     void bind (void* pv) { m_pPtr = (void**) pv; }
  154.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  155.     HRESULT marshal2 (NdrMarshalStream* pStrm);
  156.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  157.     HRESULT unmarshal2 (NdrUnmarshalStream* pStrm);
  158.     
  159.   protected:
  160.     void** m_pPtr; // ptr to pointer-variable
  161.     NdrTypeDesc m_pointeeType; // type of pointee
  162.     bool m_refptr; // true when [ref] pointer
  163.     };
  164. //////////////////////////////////////////////////////////////////////////
  165. //
  166. // NdrArray -- an NdrType subclass that represents a fixed-size array
  167. // at the IDL/C++ level. Its init() method is given the NdrType
  168. // representation of each of its elements, the size (in raw memory
  169. // bytes) of each element of the array, and the number of elements in
  170. // the array.
  171. //
  172. class NdrArray : public NdrType
  173.     {
  174.   public:
  175.     NdrArray (NDRTYPES& n)
  176.       : NdrType (n),
  177. m_pElementType (0),
  178. m_nElementSize (0),
  179. m_ptr (0) ,
  180. m_arraySize (0),
  181. m_offset (0),
  182. m_max (0)
  183. {}
  184.     void init
  185. (
  186. const NdrTypeDesc& elementType,
  187. size_t elemSize,
  188. size_t max,
  189. size_t offset,
  190. size_t len
  191. );
  192.     TypeKind kind () const { return TK_ARRAY; }
  193.     void resize (size_t n) { m_arraySize = n; }
  194.     size_t size (NdrUnmarshalStream*);
  195.     size_t alignment () const;
  196.     long value () const { return 0; }
  197.     void bind (void*);
  198.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  199.     HRESULT marshal2 (NdrMarshalStream* pStrm);
  200.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  201.     HRESULT unmarshal2 (NdrUnmarshalStream* pStrm);
  202.     
  203.   protected:
  204.     NdrTypeDesc m_pElementType; // type of element
  205.     size_t m_nElementSize; // size of one element
  206.     void* m_ptr; // ptr to current element
  207.     size_t m_arraySize; // (transmitted) size of array
  208.     size_t m_offset; // offset of mshl data
  209.     size_t m_max; // max len of array
  210.     };
  211. //////////////////////////////////////////////////////////////////////////
  212. //
  213. // NdrConfArray -- an NdrType subclass that represents a 'conformant
  214. // array' at the IDL/C++ level. It sub-classes NdrArray (the
  215. // fixed-size array representation) and over-rides the marshal() and
  216. // unmarshal() methods. Note that conformant arrays inside structures
  217. // (conformant structures) are actual typed by WIDL as plain arrays,
  218. // and conformant arrays are only used for method args, or are behind
  219. // [unique] pointers if inside structures.
  220. //
  221. class NdrConfArray : public NdrArray
  222.     {
  223.   public:
  224.     NdrConfArray (NDRTYPES& n) : NdrArray (n)
  225. {}
  226.     TypeKind kind () const { return TK_CARRAY; }
  227.     size_t size (NdrUnmarshalStream*);
  228.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  229.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  230.     };
  231. //////////////////////////////////////////////////////////////////////////
  232. //
  233. // NdrConfVarArray -- an NdrType subclass that represents a
  234. // 'conformant varying array' at the IDL/C++ level. It sub-classes
  235. // NdrConfArray and records the 'max' size of the array, which is
  236. // different from the transmitted size of the array, and is declared
  237. // like:-
  238. //
  239. // [size_is(max), length_is(num)] FOO* pFoo
  240. //
  241. // meaning that although the maximum size of the array is 'max' only
  242. // 'num' elements are actually transmitted. Thanks DCE!
  243. //
  244. class NdrConfVarArray : public NdrConfArray
  245.     {
  246.   public:
  247.     NdrConfVarArray (NDRTYPES& n) : NdrConfArray (n)
  248. {}
  249.     TypeKind kind () const { return TK_CVARRAY; }
  250.     size_t size (NdrUnmarshalStream*);
  251.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  252.     };
  253. //////////////////////////////////////////////////////////////////////////
  254. //
  255. // NdrConfStruct -- an NdrType subclass that represents a 'conformant
  256. // structure' at the IDL/C++ level, i.e. a structure whose final member
  257. // is a conformant array, and the length of this array is held in one 
  258. // of the structures other members.
  259. //
  260. // To achieve this, the final member is treated as if it were a
  261. // fixed-size array, i.e. the WIDL-generated code should contain a
  262. // pointer to an NdrArray as the last member of the structure
  263. // definition, and it will be manipulated by the NdrConfStruct
  264. // marshaling routines so that it works correctly. When the conformant
  265. // structure is marshaled, the array-length is marshaled before the
  266. // structure itself.
  267. //
  268. class NdrConfStruct : public NdrStruct
  269.     {
  270.   public:
  271.     NdrConfStruct (NDRTYPES& n) : NdrStruct (n)
  272. {}
  273.     TypeKind kind () const { return TK_CSTRUCT; }
  274.     size_t size (NdrUnmarshalStream*);
  275.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  276.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  277.   private:
  278.     size_t confElemResize ();
  279.     };
  280. //////////////////////////////////////////////////////////////////////////
  281. //
  282. // NdrInterface -- an NdrType subclass that represents a COM interface
  283. // pointer at the 'C' or IDL level. The bind() method always takes the
  284. // address of the interface-pointer variable, whether marshaling or
  285. // unmarshaling.
  286. //
  287. class NdrInterface : public NdrType
  288.     {
  289.   public:
  290.     NdrInterface (NDRTYPES& n) : NdrType (n), m_pPointer (0)
  291. {}
  292.     void init (REFIID riid) { m_iid = riid; }
  293.     
  294.     TypeKind kind () const { return TK_INTERFACE; }
  295.     void resize (size_t) {}
  296.     size_t size (NdrUnmarshalStream*) { return sizeof (void*); }
  297.     size_t alignment () const { return sizeof (void*); }
  298.     long value () const { return 0; }
  299.     void bind (void* pv);
  300.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  301.     HRESULT marshal2 (NdrMarshalStream* pStrm);
  302.     HRESULT unmarshal (NdrUnmarshalStream* pStrm);
  303.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  304.     HRESULT unmarshal2 (NdrUnmarshalStream* pStrm);
  305.     
  306.   protected:
  307.     IUnknown** m_pPointer; // address of interface-ptr
  308.     IID m_iid; // IID of interface
  309.     };
  310. //////////////////////////////////////////////////////////////////////////
  311. //
  312. // NdrBSTR -- an NdrType subclass that represents a BSTR type...
  313. //
  314. class NdrBSTR : public NdrType
  315.     {
  316.   public:
  317.     NdrBSTR (NDRTYPES& n) : NdrType (n), m_pBstr (0)
  318. {}
  319.     TypeKind kind () const { return TK_BSTR; }
  320.     void resize (size_t) {}
  321.     size_t size (NdrUnmarshalStream*) { return sizeof (void*); }
  322.     size_t alignment () const { return sizeof (void*); }
  323.     long value () const { return 0; }
  324.     void bind (void* pv) { m_pBstr = (BSTR*) pv; }
  325.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  326.     HRESULT marshal2 (NdrMarshalStream* pStrm);
  327.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  328.     HRESULT unmarshal2 (NdrUnmarshalStream* pStrm);
  329.     
  330.   protected:
  331.     BSTR* m_pBstr; // ptr to BSTR variable
  332.     };
  333. //////////////////////////////////////////////////////////////////////////
  334. //
  335. // NdrVariant -- an NdrType subclass that represents a VARIANT type...
  336. //
  337. class NdrVariant : public NdrType
  338.     {
  339.   public:
  340.     NdrVariant (NDRTYPES& n) : NdrType (n), m_pVariant (0)
  341. {}
  342.     TypeKind kind () const { return TK_STRUCT; }
  343.     void resize (size_t) {}
  344.     size_t size (NdrUnmarshalStream*);
  345.     size_t alignment () const { return sizeof (long); }
  346.     long value () const { return 0; }
  347.     void bind (void* pv) { m_pVariant = (VARIANT*) pv; }
  348.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  349.     HRESULT marshal2 (NdrMarshalStream* pStrm);
  350.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  351.     HRESULT unmarshal2 (NdrUnmarshalStream* pStrm);
  352.     
  353.   protected:
  354.     VARIANT* m_pVariant; // ptr to VARIANT variable
  355.     };
  356. //////////////////////////////////////////////////////////////////////////
  357. //
  358. // NdrSafearray -- an NdrType subclass that represents a SAFEARRAY type...
  359. //
  360. class NdrSafearray : public NdrType
  361.     {
  362.   public:
  363.     NdrSafearray (NDRTYPES& n);
  364.     ~NdrSafearray ();
  365.     TypeKind kind () const { return TK_STRUCT; }
  366.     void resize (size_t) {}
  367.     size_t size (NdrUnmarshalStream*) { return sizeof (ULONG); }
  368.     size_t alignment () const { return sizeof (long); }
  369.     long value () const { return 0; }
  370.     void bind (void * pv);
  371.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  372.     HRESULT marshal2 (NdrMarshalStream* pStrm);
  373.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  374.     HRESULT unmarshal2 (NdrUnmarshalStream* pStrm);
  375.     
  376.   protected:
  377.     VARIANT* m_pVariant; // ptr to VARIANT variable. This contains the
  378.                                 // memory rep of the SAFEARRAY.
  379.   private:
  380.     enum
  381.         {
  382.         PHASE1 = 0,
  383.         PHASE2
  384.         }       m_phase;        // used in unmarshalling pointer types.
  385.     SAFEARRAY * m_pTag;         // used to hold a list of the tags for
  386.                                 // unmarshalling pointer types.
  387.     HRESULT actionArray 
  388.         (
  389.         int                     dim, 
  390.         NdrMarshalStream *      pMaStrm,
  391.         NdrUnmarshalStream *    pUnStrm,
  392.         long *                  ix
  393.         );
  394.     HRESULT marshalBody (NdrMarshalStream * pStrm, long * ix);
  395.     HRESULT unmarshalBody (NdrUnmarshalStream * pStrm, long * ix);
  396.     };
  397. //////////////////////////////////////////////////////////////////////////
  398. //
  399. // NdrWString -- an NdrType subclass that represents a wide-string,
  400. // NULL-terminated...
  401. //
  402. class NdrWString : public NdrType
  403.     {
  404.   public:
  405.     NdrWString (NDRTYPES& n) : NdrType (n), m_pString (0) {}
  406.     TypeKind kind () const { return TK_PTR; }
  407.     void resize (size_t) {}
  408.     size_t size (NdrUnmarshalStream*);
  409.     size_t alignment () const { return sizeof (long); }
  410.     long value () const { return 0; }
  411.     void bind (void* pv) { m_pString = (OLECHAR*) pv; }
  412.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  413.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  414.     
  415.   protected:
  416.     OLECHAR* m_pString; // ptr to string
  417.     size_t m_max; // max length of string
  418.     size_t m_offset; // offset of mshl data
  419.     size_t m_len; // len of mshl data
  420.     };
  421. //////////////////////////////////////////////////////////////////////////
  422. //
  423. // NdrCString -- an NdrType subclass that represents a wide-string,
  424. // NULL-terminated...
  425. //
  426. class NdrCString : public NdrType
  427.     {
  428.   public:
  429.     NdrCString (NDRTYPES& n) : NdrType (n), m_pString (0) {}
  430.     TypeKind kind () const { return TK_PTR; }
  431.     void resize (size_t) {}
  432.     size_t size (NdrUnmarshalStream*);
  433.     size_t alignment () const { return sizeof (long); }
  434.     long value () const { return 0; }
  435.     void bind (void* pv) { m_pString = (char*) pv; }
  436.     HRESULT marshal1 (NdrMarshalStream* pStrm);
  437.     HRESULT unmarshal1 (NdrUnmarshalStream* pStrm);
  438.     
  439.   protected:
  440.     char* m_pString; // ptr to string
  441.     size_t m_max; // max length of string
  442.     size_t m_offset; // offset of mshl data
  443.     size_t m_len; // len of mshl data
  444.     };
  445. //////////////////////////////////////////////////////////////////////////
  446. //
  447. // NdrTypeFactory -- serves up memory for instances of any of the
  448. // supported marshalable types, and records them so that they are
  449. // destroyed when this object is destroyed. It achieves this by
  450. // allocating the type elements from a private heap, which is
  451. // destroyed upon destruction of the object itself. It relies on the
  452. // class NdrType having a special placement-new operator which
  453. // allocates memory from this factory object's private heap.
  454. //
  455. class NdrTypeFactory
  456.     {
  457.     enum { TYPESIZE=32 };
  458.     
  459.   public:
  460.     NdrTypeFactory (int hint=256);
  461.     ~NdrTypeFactory ();
  462.     void* allocate (size_t);
  463.     
  464.   private:
  465.     char* m_begin;
  466.     char* m_curr;
  467.     char* m_end;
  468.     };
  469. #endif