SHELL32: switch IShellLink to use shlwapi.SHCreateStreamOnFileW
Mike McCormack
mike at codeweavers.com
Thu Jun 16 00:31:28 CDT 2005
ChangeLog:
* switch IShellLink to use shlwapi.SHCreateStreamOnFileW
-------------- next part --------------
Index: dlls/shell32/shelllink.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shelllink.c,v
retrieving revision 1.99
diff -u -p -r1.99 shelllink.c
--- dlls/shell32/shelllink.c 15 Jun 2005 10:21:46 -0000 1.99
+++ dlls/shell32/shelllink.c 16 Jun 2005 05:32:03 -0000
@@ -270,7 +365,9 @@ static HRESULT WINAPI IPersistFile_fnLoa
TRACE("(%p, %s, %lx)\n",This, debugstr_w(pszFileName), dwMode);
- r = CreateStreamOnFile(pszFileName, dwMode, &stm);
+ if( dwMode == 0 )
+ dwMode = STGM_READ | STGM_SHARE_DENY_WRITE;
+ r = SHCreateStreamOnFileW(pszFileName, dwMode, &stm);
if( SUCCEEDED( r ) )
{
r = IPersistStream_Load(StreamThis, stm);
@@ -327,7 +424,7 @@ static HRESULT WINAPI IPersistFile_fnSav
if (!pszFileName)
return E_FAIL;
- r = CreateStreamOnFile(pszFileName, STGM_READWRITE | STGM_CREATE, &stm);
+ r = SHCreateStreamOnFileW( pszFileName, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, &stm );
if( SUCCEEDED( r ) )
{
r = IPersistStream_Save(StreamThis, stm, FALSE);
static HRESULT WINAPI
Index: dlls/shlwapi/istream.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/istream.c,v
retrieving revision 1.18
diff -u -p -r1.18 istream.c
--- dlls/shlwapi/istream.c 6 Jun 2005 19:50:36 -0000 1.18
+++ dlls/shlwapi/istream.c 16 Jun 2005 05:32:03 -0000
@@ -35,6 +35,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(shell);
+#define STGM_ACCESS_MODE(stgm) ((stgm)&0x0000f)
+#define STGM_SHARE_MODE(stgm) ((stgm)&0x000f0)
+#define STGM_CREATE_MODE(stgm) ((stgm)&0x0f000)
+
/* Layout of ISHFileStream object */
typedef struct
{
@@ -65,8 +69,7 @@ static HRESULT WINAPI IStream_fnQueryInt
IsEqualIID(riid, &IID_IStream))
{
*ppvObj = This;
-
- IStream_AddRef((IStream*)*ppvObj);
+ IStream_AddRef(iface);
return S_OK;
}
return E_NOINTERFACE;
@@ -112,22 +115,21 @@ static ULONG WINAPI IStream_fnRelease(IS
static HRESULT WINAPI IStream_fnRead(IStream *iface, void* pv, ULONG cb, ULONG* pcbRead)
{
ISHFileStream *This = (ISHFileStream *)iface;
- HRESULT hRet = S_OK;
DWORD dwRead = 0;
TRACE("(%p,%p,0x%08lx,%p)\n", This, pv, cb, pcbRead);
if (!pv)
- hRet = STG_E_INVALIDPOINTER;
- else if (!ReadFile(This->hFile, pv, cb, &dwRead, NULL))
+ return STG_E_INVALIDPOINTER;
+
+ if (!ReadFile(This->hFile, pv, cb, &dwRead, NULL))
{
- hRet = (HRESULT)GetLastError();
- if(hRet > 0)
- hRet = HRESULT_FROM_WIN32(hRet);
+ ERR("error %ld reading file\n", GetLastError());
+ return HRESULT_FROM_WIN32(GetLastError());
}
if (pcbRead)
*pcbRead = dwRead;
- return hRet;
+ return S_OK;
}
/**************************************************************************
@@ -136,24 +138,28 @@ static HRESULT WINAPI IStream_fnRead(ISt
static HRESULT WINAPI IStream_fnWrite(IStream *iface, const void* pv, ULONG cb, ULONG* pcbWritten)
{
ISHFileStream *This = (ISHFileStream *)iface;
- HRESULT hRet = S_OK;
DWORD dwWritten = 0;
TRACE("(%p,%p,0x%08lx,%p)\n", This, pv, cb, pcbWritten);
if (!pv)
- hRet = STG_E_INVALIDPOINTER;
- else if (!(This->dwMode & STGM_WRITE))
- hRet = E_FAIL;
- else if (!WriteFile(This->hFile, pv, cb, &dwWritten, NULL))
+ return STG_E_INVALIDPOINTER;
+
+ switch (STGM_ACCESS_MODE(This->dwMode))
{
- hRet = (HRESULT)GetLastError();
- if(hRet > 0)
- hRet = HRESULT_FROM_WIN32(hRet);
+ case STGM_WRITE:
+ case STGM_READWRITE:
+ break;
+ default:
+ return E_FAIL;
}
+
+ if (!WriteFile(This->hFile, pv, cb, &dwWritten, NULL))
+ return HRESULT_FROM_WIN32(GetLastError());
+
if (pcbWritten)
*pcbWritten = dwWritten;
- return hRet;
+ return S_OK;
}
/**************************************************************************
@@ -169,6 +175,8 @@ static HRESULT WINAPI IStream_fnSeek(ISt
IStream_fnCommit(iface, 0); /* If ever buffered, this will be needed */
dwPos = SetFilePointer(This->hFile, dlibMove.u.LowPart, NULL, dwOrigin);
+ if( dwPos == INVALID_SET_FILE_POINTER )
+ return E_FAIL;
if (pNewPos)
{
@@ -186,8 +194,15 @@ static HRESULT WINAPI IStream_fnSetSize(
ISHFileStream *This = (ISHFileStream *)iface;
TRACE("(%p,%ld)\n", This, libNewSize.u.LowPart);
+
IStream_fnCommit(iface, 0); /* If ever buffered, this will be needed */
- return E_NOTIMPL;
+ if( ! SetFilePointer( This->hFile, libNewSize.QuadPart, NULL, FILE_BEGIN ) )
+ return E_FAIL;
+
+ if( ! SetEndOfFile( This->hFile ) )
+ return E_FAIL;
+
+ return S_OK;
}
/**************************************************************************
@@ -403,29 +418,27 @@ HRESULT WINAPI SHCreateStreamOnFileEx(LP
*lppStream = NULL;
- if (dwMode & ~(STGM_WRITE|STGM_READWRITE|STGM_SHARE_DENY_NONE|STGM_SHARE_DENY_READ|STGM_CREATE))
- {
- WARN("Invalid mode 0x%08lX\n", dwMode);
+ if (dwMode & STGM_TRANSACTED)
return E_INVALIDARG;
- }
/* Access */
- switch (dwMode & (STGM_WRITE|STGM_READWRITE))
+ switch (STGM_ACCESS_MODE(dwMode))
{
- case STGM_READWRITE|STGM_WRITE:
case STGM_READWRITE:
dwAccess = GENERIC_READ|GENERIC_WRITE;
break;
case STGM_WRITE:
dwAccess = GENERIC_WRITE;
break;
- default:
+ case STGM_READ:
dwAccess = GENERIC_READ;
break;
+ default:
+ return E_INVALIDARG;
}
/* Sharing */
- switch (dwMode & STGM_SHARE_DENY_READ)
+ switch (STGM_SHARE_MODE(dwMode))
{
case STGM_SHARE_DENY_READ:
dwShare = FILE_SHARE_WRITE;
@@ -436,17 +449,24 @@ HRESULT WINAPI SHCreateStreamOnFileEx(LP
case STGM_SHARE_EXCLUSIVE:
dwShare = 0;
break;
- default:
+ case STGM_SHARE_DENY_NONE:
dwShare = FILE_SHARE_READ|FILE_SHARE_WRITE;
+ break;
+ default:
+ return E_INVALIDARG;
}
- /* FIXME: Creation Flags, MSDN is fuzzy on the mapping... */
- if (dwMode == STGM_FAILIFTHERE)
- dwCreate = bCreate ? CREATE_NEW : OPEN_EXISTING;
- else if (dwMode & STGM_CREATE)
+ switch(STGM_CREATE_MODE(dwMode))
+ {
+ case STGM_FAILIFTHERE:
+ dwCreate = OPEN_EXISTING;
+ break;
+ case STGM_CREATE:
dwCreate = CREATE_ALWAYS;
- else
- dwCreate = OPEN_ALWAYS;
+ break;
+ default:
+ return E_INVALIDARG;
+ }
/* Open HANDLE to file */
hFile = CreateFileW(lpszPath, dwAccess, dwShare, NULL, dwCreate,
@@ -485,12 +505,7 @@ HRESULT WINAPI SHCreateStreamOnFileW(LPC
if (!lpszPath || !lppStream)
return E_INVALIDARG;
- dwAttr = GetFileAttributesW(lpszPath);
- if (dwAttr == INVALID_FILE_ATTRIBUTES)
- dwAttr = 0;
-
- return SHCreateStreamOnFileEx(lpszPath, dwMode|STGM_WRITE, dwAttr,
- TRUE, NULL, lppStream);
+ return SHCreateStreamOnFileEx(lpszPath, dwMode, 0, FALSE, NULL, lppStream);
}
/*************************************************************************
More information about the wine-patches
mailing list