pstream.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:5k
源码类别:

P2P编程

开发平台:

Visual C++

  1. //------------------------------------------------------------------------------
  2. // File: PStream.cpp
  3. //
  4. // Desc: DirectShow base classes.
  5. //
  6. // Copyright (c) Microsoft Corporation.  All rights reserved.
  7. //------------------------------------------------------------------------------
  8. #include <streams.h>
  9. #ifdef PERF
  10. #include <measure.h>
  11. #endif
  12. //
  13. // Constructor
  14. //
  15. CPersistStream::CPersistStream(IUnknown *punk, HRESULT *phr)
  16.     : mPS_fDirty(FALSE)
  17. {
  18.     mPS_dwFileVersion = GetSoftwareVersion();
  19. }
  20. //
  21. // Destructor
  22. //
  23. CPersistStream::~CPersistStream() {
  24.     // Nothing to do
  25. }
  26. #if 0
  27. SAMPLE CODE TO COPY - not active at the moment
  28. //
  29. // NonDelegatingQueryInterface
  30. //
  31. // This object supports IPersist & IPersistStream
  32. STDMETHODIMP CPersistStream::NonDelegatingQueryInterface(REFIID riid, void **ppv)
  33. {
  34.     if (riid == IID_IPersist) {
  35.         return GetInterface((IPersist *) this, ppv);
  36.     }
  37.     else if (riid == IID_IPersistStream) {
  38.         return GetInterface((IPersistStream *) this, ppv);
  39.     }
  40.     else {
  41.         return CUnknown::NonDelegatingQueryInterface(riid, ppv);
  42.     }
  43. }
  44. #endif
  45. //
  46. // WriteToStream
  47. //
  48. // Writes to the stream (default action is to write nothing)
  49. HRESULT CPersistStream::WriteToStream(IStream *pStream)
  50. {
  51.     // You can override this to do things like
  52.     // hr = pStream->Write(MyStructure, sizeof(MyStructure), NULL);
  53.     return NOERROR;
  54. }
  55. HRESULT CPersistStream::ReadFromStream(IStream * pStream)
  56. {
  57.     // You can override this to do things like
  58.     // hr = pStream->Read(MyStructure, sizeof(MyStructure), NULL);
  59.     return NOERROR;
  60. }
  61. //
  62. // Load
  63. //
  64. // Load all the data from the given stream
  65. STDMETHODIMP CPersistStream::Load(LPSTREAM pStm)
  66. {
  67.     HRESULT hr;
  68.     // Load the version number then the data
  69.     mPS_dwFileVersion = ReadInt(pStm, hr);
  70.     if (FAILED(hr)) {
  71.         return hr;
  72.     }
  73.     return ReadFromStream(pStm);
  74. }  // Load
  75. //
  76. // Save
  77. //
  78. // Save the contents of this Stream.
  79. STDMETHODIMP CPersistStream::Save(LPSTREAM pStm, BOOL fClearDirty)
  80. {
  81.     HRESULT hr = WriteInt(pStm, GetSoftwareVersion());
  82.     if (FAILED(hr)) {
  83.         return hr;
  84.     }
  85.     hr = WriteToStream(pStm);
  86.     if (FAILED(hr)) {
  87.         return hr;
  88.     }
  89.     mPS_fDirty = !fClearDirty;
  90.     return hr;
  91. } // Save
  92. // WriteInt
  93. //
  94. // Writes an integer to an IStream as 11 UNICODE characters followed by one space.
  95. // You could use this for shorts or unsigneds or anything (up to 32 bits)
  96. // where the value isn't actually truncated by squeezing it into 32 bits.
  97. // Values such as (unsigned) 0x80000000 would come out as -2147483648
  98. // but would then load as 0x80000000 through ReadInt.  Cast as you please.
  99. STDAPI WriteInt(IStream *pIStream, int n)
  100. {
  101.     WCHAR Buff[13];  // Allows for trailing null that we don't write
  102.     (void)StringCchPrintfW(Buff, NUMELMS(Buff), L"%011d ",n);
  103.     return pIStream->Write(&(Buff[0]), 12*sizeof(WCHAR), NULL);
  104. } // WriteInt
  105. // ReadInt
  106. //
  107. // Reads an integer from an IStream.
  108. // Read as 4 bytes.  You could use this for shorts or unsigneds or anything
  109. // where the value isn't actually truncated by squeezing it into 32 bits
  110. // Striped down subset of what sscanf can do (without dragging in the C runtime)
  111. STDAPI_(int) ReadInt(IStream *pIStream, HRESULT &hr)
  112. {
  113.     int Sign = 1;
  114.     unsigned int n = 0;    // result wil be n*Sign
  115.     WCHAR wch;
  116.     hr = pIStream->Read( &wch, sizeof(wch), NULL);
  117.     if (FAILED(hr)) {
  118.         return 0;
  119.     }
  120.     if (wch==L'-'){
  121.         Sign = -1;
  122.         hr = pIStream->Read( &wch, sizeof(wch), NULL);
  123.         if (FAILED(hr)) {
  124.             return 0;
  125.         }
  126.     }
  127.     for( ; ; ) {
  128.         if (wch>=L'0' && wch<=L'9') {
  129.             n = 10*n+(int)(wch-L'0');
  130.         } else if (  wch == L' '
  131.                   || wch == L't'
  132.                   || wch == L'r'
  133.                   || wch == L'n'
  134.                   || wch == L''
  135.                   ) {
  136.             break;
  137.         } else {
  138.             hr = VFW_E_INVALID_FILE_FORMAT;
  139.             return 0;
  140.         }
  141.         hr = pIStream->Read( &wch, sizeof(wch), NULL);
  142.         if (FAILED(hr)) {
  143.             return 0;
  144.         }
  145.     }
  146.     if (n==0x80000000 && Sign==-1) {
  147.         // This is the negative number that has no positive version!
  148.         return (int)n;
  149.     }
  150.     else return (int)n * Sign;
  151. } // ReadInt
  152. // The microsoft C/C++ compile generates level 4 warnings to the effect that
  153. // a particular inline function (from some base class) was not needed.
  154. // This line gets rid of hundreds of such unwanted messages and makes
  155. // -W4 compilation feasible:
  156. #pragma warning(disable: 4514)