arcstrm.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFX_CMNCTL_SEG
  12. #pragma code_seg(AFX_CMNCTL_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define new DEBUG_NEW
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CArchiveStream
  21. #ifndef _AFX_NO_OLE_SUPPORT
  22. CArchiveStream::CArchiveStream(CArchive* pArchive)
  23. {
  24. m_pArchive = pArchive;
  25. }
  26. STDMETHODIMP_(ULONG)CArchiveStream::AddRef()
  27. {
  28. return 1;
  29. }
  30. STDMETHODIMP_(ULONG)CArchiveStream::Release()
  31. {
  32. return 0;
  33. }
  34. STDMETHODIMP CArchiveStream::QueryInterface(REFIID iid, LPVOID* ppvObj)
  35. {
  36. if (iid == IID_IUnknown || iid == IID_IStream)
  37. {
  38. *ppvObj = this;
  39. return NOERROR;
  40. }
  41. return E_NOINTERFACE;
  42. }
  43. STDMETHODIMP CArchiveStream::Read(void *pv, ULONG cb, ULONG *pcbRead)
  44. {
  45. ASSERT(m_pArchive != NULL);
  46. ASSERT(m_pArchive->IsLoading());
  47. int nRead = 0;
  48. TRY
  49. {
  50. nRead = m_pArchive->Read(pv, cb);
  51. }
  52. CATCH_ALL(e)
  53. {
  54. DELETE_EXCEPTION(e);
  55. return E_UNEXPECTED;
  56. }
  57. END_CATCH_ALL
  58. if (pcbRead != NULL)
  59. *pcbRead = nRead;
  60. return NOERROR;
  61. }
  62. STDMETHODIMP CArchiveStream::Write(const void *pv, ULONG cb, ULONG *pcbWritten)
  63. {
  64. ASSERT(m_pArchive != NULL);
  65. ASSERT(m_pArchive->IsStoring());
  66. int nWrite = 0;
  67. TRY
  68. {
  69. m_pArchive->Write(pv, cb);
  70. nWrite = cb;
  71. }
  72. CATCH_ALL(e)
  73. {
  74. DELETE_EXCEPTION(e);
  75. return E_UNEXPECTED;
  76. }
  77. END_CATCH_ALL
  78. if (pcbWritten != NULL)
  79. *pcbWritten = nWrite;
  80. return NOERROR;
  81. }
  82. STDMETHODIMP CArchiveStream::Seek(LARGE_INTEGER uliOffset, DWORD dwOrigin,
  83. ULARGE_INTEGER* puliNew)
  84. {
  85. // can't handle offsets with really large magnitude
  86. if ((uliOffset.HighPart != 0) &&
  87. ((uliOffset.HighPart != -1) || ((long)uliOffset.LowPart >= 0)))
  88. return E_NOTIMPL;
  89. CFile* pFile = m_pArchive->GetFile();
  90. if (pFile == NULL)
  91. return E_NOTIMPL;
  92. m_pArchive->Flush();
  93. ASSERT(STREAM_SEEK_SET == CFile::begin);
  94. ASSERT(STREAM_SEEK_CUR == CFile::current);
  95. ASSERT(STREAM_SEEK_END == CFile::end);
  96. LONG lNew;
  97. TRY
  98. {
  99. lNew = pFile->Seek((LONG)uliOffset.LowPart, (UINT)dwOrigin);
  100. }
  101. CATCH_ALL(e)
  102. {
  103. DELETE_EXCEPTION(e);
  104. return E_UNEXPECTED;
  105. }
  106. END_CATCH_ALL
  107. if (puliNew != NULL)
  108. ULISet32(*puliNew, lNew);
  109. return NOERROR;
  110. }
  111. STDMETHODIMP CArchiveStream::SetSize(ULARGE_INTEGER)
  112. {
  113. return E_NOTIMPL;
  114. }
  115. STDMETHODIMP CArchiveStream::CopyTo(LPSTREAM, ULARGE_INTEGER, ULARGE_INTEGER*,
  116. ULARGE_INTEGER*)
  117. {
  118. return E_NOTIMPL;
  119. }
  120. STDMETHODIMP CArchiveStream::Commit(DWORD)
  121. {
  122. return E_NOTIMPL;
  123. }
  124. STDMETHODIMP CArchiveStream::Revert()
  125. {
  126. return E_NOTIMPL;
  127. }
  128. STDMETHODIMP CArchiveStream::LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
  129. {
  130. return E_NOTIMPL;
  131. }
  132. STDMETHODIMP CArchiveStream::UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER,
  133. DWORD)
  134. {
  135. return E_NOTIMPL;
  136. }
  137. STDMETHODIMP CArchiveStream::Stat(STATSTG*, DWORD)
  138. {
  139. return E_NOTIMPL;
  140. }
  141. STDMETHODIMP CArchiveStream::Clone(LPSTREAM*)
  142. {
  143. return E_NOTIMPL;
  144. }
  145. #endif // _AFX_NO_OLE_SUPPORT