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

VxWorks

开发平台:

C/C++

  1. /* MemoryStream.cpp - COM/DCOM MemoryStream class implementation */
  2. /*
  3. modification history
  4. --------------------
  5. 01f,17dec01,nel  Add include symbol for diab.
  6. 01e,10dec01,dbs  diab build
  7. 01d,27jun01,dbs  fix include paths and names
  8. 01c,26apr99,aim  added TRACE_CALL
  9. 01b,23apr99,dbs  add simpler mem-stream implementation using vector
  10. 01a,20apr99,dbs  created during Grand Renaming
  11. */
  12. /*
  13.   DESCRIPTION:
  14.   MemoryStream -- 
  15. */
  16. #include "TraceCall.h"
  17. #include "MemoryStream.h"
  18. /* Include symbol for diab */
  19. extern "C" int include_vxcom_MemoryStream (void)
  20.     {
  21.     return 0;
  22.     }
  23. ////////////////////////////////////////////////////////////////////////////
  24. //
  25. // IID_ISimpleStream is {81D2333D-F973-11d2-A800-00C04F68A5B5}
  26. //
  27. const IID IID_ISimpleStream =
  28.     { 0x81d2333d, 0xf973, 0x11d2, 
  29.     { 0xa8, 0x0, 0x0, 0xc0, 0x4f, 0x68, 0xa5, 0xb5 } };
  30. ////////////////////////////////////////////////////////////////////////////
  31. //
  32. MemoryStream::MemoryStream () : m_curr (0)
  33.     {
  34.     TRACE_CALL;
  35.     }
  36. ////////////////////////////////////////////////////////////////////////////
  37. //
  38. MemoryStream::~MemoryStream ()
  39.     {
  40.     TRACE_CALL;
  41.     }
  42. ////////////////////////////////////////////////////////////////////////////
  43. //
  44. // MemoryStream::extract -- reads 'nb' bytes from the stream to
  45. // address 'pv' and returns the number of bytes read. This number may
  46. // legitimately be smaller than that requested.
  47. //
  48. ULONG MemoryStream::extract (void* pv, ULONG nb)
  49.     {
  50.     TRACE_CALL;
  51.     // Adjust size if there aren't enough bytes in the stream
  52.     if ((m_vector.size () - m_curr) < nb)
  53. nb = m_vector.size () - m_curr;
  54.     // copy 'nb' bytes from the stream to 'pv'
  55. #ifdef __DCC__
  56.     char* dest = reinterpret_cast<char*> (pv);
  57.     ITERATOR i = m_vector.begin () + m_curr;
  58.     ITERATOR j = i + nb;
  59.     copy (i, j, dest);
  60. #else
  61.     memcpy (pv, m_vector.begin () + m_curr, nb);
  62. #endif
  63.     
  64.     // adjust the current location
  65.     m_curr += nb;
  66.     // return the number of bytes read
  67.     return nb;
  68.     }
  69. ////////////////////////////////////////////////////////////////////////////
  70. //
  71. // MemoryStream::insert -- writes 'nb' bytes into the stream (at the
  72. // current location) from the data pointed to by 'pv' and returns the
  73. // number of bytes written.
  74. //
  75. ULONG MemoryStream::insert (const void* pv, ULONG nb)
  76.     {
  77.     TRACE_CALL;
  78.     // ensure the array is big enough
  79.     m_vector.reserve (m_curr + nb);
  80.     // insert bytes from 'pv' into the stream
  81.     m_vector.insert (m_vector.begin () + m_curr,
  82.      (char*)pv,
  83.      ((char*)pv) + nb);
  84.     // update current position
  85.     m_curr += nb;
  86.     // return number of bytes written
  87.     return nb;
  88.     }
  89. ////////////////////////////////////////////////////////////////////////////
  90. //
  91. // MemoryStream::locationSet -- move the current location of the
  92. // stream to the given position 'pos' and return the current position
  93. // after the move. If the requested position is outside the current
  94. // stream, then the location is not changed, and (-1) is returned.
  95. //
  96. ULONG MemoryStream::locationSet (ULONG pos)
  97.     {
  98.     TRACE_CALL;
  99.     if (pos > m_vector.size ())
  100. return (ULONG) -1;
  101.     return (m_curr = pos);
  102.     }
  103. ////////////////////////////////////////////////////////////////////////////
  104. //
  105. // MemoryStream::locationGet -- returns the current location of the
  106. // stream, i.e. the seek pointer.
  107. //
  108. ULONG MemoryStream::locationGet ()
  109.     {
  110.     TRACE_CALL;
  111.     return m_curr;
  112.     }
  113. ////////////////////////////////////////////////////////////////////////////
  114. //
  115. // MemoryStream::locationGet -- returns the current size of the
  116. // stream.
  117. //
  118. ULONG MemoryStream::size ()
  119.     {
  120.     TRACE_CALL;
  121.     return m_vector.size ();
  122.     }
  123. ////////////////////////////////////////////////////////////////////////////
  124. //
  125. HRESULT MemoryStream::Read
  126.     (
  127.     void * pv,
  128.     ULONG cb,
  129.     ULONG * pcbRead
  130.     )
  131.     {
  132.     TRACE_CALL;
  133.     ULONG nr = extract (pv, cb);
  134.     if (pcbRead)
  135. *pcbRead = nr;
  136.     return (nr == cb) ? S_OK : S_FALSE;
  137.     }
  138. ////////////////////////////////////////////////////////////////////////////
  139. //
  140. HRESULT MemoryStream::Write
  141.     (
  142.     const void * pv,
  143.     ULONG cb,
  144.     ULONG * pcbWritten
  145.     )
  146.     {
  147.     TRACE_CALL;
  148.     ULONG nw = insert (pv, cb);
  149.     if (pcbWritten)
  150. *pcbWritten = nw;
  151.     return (nw == cb) ? S_OK : S_FALSE;
  152.     }
  153. ////////////////////////////////////////////////////////////////////////////
  154. //
  155. HRESULT MemoryStream::Seek
  156.     (
  157.     LARGE_INTEGER dlibMove,
  158.     DWORD dwOrigin,
  159.     ULARGE_INTEGER * plibNewPosition
  160.     )
  161.     {
  162.     TRACE_CALL;
  163.     HRESULT hr = S_OK;
  164.     ULONG pos;
  165.     
  166.     switch (dwOrigin)
  167.         {
  168.         case STREAM_SEEK_SET:
  169.             // offset from beginning
  170.     pos = locationSet ((ULONG) dlibMove);
  171.             if (plibNewPosition)
  172.                 *plibNewPosition = m_curr;
  173.             break;
  174.         case STREAM_SEEK_CUR:
  175.             // offset from current
  176.     pos = locationSet (m_curr + (int) dlibMove);
  177.             if (plibNewPosition)
  178.                 *plibNewPosition = m_curr;
  179.             break;
  180.         case STREAM_SEEK_END:
  181.             // offset from end
  182.     pos = locationSet (size() - dlibMove);
  183.             if (plibNewPosition)
  184.                 *plibNewPosition = m_curr;
  185.             break;
  186.         }
  187.     return hr;
  188.     }