Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
3.0 KiB

  1. /*//////////////////////////////////////////////////////////////////////////////
  2. //
  3. // File: filestrm.cpp
  4. //
  5. // Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
  6. //
  7. // @@BEGIN_MSINTERNAL
  8. //
  9. // History:
  10. // -@- (craigp) - created
  11. // -@- 09/23/99 (mikemarr) - copyright, started history
  12. // -@- 07/15/00 (andrewke) - replicated in DXVB dir
  13. //
  14. // @@END_MSINTERNAL
  15. //
  16. //////////////////////////////////////////////////////////////////////////////*/
  17. #include "Filestrm.h"
  18. CFileStream::CFileStream(LPCTSTR filename, BOOL bRead, BOOL bTruncate, HRESULT *error)
  19. {
  20. m_hfile = CreateFile(filename, bRead ? GENERIC_READ : GENERIC_WRITE, 0, NULL,
  21. (bTruncate ? CREATE_ALWAYS : OPEN_EXISTING), FILE_ATTRIBUTE_NORMAL,
  22. NULL);
  23. if (error)
  24. {
  25. ULONG foo = GetLastError();
  26. if (m_hfile == INVALID_HANDLE_VALUE)
  27. *error = E_FAIL;
  28. else
  29. *error = NOERROR;
  30. }
  31. m_cRef = 1;
  32. }
  33. CFileStream::~CFileStream()
  34. {
  35. CloseHandle(m_hfile);
  36. }
  37. STDMETHODIMP_(ULONG) CFileStream::AddRef(void)
  38. {
  39. return m_cRef++;
  40. }
  41. STDMETHODIMP_(ULONG) CFileStream::Release(void)
  42. {
  43. if (--m_cRef != 0)
  44. return m_cRef;
  45. delete this;
  46. return 0;
  47. }
  48. STDMETHODIMP CFileStream::QueryInterface(REFIID riid, LPVOID FAR *ppv)
  49. {
  50. *ppv=NULL;
  51. if (riid == IID_IUnknown)
  52. *ppv=(IUnknown*)this;
  53. else if (riid == IID_IStream)
  54. *ppv=(IStream*)this;
  55. else
  56. return E_NOINTERFACE;
  57. ((LPUNKNOWN)*ppv)->AddRef();
  58. return NOERROR;
  59. }
  60. STDMETHODIMP CFileStream::Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead)
  61. {
  62. DWORD read;
  63. BOOL result = ReadFile(m_hfile, pv, cb, &read, NULL);
  64. if (pcbRead)
  65. *pcbRead = read;
  66. if (result)
  67. return S_OK;
  68. else
  69. return E_FAIL;
  70. }
  71. STDMETHODIMP CFileStream::Write(const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten)
  72. {
  73. DWORD written;
  74. BOOL result = WriteFile(m_hfile, pv, cb, &written, NULL);
  75. if (pcbWritten)
  76. *pcbWritten = written;
  77. if (result)
  78. return S_OK;
  79. else
  80. return E_FAIL;
  81. }
  82. STDMETHODIMP CFileStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition)
  83. {
  84. LONG movelow;
  85. LONG movehigh;
  86. movelow = dlibMove.LowPart;
  87. movehigh = dlibMove.HighPart;
  88. DWORD moveMethod;
  89. switch (dwOrigin)
  90. {
  91. case STREAM_SEEK_SET: moveMethod = FILE_BEGIN; break;
  92. case STREAM_SEEK_CUR: moveMethod = FILE_CURRENT; break;
  93. case STREAM_SEEK_END: moveMethod = FILE_END; break;
  94. default: return E_INVALIDARG;
  95. }
  96. DWORD result = SetFilePointer(m_hfile, movelow, &movehigh, moveMethod);
  97. if (plibNewPosition)
  98. {
  99. plibNewPosition->LowPart = result;
  100. plibNewPosition->HighPart = movehigh;
  101. }
  102. if (result != -1)
  103. return NOERROR;
  104. else
  105. return E_FAIL;
  106. }
  107. STDMETHODIMP CFileStream::Stat(STATSTG __RPC_FAR *pstatstg, DWORD grfStatFlag)
  108. {
  109. memset(pstatstg, 0, sizeof(STATSTG));
  110. pstatstg->pwcsName = NULL;
  111. pstatstg->type = STGTY_STREAM;
  112. pstatstg->cbSize.LowPart = GetFileSize(m_hfile, &pstatstg->cbSize.HighPart);
  113. return S_OK;
  114. }