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