Garmin Fleet Management Controller  2.19.0
FileStream.cpp
Go to the documentation of this file.
1 /*********************************************************************
2 *
3 * MODULE NAME:
4 * FileStream.h
5 *
6 * Copied from http://msdn.microsoft.com/en-us/library/windows/desktop/ms752876(v=vs.85).aspx
7 *---------------------------------------------------------------------
8 * $NoKeywords$
9 *********************************************************************/
10 
11 //----------------------------------------------------------------------
15 //----------------------------------------------------------------------
16 #include "FileStream.h"
17 
19  {
20  _refcount = 1;
21  _hFile = hFile;
22  }
23 
25  {
26  if (_hFile != INVALID_HANDLE_VALUE)
27  {
28  ::CloseHandle(_hFile);
29  }
30  }
31 
32 HRESULT FileStream::OpenFile(LPCWSTR pName, IStream ** ppStream, bool fWrite)
33  {
34  HANDLE hFile = ::CreateFileW(pName, fWrite ? GENERIC_WRITE : GENERIC_READ, FILE_SHARE_READ,
35  NULL, fWrite ? CREATE_ALWAYS : OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
36 
37  if (hFile == INVALID_HANDLE_VALUE)
38  return HRESULT_FROM_WIN32(GetLastError());
39 
40  *ppStream = new FileStream(hFile);
41 
42  if(*ppStream == NULL)
43  CloseHandle(hFile);
44 
45  return S_OK;
46  }
47 
48 HRESULT STDMETHODCALLTYPE FileStream::QueryInterface(REFIID iid, void ** ppvObject)
49  {
50  if (iid == __uuidof(IUnknown)
51  || iid == __uuidof(IStream)
52  || iid == __uuidof(ISequentialStream))
53  {
54  *ppvObject = static_cast<IStream*>(this);
55  AddRef();
56  return S_OK;
57  } else
58  return E_NOINTERFACE;
59  }
60 
61 ULONG STDMETHODCALLTYPE FileStream::AddRef(void)
62  {
63  return (ULONG)InterlockedIncrement(&_refcount);
64  }
65 
66 ULONG STDMETHODCALLTYPE FileStream::Release(void)
67  {
68  ULONG res = (ULONG) InterlockedDecrement(&_refcount);
69  if (res == 0)
70  delete this;
71  return res;
72  }
73 
74 HRESULT STDMETHODCALLTYPE FileStream::Read(void* pv, ULONG cb, ULONG* pcbRead)
75  {
76  BOOL rc = ReadFile(_hFile, pv, cb, pcbRead, NULL);
77  return (rc) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
78  }
79 
80 HRESULT STDMETHODCALLTYPE FileStream::Write(void const* pv, ULONG cb, ULONG* pcbWritten)
81  {
82  BOOL rc = WriteFile(_hFile, pv, cb, pcbWritten, NULL);
83  return rc ? S_OK : HRESULT_FROM_WIN32(GetLastError());
84  }
85 
86 HRESULT STDMETHODCALLTYPE FileStream::Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin,
87  ULARGE_INTEGER* lpNewFilePointer)
88  {
89  DWORD dwMoveMethod;
90 
91  switch(dwOrigin)
92  {
93  case STREAM_SEEK_SET:
94  dwMoveMethod = FILE_BEGIN;
95  break;
96  case STREAM_SEEK_CUR:
97  dwMoveMethod = FILE_CURRENT;
98  break;
99  case STREAM_SEEK_END:
100  dwMoveMethod = FILE_END;
101  break;
102  default:
103  return STG_E_INVALIDFUNCTION;
104  break;
105  }
106 
107  if (SetFilePointerEx(_hFile, liDistanceToMove, (PLARGE_INTEGER) lpNewFilePointer,
108  dwMoveMethod) == 0)
109  return HRESULT_FROM_WIN32(GetLastError());
110  return S_OK;
111  }
112 
113 HRESULT STDMETHODCALLTYPE FileStream::Stat(STATSTG* pStatstg, DWORD /*grfStatFlag*/)
114  {
115  if (GetFileSizeEx(_hFile, (PLARGE_INTEGER) &pStatstg->cbSize) == 0)
116  return HRESULT_FROM_WIN32(GetLastError());
117  return S_OK;
118  }
virtual ULONG STDMETHODCALLTYPE Release(void)
Definition: FileStream.cpp:66
virtual HRESULT STDMETHODCALLTYPE Read(void *pv, ULONG cb, ULONG *pcbRead)
Definition: FileStream.cpp:74
virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER *lpNewFilePointer)
Definition: FileStream.cpp:86
virtual HRESULT STDMETHODCALLTYPE Write(void const *pv, ULONG cb, ULONG *pcbWritten)
Definition: FileStream.cpp:80
HANDLE _hFile
Definition: FileStream.h:50
virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG *pStatstg, DWORD grfStatFlag)
Definition: FileStream.cpp:113
virtual ULONG STDMETHODCALLTYPE AddRef(void)
Definition: FileStream.cpp:61
virtual ~FileStream(void)
Definition: FileStream.cpp:24
LONG _refcount
Definition: FileStream.h:51
static HRESULT OpenFile(LPCWSTR pName, IStream **ppStream, bool fWrite)
Definition: FileStream.cpp:32
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
Definition: FileStream.cpp:48
FileStream(HANDLE hFile)
File-based implementation of IStream interface.
Definition: FileStream.cpp:18