CVS: winex/dlls/shlwapi filestream.c, NONE, 1.1 Makefile.in, 1.1.1.6, 1.2 regstream.c, 1.4, 1.5 shlwapi.spec, 1.3, 1.4
[email protected] 14 Dec 2007 20:28:00 -0000
| Newsgroups | gmane.comp.emulators.winex.cvs |
|---|---|
| Message-ID | <[email protected]> |
Subject: winex/dlls/shlwapi filestream.c,NONE,1.1 Makefile.in,1.1.1.6,1.2 regstream.c,1.4,1.5 shlwapi.spec,1.3,1.4Update of /var/lib/cvsd/cvsroot/winex/dlls/shlwapi
In directory agravaine:/tmp/cvs-serv16451/dlls/shlwapi
Modified Files:
Makefile.in regstream.c shlwapi.spec
Added Files:
filestream.c
Log Message:
Simple implementation of SHCreateStreamOnFile.
--- NEW FILE: filestream.c ---
/*
* SHCreateStreamOnFile
*/
#include <string.h>
#include "winerror.h"
#include "winbase.h"
#include "winreg.h"
#include "winuser.h"
#include "shlobj.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
typedef struct
{ ICOM_VFIELD(IStream);
DWORD ref;
HANDLE hFile;
} ISHFileStream;
static struct ICOM_VTABLE(IStream) rstvt;
static DWORD STGM_access(DWORD grfMode)
{
if (grfMode & STGM_READWRITE)
return GENERIC_READ | GENERIC_WRITE;
if (grfMode & STGM_WRITE)
return GENERIC_WRITE;
return GENERIC_READ;
}
static DWORD STGM_share(DWORD grfMode)
{
switch (grfMode & (STGM_SHARE_DENY_NONE | STGM_SHARE_DENY_READ | STGM_SHARE_DENY_WRITE | STGM_SHARE_EXCLUSIVE)) {
case STGM_SHARE_DENY_READ:
return FILE_SHARE_WRITE;
case STGM_SHARE_DENY_WRITE:
return FILE_SHARE_READ;
case STGM_SHARE_EXCLUSIVE:
return 0;
default:
return FILE_SHARE_READ | FILE_SHARE_WRITE;
}
}
static DWORD STGM_disp(DWORD grfMode)
{
if (grfMode & STGM_CREATE)
return CREATE_ALWAYS;
else /* STGM_FAILIFTHERE */
return CREATE_NEW;
}
static DWORD STGM_flags(DWORD grfMode)
{
DWORD flags = 0;
if (grfMode & STGM_DELETEONRELEASE)
flags |= FILE_FLAG_DELETE_ON_CLOSE;
return flags;
}
/**************************************************************************
* IStream_ConstructorA [internal]
*/
HRESULT IStream_ConstructorA(LPCSTR pszFile, DWORD grfMode, IStream **ppstm)
{
ISHFileStream* rstr;
rstr = (ISHFileStream*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ISHFileStream));
ICOM_VTBL(rstr)=&rstvt;
rstr->ref = 1;
rstr->hFile = CreateFileA(pszFile, STGM_access(grfMode), STGM_share(grfMode),
NULL, STGM_disp(grfMode), STGM_flags(grfMode), 0);
*ppstm = (IStream *)rstr;
return S_OK;
}
/**************************************************************************
* IStream_ConstructorW [internal]
*/
HRESULT IStream_ConstructorW(LPCWSTR pszFile, DWORD grfMode, IStream **ppstm)
{
ISHFileStream* rstr;
rstr = (ISHFileStream*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ISHFileStream));
ICOM_VTBL(rstr)=&rstvt;
rstr->ref = 1;
rstr->hFile = CreateFileW(pszFile, STGM_access(grfMode), STGM_share(grfMode),
NULL, STGM_disp(grfMode), STGM_flags(grfMode), 0);
*ppstm = (IStream *)rstr;
return S_OK;
}
/**************************************************************************
* IStream_fnQueryInterface
*/
static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVOID *ppvObj)
{
ICOM_THIS(ISHFileStream, iface);
TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
*ppvObj = NULL;
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
{ *ppvObj = This;
}
else if(IsEqualIID(riid, &IID_IStream)) /*IStream*/
{ *ppvObj = This;
}
if(*ppvObj)
{
IStream_AddRef((IStream*)*ppvObj);
TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
return S_OK;
}
TRACE("-- Interface: E_NOINTERFACE\n");
return E_NOINTERFACE;
}
/**************************************************************************
* IStream_fnAddRef
*/
static ULONG WINAPI IStream_fnAddRef(IStream *iface)
{
ICOM_THIS(ISHFileStream, iface);
TRACE("(%p)->(count=%lu)\n",This, This->ref);
return ++(This->ref);
}
/**************************************************************************
* IStream_fnRelease
*/
static ULONG WINAPI IStream_fnRelease(IStream *iface)
{
ICOM_THIS(ISHFileStream, iface);
TRACE("(%p)->()\n",This);
if (!--(This->ref))
{ TRACE(" destroying SHFile IStream (%p)\n",This);
if (This->hFile)
CloseHandle(This->hFile);
HeapFree(GetProcessHeap(),0,This);
return 0;
}
return This->ref;
}
static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG* pcbRead)
{
ICOM_THIS(ISHFileStream, iface);
DWORD dwBytesRead = 0;
BOOL ok;
TRACE("(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbRead);
if ( !pv )
return STG_E_INVALIDPOINTER;
ok = ReadFile(This->hFile, pv, cb, &dwBytesRead, NULL);
if (pcbRead) *pcbRead = dwBytesRead;
if (!ok)
return HRESULT_FROM_WIN32(GetLastError());
return S_OK;
}
static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten)
{
ICOM_THIS(ISHFileStream, iface);
DWORD dwBytesWritten = 0;
BOOL ok;
TRACE("(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbWritten);
if ( !pv )
return STG_E_INVALIDPOINTER;
ok = WriteFile(This->hFile, pv, cb, &dwBytesWritten, NULL);
if (pcbWritten) *pcbWritten = dwBytesWritten;
if (!ok)
return HRESULT_FROM_WIN32(GetLastError());
return S_OK;
}
static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
{
ICOM_THIS(ISHFileStream, iface);
LONG high, low;
DWORD err;
TRACE("(%p)->(%lld,%ld,%p)\n",This, dlibMove.QuadPart, dwOrigin, plibNewPosition);
high = dlibMove.u.HighPart;
low = SetFilePointer(This->hFile, dlibMove.u.LowPart, &high, dwOrigin);
if ((low == INVALID_SET_FILE_POINTER) && (err = GetLastError()))
return HRESULT_FROM_WIN32(err);
if (plibNewPosition) {
plibNewPosition->u.LowPart = low;
plibNewPosition->u.HighPart = high;
}
return S_OK;
}
static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnCopyTo (IStream * iface, IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnCommit (IStream * iface, DWORD grfCommitFlags)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnRevert (IStream * iface)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnLockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnUnlockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnStat (IStream * iface, STATSTG* pstatstg, DWORD grfStatFlag)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm)
{
ICOM_THIS(ISHFileStream, iface);
FIXME("(%p)\n",This);
return E_NOTIMPL;
}
static struct ICOM_VTABLE(IStream) rstvt =
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
IStream_fnQueryInterface,
IStream_fnAddRef,
IStream_fnRelease,
IStream_fnRead,
IStream_fnWrite,
IStream_fnSeek,
IStream_fnSetSize,
IStream_fnCopyTo,
IStream_fnCommit,
IStream_fnRevert,
IStream_fnLockRegion,
IStream_fnUnlockRegion,
IStream_fnStat,
IStream_fnClone
};
/*************************************************************************
* SHCreateStreamOnFileA [SHLWAPI.@]
*/
HRESULT WINAPI SHCreateStreamOnFileA(
LPCSTR pszFile,
DWORD grfMode,
IStream **ppstm)
{
TRACE("(%s,0x%08lx,%p)\n",
debugstr_a(pszFile), grfMode, ppstm);
return IStream_ConstructorA(pszFile, grfMode, ppstm);
}
/*************************************************************************
* SHCreateStreamOnFileW [SHLWAPI.@]
*/
HRESULT WINAPI SHCreateStreamOnFileW(
LPCWSTR pszFile,
DWORD grfMode,
IStream **ppstm)
{
TRACE("(%s,0x%08lx,%p)\n",
debugstr_w(pszFile), grfMode, ppstm);
return IStream_ConstructorW(pszFile, grfMode, ppstm);
}
Index: Makefile.in
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/shlwapi/Makefile.in,v
retrieving revision 1.1.1.6
retrieving revision 1.2
diff -u -d -r1.1.1.6 -r1.2
--- Makefile.in 19 Apr 2002 15:49:08 -0000 1.1.1.6
+++ Makefile.in 14 Dec 2007 20:27:57 -0000 1.2
@@ -10,6 +10,7 @@
SYMBOLFILE = $(MODULE).tmp.o
C_SRCS = \
+ filestream.c \
ordinal.c \
path.c \
reg.c \
Index: regstream.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/shlwapi/regstream.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- regstream.c 1 Apr 2004 12:09:27 -0000 1.4
+++ regstream.c 14 Dec 2007 20:27:57 -0000 1.5
@@ -1,5 +1,5 @@
/*
- * SHRegOpenStream
+ * SHOpenRegStream
*/
#include <string.h>
Index: shlwapi.spec
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/shlwapi/shlwapi.spec,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- shlwapi.spec 28 Mar 2007 15:00:13 -0000 1.3
+++ shlwapi.spec 14 Dec 2007 20:27:57 -0000 1.4
@@ -717,8 +717,8 @@
@ stub SHCopyKeyA
@ stub SHCopyKeyW
@ stdcall SHAutoComplete(ptr long) SHAutoComplete
-@ stub SHCreateStreamOnFileA
-@ stub SHCreateStreamOnFileW
+@ stdcall SHCreateStreamOnFileA(str long ptr) SHCreateStreamOnFileA
+@ stdcall SHCreateStreamOnFileW(wstr long ptr) SHCreateStreamOnFileW
@ stub SHCreateStreamWrapper
@ stub SHCreateThread
@ stdcall SHGetThreadRef (ptr) SHGetThreadRef