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

VxWorks

开发平台:

C/C++

  1. /* RpcPdu.h - COM/DCOM RpcPdu class definition */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01g,13jul01,dbs  fix up includes
  7. 01f,22jun00,dbs  add accessors for alter_context_resp
  8. 01e,06jul99,aim  added isBindNak
  9. 01d,02jul99,aim  added isBindAck
  10. 01c,25jun99,dbs  add authn properties
  11. 01b,24jun99,dbs  move authn into new class
  12. 01a,03jun99,aim  created from RpcPdu.h
  13. */
  14. #ifndef __INCRpcPdu_h
  15. #define __INCRpcPdu_h
  16. #include <iostream>
  17. #include "rpcDceProto.h"
  18. #include "private/comStl.h"
  19. //////////////////////////////////////////////////////////////////////////
  20. //
  21. // RpcPdu - this structure is used for conveying entire RPC packets
  22. // around, removing as many copy-operations as possible. Entire packets
  23. // can be allocated in one fell swoop, and passed from the raw receive
  24. // procedure, to the point of being processed, and back to the transmit
  25. // procedure, without having to do memcpy().
  26. //
  27. // The member 'm_bufptr' always points to the next free location in the
  28. // buffer, so we can always insert extra bytes there.
  29. //
  30. class RpcPdu
  31.     {
  32.   public:
  33.     // max packet size we want to see is 4K
  34.     enum { MAXLEN=4096 };
  35.     
  36.     RpcPdu ();
  37.     ~RpcPdu ();
  38.     
  39.     bool complete () const;
  40.     size_t append (const char*, size_t len);
  41.     // return address of various packet-header fields...
  42.     size_t commonHdrLen () const;
  43.     const rpc_cn_common_hdr_t* commonHdr () const;
  44.     const rpc_cn_bind_ack_hdr_t& bind_ack () const;
  45.     const rpc_cn_bind_nak_hdr_t& bind_nak () const;
  46.     const rpc_cn_bind_hdr_t& bind () const;
  47.     const rpc_cn_request_hdr_t& request () const;
  48.     const rpc_cn_response_hdr_t& response () const;
  49.     const rpc_cn_auth3_hdr_t& auth3 () const;
  50.     const rpc_cn_fault_hdr_t& fault () const;
  51.     const rpc_cn_alter_context_resp_hdr_t& alter_context_resp () const;
  52.     operator rpc_cn_common_hdr_t& ();
  53.     operator rpc_cn_bind_ack_hdr_t& ();
  54.     operator rpc_cn_bind_nak_hdr_t& ();
  55.     operator rpc_cn_bind_hdr_t& ();
  56.     operator rpc_cn_request_hdr_t& ();
  57.     operator rpc_cn_response_hdr_t& ();
  58.     operator rpc_cn_auth3_hdr_t& ();
  59.     operator rpc_cn_fault_hdr_t& ();
  60.     operator const rpc_cn_common_hdr_t& ();
  61.     operator const rpc_cn_bind_ack_hdr_t& ();
  62.     operator const rpc_cn_bind_nak_hdr_t& ();
  63.     operator const rpc_cn_bind_hdr_t& ();
  64.     operator const rpc_cn_request_hdr_t& ();
  65.     operator const rpc_cn_response_hdr_t& ();
  66.     operator const rpc_cn_auth3_hdr_t& ();
  67.     operator const rpc_cn_fault_hdr_t& ();
  68.     rpc_cn_common_hdr_t* commonHdr ();
  69.     rpc_cn_bind_ack_hdr_t& bind_ack ();
  70.     rpc_cn_bind_nak_hdr_t& bind_nak ();
  71.     rpc_cn_bind_hdr_t& bind ();
  72.     rpc_cn_request_hdr_t& request ();
  73.     rpc_cn_response_hdr_t& response ();
  74.     rpc_cn_auth3_hdr_t& auth3 ();
  75.     rpc_cn_fault_hdr_t& fault ();
  76.     rpc_cn_alter_context_resp_hdr_t& alter_context_resp ();
  77.     // methods to return stub-data start/length...
  78.     const void* stubData () const;
  79.     void*  stubData ();
  80.     size_t stubDataLen () const;
  81.     size_t stubDataAppend (const void* pv, size_t n);
  82.     void   stubDataAlign (size_t n);
  83.     // size of stub-data + auth-trailer
  84.     size_t payloadLen () const;
  85.     // methods to access authn-trailer...
  86.     const rpc_cn_auth_tlr_t* authTrailer () const;
  87.     ULONG authLen () const;
  88.     HRESULT authTrailerAppend (const rpc_cn_auth_tlr_t&, size_t);
  89.     
  90.     // methods to return useful packet-header fields
  91.     ULONG drep () const;
  92.     ULONG opnum () const;
  93.     ULONG callId () const;
  94.     int packetType () const;
  95.     USHORT fragLen () const;
  96.     ULONG hdrLen () const;
  97.     const GUID& objectId () const;
  98.     
  99.     // methods to modify header fields
  100.     void opnumSet (USHORT op);
  101.     void fragLenSet ();
  102.     void drepSet ();
  103.     void drepSet (ULONG);
  104.     void authLenSet (size_t);
  105.     GUID iid () const;
  106.     bool isRequest () const;
  107.     bool isBind () const;
  108.     bool isBindAck () const;
  109.     bool isBindNak () const;
  110.     bool isAuth3 () const;
  111.     bool isResponse () const;
  112.     bool isFault () const;
  113.     bool isAlterContextResp () const;
  114.     
  115.     int makeReplyBuffer (char*& buf, size_t& buflen);
  116.     friend ostream& operator<< (ostream& os, const RpcPdu&);
  117.   private:
  118.     typedef STL_VECTOR(char) Stub;
  119.     typedef STL_VECTOR(char)::iterator StubIter;
  120.     rpc_cn_packet_t m_header;
  121.     char* m_headerOffset;
  122.     Stub                m_stubData;
  123.     size_t m_requiredOctets;
  124.     unsigned long m_pduState;
  125.     enum { HAVE_NONE = 0x1, // pduState
  126.    HAVE_HDR  = 0x2,
  127.    HAVE_XHDR = 0x4,
  128.    HAVE_STUB = 0x8 };
  129.     // NDR-reformat header
  130.     void commonHdrReformat (ULONG drep);
  131.     void extHdrReformat (ULONG drep);
  132.     size_t appendCommonHdr (const char* buf, size_t len);
  133.     size_t appendExtendedHdr (const char* buf, size_t len);
  134.     size_t appendStubData (const char* buf, size_t len);
  135.     static void guidReformat (GUID&, ULONG drep);
  136.     // unsupported
  137.     RpcPdu (const RpcPdu&);
  138.     RpcPdu& operator= (const RpcPdu&);
  139.     };
  140. #endif // __INCRpcPdu_h