2 * this class implements a pure IStream object
3 * and can be used for many purposes
5 * the main reason for implementing this was
6 * a cleaner implementation of IShellLink which
7 * needs to be able to load lnk's from a IStream
8 * interface so it was obvious to capsule the file
9 * access in a IStream to.
14 #include "wine/obj_storage.h"
17 #include "debugtools.h"
18 #include "shell32_main.h"
20 DEFAULT_DEBUG_CHANNEL(shell)
23 { ICOM_VTABLE(IStream) *lpvtst;
31 static ICOM_VTABLE(IStream) stvt;
33 /**************************************************************************
34 * CreateStreamOnFile()
36 * similar to CreateStreamOnHGlobal
38 HRESULT CreateStreamOnFile (LPCSTR pszFilename, IStream ** ppstm)
42 HFILE hFile = OpenFile( pszFilename, &ofs, OF_READ );
45 fstr = (ISHFileStream*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ISHFileStream));
48 fstr->dwLength = GetFileSize (hFile, NULL);
52 if (!(fstr->hMapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL)))
54 WARN("failed to create filemap.\n");
58 if (!(fstr->pImage = MapViewOfFile(fstr->hMapping,FILE_MAP_READ,0,0,0)))
60 WARN("failed to mmap filemap.\n");
67 end_3: CloseHandle(fstr->hMapping);
68 end_2: HeapFree(GetProcessHeap(), 0, fstr);
71 end_1: _lclose(hFile);
72 (*ppstm) = (IStream*)fstr;
76 /**************************************************************************
77 * IStream_fnQueryInterface
79 static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVOID *ppvObj)
81 ICOM_THIS(ISHFileStream, iface);
84 WINE_StringFromCLSID((LPCLSID)riid,xriid);
86 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
90 if(IsEqualIID(riid, &IID_IUnknown) ||
91 IsEqualIID(riid, &IID_IStream))
98 IStream_AddRef((IStream*)*ppvObj);
99 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
102 TRACE("-- Interface: E_NOINTERFACE\n");
103 return E_NOINTERFACE;
106 /**************************************************************************
109 static ULONG WINAPI IStream_fnAddRef(IStream *iface)
111 ICOM_THIS(ISHFileStream, iface);
113 TRACE("(%p)->(count=%lu)\n",This, This->ref);
116 return ++(This->ref);
119 /**************************************************************************
122 static ULONG WINAPI IStream_fnRelease(IStream *iface)
124 ICOM_THIS(ISHFileStream, iface);
126 TRACE("(%p)->()\n",This);
131 { TRACE(" destroying SHFileStream (%p)\n",This);
133 UnmapViewOfFile(This->pImage);
134 CloseHandle(This->hMapping);
136 HeapFree(GetProcessHeap(),0,This);
142 static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG* pcbRead)
144 ICOM_THIS(ISHFileStream, iface);
146 DWORD dwBytesToRead, dwBytesLeft;
148 TRACE("(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbRead);
151 return STG_E_INVALIDPOINTER;
153 dwBytesLeft = This->dwLength - This->dwPos;
155 if ( 0 >= dwBytesLeft ) /* end of buffer */
158 dwBytesToRead = ( cb > dwBytesLeft) ? dwBytesLeft : cb;
160 memmove ( pv, (This->pImage) + (This->dwPos), dwBytesToRead);
162 This->dwPos += dwBytesToRead; /* adjust pointer */
165 *pcbRead = dwBytesToRead;
169 static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten)
171 ICOM_THIS(ISHFileStream, iface);
173 TRACE("(%p)\n",This);
177 static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
179 ICOM_THIS(ISHFileStream, iface);
181 TRACE("(%p)\n",This);
185 static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize)
187 ICOM_THIS(ISHFileStream, iface);
189 TRACE("(%p)\n",This);
193 static HRESULT WINAPI IStream_fnCopyTo (IStream * iface, IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten)
195 ICOM_THIS(ISHFileStream, iface);
197 TRACE("(%p)\n",This);
201 static HRESULT WINAPI IStream_fnCommit (IStream * iface, DWORD grfCommitFlags)
203 ICOM_THIS(ISHFileStream, iface);
205 TRACE("(%p)\n",This);
209 static HRESULT WINAPI IStream_fnRevert (IStream * iface)
211 ICOM_THIS(ISHFileStream, iface);
213 TRACE("(%p)\n",This);
217 static HRESULT WINAPI IStream_fnLockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
219 ICOM_THIS(ISHFileStream, iface);
221 TRACE("(%p)\n",This);
225 static HRESULT WINAPI IStream_fnUnlockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
227 ICOM_THIS(ISHFileStream, iface);
229 TRACE("(%p)\n",This);
233 static HRESULT WINAPI IStream_fnStat (IStream * iface, STATSTG* pstatstg, DWORD grfStatFlag)
235 ICOM_THIS(ISHFileStream, iface);
237 TRACE("(%p)\n",This);
241 static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm)
243 ICOM_THIS(ISHFileStream, iface);
245 TRACE("(%p)\n",This);
250 static struct ICOM_VTABLE(IStream) stvt =
252 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
253 IStream_fnQueryInterface,
263 IStream_fnLockRegion,
264 IStream_fnUnlockRegion,