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

VxWorks

开发平台:

C/C++

  1. /* RpcPdu.cpp - COM/DCOM RpcPdu class implementation */
  2. /*
  3. modification history
  4. --------------------
  5. 01z,17dec01,nel  Add include symbol for diab build.
  6. 01y,10dec01,dbs  diab build
  7. 01x,08oct01,nel  SPR#70120. reformat ALTER_CONTEXT_RESP separately from
  8.                  BIND_ACK.
  9. 01w,13jul01,dbs  fix up includes
  10. 01v,15aug00,nel  Win2K Fix.
  11. 01u,27jun00,dbs  NDR-format presCtxId
  12. 01t,22jun00,dbs  add accessors for alter_context_resp
  13. 01s,19aug99,aim  change assert to VXDCOM_ASSERT
  14. 01r,20jul99,aim  grow vector when building incoming pdu
  15. 01q,09jul99,dbs  copied from NRpcPdu into RpcPdu files
  16. 01p,07jul99,aim  removed debug from makeReplyBuffer
  17. 01o,06jul99,aim  added isBindNak
  18. 01n,02jul99,aim  added isBindAck
  19. 01m,25jun99,dbs  add authn properties
  20. 01l,24jun99,dbs  move authn into new class
  21. 01k,18jun99,aim  set data rep on outgoing packets
  22. 01j,17jun99,aim  changed assert to assert
  23. 01i,01jun99,dbs  add NDR formatting to FAULT packet header
  24. 01h,19may99,dbs  send packet in fragments so no copying required
  25. 01g,11may99,dbs  rename VXCOM to VXDCOM
  26. 01f,07may99,dbs  add method to return object ID
  27. 01e,29apr99,dbs  fix -Wall warnings
  28. 01d,28apr99,dbs  add mem-pool
  29. 01c,26apr99,aim  added TRACE_CALL
  30. 01b,21apr99,dbs  change RPCMSG to RpcPdu
  31. 01a,20apr99,dbs  created during Grand Renaming
  32. */
  33. /*
  34.   DESCRIPTION:
  35.   RpcPdu -- RPC Protocol Data Unit class.
  36. */
  37. #include <stdio.h>
  38. #include <ctype.h>
  39. #include "RpcPdu.h"
  40. #include "orpcLib.h"
  41. #include "dcomProxy.h"
  42. #include "Syslog.h"
  43. #include "TraceCall.h"
  44. /* Include symbol for diab */
  45. extern "C" int include_vxdcom_RpcPdu (void)
  46.     {
  47.     return 0;
  48.     }
  49. //////////////////////////////////////////////////////////////////////////
  50. //
  51. RpcPdu::RpcPdu ()
  52.   : m_headerOffset (0),
  53.     m_stubData (),
  54.     m_requiredOctets (sizeof (rpc_cn_common_hdr_t)),
  55.     m_pduState (HAVE_NONE)
  56.     {
  57.     TRACE_CALL;
  58.     m_headerOffset = reinterpret_cast<char*> (&m_header);
  59.     (void) ::memset (&m_header, 0, sizeof (m_header));
  60.     }
  61. RpcPdu::~RpcPdu ()
  62.     {
  63.     TRACE_CALL;
  64.     }
  65. //////////////////////////////////////////////////////////////////////////
  66. //
  67. void RpcPdu::guidReformat
  68.     (
  69.     GUID&                guid,
  70.     ULONG                drep
  71.     )
  72.     {
  73.     TRACE_CALL;
  74.     ndr_make_right (guid.Data1, drep);
  75.     ndr_make_right (guid.Data2, drep);
  76.     ndr_make_right (guid.Data3, drep);
  77.     }
  78. //////////////////////////////////////////////////////////////////////////
  79. //
  80. void RpcPdu::commonHdrReformat
  81.     (
  82.     ULONG                drep
  83.     )
  84.     {
  85.     TRACE_CALL;
  86.     rpc_cn_packet_t* pHdr = &m_header;
  87.     
  88.     ndr_make_right (pHdr->request.hdr.fragLen, drep);
  89.     ndr_make_right (pHdr->request.hdr.authLen, drep);
  90.     ndr_make_right (pHdr->request.hdr.callId, drep);
  91.     }
  92. //////////////////////////////////////////////////////////////////////////
  93. //
  94. void RpcPdu::extHdrReformat
  95.     (
  96.     ULONG                drep
  97.     )
  98.     {
  99.     TRACE_CALL;
  100.     rpc_cn_packet_t* pHdr = &m_header;
  101.     
  102.     switch (pHdr->request.hdr.packetType)
  103.         {
  104.         case RPC_CN_PKT_REQUEST:
  105.             ndr_make_right (pHdr->request.allocHint, drep);
  106.             ndr_make_right (pHdr->request.presCtxId, drep);
  107.             ndr_make_right (pHdr->request.methodNum, drep);
  108.             if (pHdr->request.hdr.flags & RPC_CN_FLAGS_OBJECT_UUID)
  109.                 guidReformat (pHdr->request.objectId, drep);
  110.             break;
  111.         case RPC_CN_PKT_RESPONSE:
  112.             ndr_make_right (pHdr->request.allocHint, drep);
  113.             ndr_make_right (pHdr->request.presCtxId, drep);
  114.             break;
  115.         case RPC_CN_PKT_BIND:
  116.         case RPC_CN_PKT_ALTER_CONTEXT:
  117.             ndr_make_right (pHdr->bind.maxTxFrag, drep);
  118.             ndr_make_right (pHdr->bind.maxRxFrag, drep);
  119.             ndr_make_right (pHdr->bind.assocGroupId, drep);
  120.             guidReformat (pHdr->bind.presCtxList.presCtxElem
  121.                           [0].abstractSyntax.id,
  122.                           drep);
  123.             ndr_make_right (pHdr->bind.presCtxList.presCtxElem
  124.                  [0].abstractSyntax.version, drep);
  125.             ndr_make_right (pHdr->bind.presCtxList.presCtxElem[0].presCtxId, 
  126.                             drep);
  127.             guidReformat (pHdr->bind.presCtxList.presCtxElem
  128.                           [0].transferSyntax [0].id,
  129.                           drep);
  130.             ndr_make_right (pHdr->bind.presCtxList.presCtxElem
  131.                  [0].transferSyntax [0].version, drep);
  132.             break;
  133.         case RPC_CN_PKT_BIND_ACK:
  134.     ndr_make_right (pHdr->bind_ack.maxTxFrag, drep);
  135.     ndr_make_right (pHdr->bind_ack.maxRxFrag, drep);
  136.     ndr_make_right (pHdr->bind_ack.assocGroupId, drep);
  137.     ndr_make_right (pHdr->bind_ack.secAddr.len, drep);
  138.             ndr_make_right (pHdr->bind_ack.resultList.presResult [0].result, drep);
  139.             ndr_make_right (pHdr->bind_ack.resultList.presResult [0].reason, drep);
  140.     ndr_make_right (pHdr->bind_ack.resultList.presResult
  141.     [0].transferSyntax.version, drep);
  142.     guidReformat (pHdr->bind_ack.resultList.presResult
  143.   [0].transferSyntax.id, drep);
  144.             break;
  145.         case RPC_CN_PKT_ALTER_CONTEXT_RESP:
  146.     ndr_make_right (pHdr->alter_context_resp.maxTxFrag, drep);
  147.     ndr_make_right (pHdr->alter_context_resp.maxRxFrag, drep);
  148.     ndr_make_right (pHdr->alter_context_resp.assocGroupId, drep);
  149.     ndr_make_right (pHdr->alter_context_resp.secAddr, drep);
  150.             ndr_make_right (pHdr->alter_context_resp.resultList.presResult [0].result, drep);
  151.             ndr_make_right (pHdr->alter_context_resp.resultList.presResult [0].reason, drep);
  152.     ndr_make_right (pHdr->alter_context_resp.resultList.presResult
  153.     [0].transferSyntax.version, drep);
  154.     guidReformat (pHdr->alter_context_resp.resultList.presResult
  155.   [0].transferSyntax.id, drep);
  156.             break;
  157.         case RPC_CN_PKT_FAULT:
  158.             ndr_make_right (pHdr->fault.status, drep);
  159.             break;
  160.         }
  161.     }
  162. //////////////////////////////////////////////////////////////////////////
  163. //
  164. const rpc_cn_auth_tlr_t*
  165. RpcPdu::authTrailer () const
  166.     {
  167.     TRACE_CALL;
  168.     ULONG alen = authLen ();
  169.     if (alen == 0)
  170.         return 0;
  171. #ifdef __DCC__
  172.     const char* stubDataOffset = &(*(m_stubData.begin ()));
  173. #else
  174.     const char* stubDataOffset = reinterpret_cast<const char*>
  175.                                  (m_stubData.begin ());
  176. #endif
  177.     
  178.     if (stubDataOffset == 0)
  179.         return 0;
  180.     return reinterpret_cast<rpc_cn_auth_tlr_t*>
  181.         (const_cast<char *>
  182.         (stubDataOffset + (payloadLen () -
  183.                            (alen + SIZEOF_AUTH_TLR_PREAMBLE))));
  184.     }
  185. // this always includes the auth-trailer if present
  186. size_t
  187. RpcPdu::payloadLen () const
  188.     {
  189.     TRACE_CALL;
  190.     return m_stubData.size ();
  191.     }
  192. // this *only* the stub data length
  193. size_t RpcPdu::stubDataLen () const
  194.     {
  195.     return (payloadLen () - authLen ());
  196.     }
  197. ULONG
  198. RpcPdu::hdrLen () const
  199.     {
  200.     TRACE_CALL;
  201.     ULONG n = 0;
  202.     switch (m_header.request.hdr.packetType)
  203.         {
  204.         case RPC_CN_PKT_REQUEST:
  205.             n = sizeof (rpc_cn_request_hdr_t);
  206.             if (! (m_header.request.hdr.flags & RPC_CN_FLAGS_OBJECT_UUID))
  207.                 n -= sizeof (GUID);
  208.             break;
  209.         case RPC_CN_PKT_RESPONSE:
  210.             n = sizeof (rpc_cn_response_hdr_t);
  211.             break;
  212.         case RPC_CN_PKT_BIND:
  213.         case RPC_CN_PKT_ALTER_CONTEXT:
  214.             n = sizeof (rpc_cn_bind_hdr_t);
  215.             break;
  216.         case RPC_CN_PKT_BIND_ACK:
  217.             n = sizeof (rpc_cn_bind_ack_hdr_t);
  218.             break;
  219.         case RPC_CN_PKT_ALTER_CONTEXT_RESP:
  220.             n = sizeof (rpc_cn_alter_context_resp_hdr_t);
  221.             break;
  222.         case RPC_CN_PKT_BIND_NAK:
  223.             n = sizeof (rpc_cn_bind_nak_hdr_t);
  224.             break;
  225.         case RPC_CN_PKT_AUTH3:
  226.             n = sizeof (rpc_cn_auth3_hdr_t);
  227.             break;
  228.             
  229.         case RPC_CN_PKT_SHUTDOWN:
  230.         case RPC_CN_PKT_REMOTE_ALERT:
  231.         case RPC_CN_PKT_ORPHANED:
  232.             n = sizeof (rpc_cn_common_hdr_t);
  233.             break;
  234.         case RPC_CN_PKT_FAULT:
  235.             n = sizeof (rpc_cn_fault_hdr_t);
  236.             break;
  237.         default:
  238.             // log warning
  239.             n = 4096;
  240.             break;
  241.         }
  242.     return n;
  243.     }
  244.     
  245. void
  246. RpcPdu::opnumSet (USHORT op)
  247.     {
  248.     TRACE_CALL;
  249.     m_header.request.methodNum = op;
  250.     }
  251. void
  252. RpcPdu::fragLenSet ()
  253.     {
  254.     TRACE_CALL;
  255.     int len = hdrLen () + payloadLen ();
  256.     m_header.request.hdr.fragLen = len;
  257.     if (packetType () == RPC_CN_PKT_REQUEST)
  258.         m_header.request.allocHint = len;
  259.     else if (packetType () == RPC_CN_PKT_RESPONSE)
  260.         m_header.response.allocHint = len;
  261.     }
  262. void
  263. RpcPdu::authLenSet (size_t n)
  264.     {
  265.     TRACE_CALL;
  266.     m_header.request.hdr.authLen = n;
  267.     }
  268. void
  269. RpcPdu::drepSet ()
  270.     {
  271.     TRACE_CALL;
  272.     * (ULONG*) m_header.request.hdr.drep = ORPC_WIRE_DREP;
  273.     }
  274. void
  275. RpcPdu::drepSet (ULONG dr)
  276.     {
  277.     TRACE_CALL;
  278.     * (ULONG*) m_header.request.hdr.drep = dr;
  279.     }
  280. size_t
  281. RpcPdu::stubDataAppend (const void* pv, size_t n)
  282.     {
  283.     TRACE_CALL;
  284.     const char* p = reinterpret_cast<const char*> (pv);
  285.     m_stubData.insert (m_stubData.end (), p, p +n);
  286.     return n;
  287.     }
  288. const GUID& RpcPdu::objectId () const
  289.     {
  290.     TRACE_CALL;
  291.     if (m_header.request.hdr.flags & RPC_CN_FLAGS_OBJECT_UUID)
  292.         return m_header.request.objectId;
  293.     return GUID_NULL;
  294.     }
  295. ///////////////////////////////////////////////////////////////////////////////
  296. //
  297. bool
  298. RpcPdu::complete () const
  299.     {
  300.     return m_pduState & HAVE_STUB;
  301.     }
  302. size_t
  303. RpcPdu::appendCommonHdr (const char* buf, size_t len)
  304.     {
  305.     COM_ASSERT (m_pduState & HAVE_NONE);
  306.     size_t n = min(len, m_requiredOctets); // octets to copy
  307.     ::memcpy (m_headerOffset, buf, n);
  308.     m_headerOffset += n;
  309.     m_requiredOctets -= n;
  310.     if (m_requiredOctets == 0)
  311.         {
  312.         // Un-NDR the packet header...
  313.         commonHdrReformat (drep ());
  314.         // mark the next state's requirements
  315.         m_pduState = HAVE_HDR;
  316.         m_requiredOctets = hdrLen () - sizeof (rpc_cn_common_hdr_t);
  317.         if (len - n > 0)
  318.             n += appendExtendedHdr (buf + n, len - n);
  319.         }
  320.     return n;
  321.     }
  322. size_t
  323. RpcPdu::appendExtendedHdr (const char* buf, size_t len)
  324.     {
  325.     COM_ASSERT (m_pduState & HAVE_HDR);
  326.     size_t n = min(len, m_requiredOctets); // octets to copy
  327.     ::memcpy (m_headerOffset, buf, n);
  328.     m_headerOffset += n;
  329.     m_requiredOctets -= n;
  330.     if (m_requiredOctets == 0)
  331.         {
  332.         // Un-NDR the remainder of the header...
  333.         extHdrReformat (drep ());
  334.         // mark the next state's requirements
  335.         m_pduState = HAVE_XHDR;
  336.         m_requiredOctets = fragLen () - hdrLen ();
  337.         if (m_requiredOctets > 0)
  338.             m_stubData.reserve (m_requiredOctets);
  339.         if (m_requiredOctets > 0 && (len - n) > 0)
  340.             n += appendStubData (buf + n, len - n);
  341.         else if (m_requiredOctets == 0)
  342.             m_pduState = HAVE_STUB;
  343.         }
  344.     return n;
  345.     }
  346. size_t
  347. RpcPdu::appendStubData (const char* buf, size_t len)
  348.     {
  349.     size_t n = min(len, m_requiredOctets); // octets to copy
  350.     m_stubData.insert (m_stubData.end (), buf, buf + n);
  351.     if ((m_requiredOctets -= n) == 0)
  352.         m_pduState = HAVE_STUB;
  353.     return n;
  354.     }
  355. size_t
  356. RpcPdu::append (const char* buf, size_t len)
  357.     {
  358.     if (len < 0)
  359.         return 0;
  360.     switch (m_pduState)
  361.         {
  362.     case HAVE_NONE:
  363.         return appendCommonHdr (buf, len);
  364.     case HAVE_HDR:
  365.         return appendExtendedHdr (buf, len);
  366.     case HAVE_XHDR:
  367.         return appendStubData (buf, len);
  368.     default:
  369.         return 0;
  370.         }
  371.     return 0;
  372.     }
  373. const rpc_cn_common_hdr_t*
  374. RpcPdu::commonHdr () const
  375.     {
  376.     return &m_header.request.hdr;
  377.     }
  378. size_t
  379. RpcPdu::commonHdrLen () const
  380.     {
  381.     return sizeof (m_header.request.hdr);
  382.     }
  383.     
  384. const rpc_cn_bind_ack_hdr_t&
  385. RpcPdu::bind_ack () const
  386.     {
  387.     return m_header.bind_ack;
  388.     }
  389. const rpc_cn_bind_nak_hdr_t&
  390. RpcPdu::bind_nak () const
  391.     {
  392.     return m_header.bind_nak;
  393.     }
  394. const rpc_cn_bind_hdr_t&
  395. RpcPdu::bind () const
  396.     {
  397.     return m_header.bind;
  398.     }
  399. const rpc_cn_request_hdr_t&
  400. RpcPdu::request () const
  401.     {
  402.     return m_header.request;
  403.     }
  404.     
  405. const rpc_cn_response_hdr_t&
  406. RpcPdu::response () const
  407.     {
  408.     return m_header.response;
  409.     }
  410. const rpc_cn_auth3_hdr_t&
  411. RpcPdu::auth3 () const
  412.     {
  413.     return m_header.auth3;
  414.     }
  415. const rpc_cn_fault_hdr_t&
  416. RpcPdu::fault () const
  417.     {
  418.     return m_header.fault;
  419.     }
  420. const rpc_cn_alter_context_resp_hdr_t&
  421. RpcPdu::alter_context_resp () const
  422.     {
  423.     return m_header.alter_context_resp;
  424.     }
  425. rpc_cn_common_hdr_t*
  426. RpcPdu::commonHdr () 
  427.     {
  428.     return &m_header.request.hdr;
  429.     }
  430.     
  431. rpc_cn_bind_ack_hdr_t&
  432. RpcPdu::bind_ack () 
  433.     {
  434.     return m_header.bind_ack;
  435.     }
  436.     
  437. rpc_cn_bind_nak_hdr_t&
  438. RpcPdu::bind_nak ()
  439.     {
  440.     return m_header.bind_nak;
  441.     }
  442. rpc_cn_bind_hdr_t&
  443. RpcPdu::bind ()
  444.     {
  445.     return m_header.bind;
  446.     }
  447. rpc_cn_request_hdr_t&
  448. RpcPdu::request ()
  449.     {
  450.     return m_header.request;
  451.     }
  452.     
  453. rpc_cn_response_hdr_t&
  454. RpcPdu::response ()
  455.     {
  456.     return m_header.response;
  457.     }
  458. rpc_cn_auth3_hdr_t&
  459. RpcPdu::auth3 ()
  460.     {
  461.     return m_header.auth3;
  462.     }
  463. rpc_cn_fault_hdr_t&
  464. RpcPdu::fault ()
  465.     {
  466.     return m_header.fault;
  467.     }
  468. rpc_cn_alter_context_resp_hdr_t&
  469. RpcPdu::alter_context_resp ()
  470.     {
  471.     return m_header.alter_context_resp;
  472.     }
  473. ULONG
  474. RpcPdu::drep () const
  475.     {
  476.     return * (reinterpret_cast<const ULONG*> (m_header.request.hdr.drep));
  477.     }
  478. ULONG 
  479. RpcPdu::opnum () const
  480.     {
  481.     return m_header.request.methodNum;
  482.     }
  483. ULONG
  484. RpcPdu::callId () const
  485.     {
  486.     return m_header.request.hdr.callId;
  487.     }
  488. int
  489. RpcPdu::packetType () const
  490.     {
  491.     return m_header.request.hdr.packetType;
  492.     }
  493. USHORT
  494. RpcPdu::fragLen () const
  495.     {
  496.     return m_header.request.hdr.fragLen;
  497.     }
  498. ULONG
  499. RpcPdu::authLen () const
  500.     {
  501.     return m_header.request.hdr.authLen;
  502.     }
  503. const void*
  504. RpcPdu::stubData () const
  505.     {
  506. #ifdef __DCC__
  507.     return &(*(m_stubData.begin ()));
  508. #else
  509.     return m_stubData.begin ();
  510. #endif
  511.     }
  512. void*
  513. RpcPdu::stubData ()
  514.     {
  515. #ifdef __DCC__
  516.     return &(*(m_stubData.begin ()));
  517. #else
  518.     return m_stubData.begin ();
  519. #endif
  520.     }
  521. bool
  522. RpcPdu::isRequest () const
  523.     {
  524.     return (packetType () == RPC_CN_PKT_REQUEST);
  525.     }
  526. bool
  527. RpcPdu::isBind () const
  528.     {
  529.     return ((packetType () == RPC_CN_PKT_BIND) ||
  530.             (packetType () == RPC_CN_PKT_ALTER_CONTEXT));
  531.     }
  532. bool
  533. RpcPdu::isBindAck () const
  534.     {
  535.     return (packetType () == RPC_CN_PKT_BIND_ACK);
  536.     }
  537. bool
  538. RpcPdu::isBindNak () const
  539.     {
  540.     return (packetType () == RPC_CN_PKT_BIND_NAK);
  541.     }
  542. bool
  543. RpcPdu::isAuth3 () const
  544.     {
  545.     return (packetType () == RPC_CN_PKT_AUTH3);
  546.     }
  547. bool
  548. RpcPdu::isResponse () const
  549.     {
  550.     return (packetType () == RPC_CN_PKT_RESPONSE);
  551.     }
  552. bool
  553. RpcPdu::isFault () const
  554.     {
  555.     return (packetType () == RPC_CN_PKT_FAULT);
  556.     }
  557. bool
  558. RpcPdu::isAlterContextResp () const
  559.     {
  560.     return (packetType () == RPC_CN_PKT_ALTER_CONTEXT_RESP);
  561.     }
  562. int
  563. RpcPdu::makeReplyBuffer (char*& buf, size_t& buflen)
  564.     {
  565.     int hdrLength = hdrLen ();
  566.     int payloadLength = payloadLen ();
  567.     buflen = hdrLength + payloadLength;
  568.     buf = new char[buflen];
  569.     if (buf)
  570.         {
  571.         // Set the fragment-length field, and the DREP...
  572.         fragLenSet ();
  573.         drepSet ();
  574.         // Format the packet into the correct NDR mode...
  575.         commonHdrReformat (drep ());
  576.         extHdrReformat (drep ());
  577.         char* header = reinterpret_cast<char*> (&m_header);
  578.         ::memcpy (buf, header, hdrLength);
  579.         if (payloadLength > 0)
  580.             ::memcpy (buf + hdrLength, stubData (), payloadLength);
  581.         }
  582.     return buf ? 0 : -1;
  583.     }
  584. GUID
  585. RpcPdu::iid () const
  586.     {
  587.     // assumes its a bind packet
  588.     return bind ().presCtxList.presCtxElem [0].abstractSyntax.id;
  589.     }
  590. ostream&
  591. operator<< (ostream& os, const RpcPdu& pdu)
  592.     {
  593.     char hex_string [64];
  594.     char chr_string [32];
  595.     char details [8192];        // XXX
  596.     char* s = "UNKNOWN!";
  597.     int nBytes = pdu.payloadLen ();
  598.     // Print packet type
  599.     details [0] = 0;
  600.     switch (pdu.packetType ())
  601.         {
  602.         case RPC_CN_PKT_REQUEST:
  603.             s="REQUEST";
  604.             sprintf (details, "allocHint=%lu pres-ctx=%u opnum=%u objUuid=%s",
  605.                      pdu.request ().allocHint,
  606.                      pdu.request ().presCtxId,
  607.                      pdu.request ().methodNum,
  608.                      (pdu.request ().hdr.flags & RPC_CN_FLAGS_OBJECT_UUID) ? 
  609.                      vxcomGUID2String (pdu.request ().objectId) : "not-present");
  610.             break;
  611.         case RPC_CN_PKT_RESPONSE:
  612.             s="RESPONSE";
  613.             sprintf (details, "allocHint=%lu pres-ctx=%u alertCount=%u",
  614.                      pdu.response ().allocHint,
  615.                      pdu.response ().presCtxId,
  616.                      pdu.response ().alertCount);
  617.             break;
  618.         case RPC_CN_PKT_FAULT: s="FAULT";
  619.             sprintf (details, "faultCode=0x%lx", pdu.fault().status);
  620.             break;
  621.         case RPC_CN_PKT_ALTER_CONTEXT:
  622.         case RPC_CN_PKT_BIND:
  623.             if (pdu.packetType () == RPC_CN_PKT_BIND)
  624.                 s="BIND";
  625.             else
  626.                 s="ALTER CONTEXT";
  627.             sprintf (details,
  628.                      "max-txFragSize=%u max-rxFragSize=%u assoc-grp-ID=0x%8.8lX pres-ctx=%d, IID=%s",
  629.                      pdu.bind ().maxTxFrag,
  630.                      pdu.bind ().maxRxFrag,
  631.                      pdu.bind ().assocGroupId,
  632.                      pdu.bind().presCtxList.presCtxElem[0].presCtxId,
  633.                      vxcomGUID2String (pdu.bind ().presCtxList.presCtxElem [0].abstractSyntax.id));
  634.             break;
  635.         case RPC_CN_PKT_ALTER_CONTEXT_RESP:
  636.         case RPC_CN_PKT_BIND_ACK:
  637.             if (pdu.packetType () == RPC_CN_PKT_BIND_ACK)
  638.                 s="BIND ACK";
  639.             else
  640.                 s="ALTER CONTEXT RESP";
  641.             sprintf (details,
  642.                      "max-txFragSize=%u max-rxFragSize=%u assoc-grp-ID=0x%8.8lX result=%u",
  643.                      pdu.bind_ack ().maxTxFrag,
  644.                      pdu.bind_ack ().maxRxFrag,
  645.                      pdu.bind_ack ().assocGroupId,
  646.                      pdu.bind_ack ().resultList.presResult [0].result);
  647.             break;
  648.         case RPC_CN_PKT_BIND_NAK:
  649.             s="BIND NAK";
  650.             break;
  651.         case RPC_CN_PKT_AUTH3: s="AUTH3"; break;
  652.         case RPC_CN_PKT_SHUTDOWN: s="SHUTDOWN"; break;
  653.         case RPC_CN_PKT_REMOTE_ALERT: s="ALERT"; break;
  654.         case RPC_CN_PKT_ORPHANED: s="ORPHANED"; break;
  655.         }
  656.     
  657.     os << s << " " << details;
  658.     // Print common-header info...
  659.     sprintf (details,
  660.              "ver=%d.%d flags=0x%2.2X fragmentLength=0x%X authLen=%u callID=%lu intDataRep=%s",
  661.              pdu.request ().hdr.rpcVersion,
  662.              pdu.request ().hdr.rpcMinorVersion,
  663.              pdu.request ().hdr.flags,
  664.              pdu.request ().hdr.fragLen,
  665.              pdu.request ().hdr.authLen,
  666.              pdu.request ().hdr.callId,
  667.              pdu.request ().hdr.drep [0] ? "littleEndian" :
  668.              "bigEndian");
  669.     os << " " << details << endl;
  670.     if (nBytes > 0)
  671.         {
  672.         os << " payloadLen: " << nBytes << endl;
  673.         // Binary/hex dump...
  674.         char* pbase = (char*) pdu.stubData ();
  675.         char* p = pbase;
  676.         while (nBytes > 0)
  677.             {
  678.             char*   phex = hex_string;
  679.             char*   pchr = chr_string;
  680.             
  681.             for (int j=0; j < 16; ++j)
  682.                 {
  683.                 if (nBytes > 0)
  684.                     {
  685.                     int val = p [j] & 0xFF;
  686.                     sprintf (phex, "%02X ", val);
  687.                     sprintf (pchr, "%c", isprint (val) ? val : '.');
  688.                     }
  689.                 else
  690.                     sprintf (phex, "   ");
  691.                 phex += 3;
  692.                 ++pchr;
  693.                 --nBytes;
  694.                 }
  695.               void* a = reinterpret_cast<void*> (p - pbase);
  696.               os << a << ": " << hex_string << " " << chr_string << endl;
  697.             *phex = 0;
  698.             *pchr = 0;
  699.             p += 16;
  700.             }
  701.         }
  702.     return os;
  703.     }
  704. ///////////////////////////////////////////////////////////////////////////////
  705. //
  706. void
  707. RpcPdu::stubDataAlign (size_t n)
  708.     {
  709.     while ((m_stubData.size () % n) != 0)
  710.         m_stubData.push_back (0);
  711.     }
  712. //////////////////////////////////////////////////////////////////////////
  713. //
  714. // authTrailerAppend -- appends the trailer in 'tlr' to the current
  715. // packet, its auth-data is of length 'authlen'...
  716. //
  717. HRESULT RpcPdu::authTrailerAppend
  718.     (
  719.     const rpc_cn_auth_tlr_t&        tlr,
  720.     size_t                        authlen
  721.     )
  722.     {
  723.     stubDataAlign (4);
  724.     stubDataAppend (&tlr, authlen + SIZEOF_AUTH_TLR_PREAMBLE);
  725.     authLenSet (authlen);
  726.     return S_OK;
  727.     }