[SHLWAPI] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / dll / win32 / shlwapi / istream.c
index 581871e..946d2c8 100644 (file)
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
+#include <stdarg.h>
+#include <string.h>
 
-#include "precomp.h"
+#define COBJMACROS
+#define NONAMELESSUNION
+
+#include "windef.h"
+#include "winbase.h"
+#include "winerror.h"
+#include "winnls.h"
+#define NO_SHLWAPI_REG
+#define NO_SHLWAPI_PATH
+#include "shlwapi.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
 #define STGM_ACCESS_MODE(stgm)   ((stgm)&0x0000f)
 #define STGM_SHARE_MODE(stgm)    ((stgm)&0x000f0)
@@ -58,8 +72,8 @@ static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVO
   if(IsEqualIID(riid, &IID_IUnknown) ||
      IsEqualIID(riid, &IID_IStream))
   {
-    *ppvObj = This;
     IStream_AddRef(iface);
+    *ppvObj = iface;
     return S_OK;
   }
   return E_NOINTERFACE;
@@ -116,7 +130,7 @@ static HRESULT WINAPI IStream_fnRead(IStream *iface, void* pv, ULONG cb, ULONG*
   }
   if (pcbRead)
     *pcbRead = dwRead;
-  return S_OK;
+  return dwRead == cb ? S_OK : S_FALSE;
 }
 
 /**************************************************************************
@@ -216,22 +230,22 @@ static HRESULT WINAPI IStream_fnCopyTo(IStream *iface, IStream* pstm, ULARGE_INT
   ulSize = cb.QuadPart;
   while (ulSize)
   {
-    ULONG ulLeft, ulAmt;
+    ULONG ulLeft, ulRead, ulWritten;
 
     ulLeft = ulSize > sizeof(copyBuff) ? sizeof(copyBuff) : ulSize;
 
     /* Read */
-    hRet = IStream_fnRead(iface, copyBuff, ulLeft, &ulAmt);
-    if (pcbRead)
-      pcbRead->QuadPart += ulAmt;
-    if (FAILED(hRet) || ulAmt != ulLeft)
+    hRet = IStream_fnRead(iface, copyBuff, ulLeft, &ulRead);
+    if (FAILED(hRet) || ulRead == 0)
       break;
+    if (pcbRead)
+      pcbRead->QuadPart += ulRead;
 
     /* Write */
-    hRet = IStream_fnWrite(pstm, copyBuff, ulLeft, &ulAmt);
+    hRet = IStream_fnWrite(pstm, copyBuff, ulRead, &ulWritten);
     if (pcbWritten)
-      pcbWritten->QuadPart += ulAmt;
-    if (FAILED(hRet) || ulAmt != ulLeft)
+      pcbWritten->QuadPart += ulWritten;
+    if (FAILED(hRet) || ulWritten != ulLeft)
       break;
 
     ulSize -= ulLeft;
@@ -279,16 +293,14 @@ static HRESULT WINAPI IStream_fnLockUnlockRegion(IStream *iface, ULARGE_INTEGER
 static HRESULT WINAPI IStream_fnStat(IStream *iface, STATSTG* lpStat,
                                      DWORD grfStatFlag)
 {
-  ISHFileStream *This = impl_from_IStream(iface);
-  BY_HANDLE_FILE_INFORMATION fi;
-  HRESULT hRet = S_OK;
+    ISHFileStream *This = impl_from_IStream(iface);
+    BY_HANDLE_FILE_INFORMATION fi;
 
-  TRACE("(%p,%p,%d)\n", This, lpStat, grfStatFlag);
+    TRACE("(%p,%p,%d)\n", This, lpStat, grfStatFlag);
+
+    if (!grfStatFlag)
+        return STG_E_INVALIDPOINTER;
 
-  if (!grfStatFlag)
-    hRet = STG_E_INVALIDPOINTER;
-  else
-  {
     memset(&fi, 0, sizeof(fi));
     GetFileInformationByHandle(This->hFile, &fi);
 
@@ -307,8 +319,8 @@ static HRESULT WINAPI IStream_fnStat(IStream *iface, STATSTG* lpStat,
     memcpy(&lpStat->clsid, &IID_IStream, sizeof(CLSID));
     lpStat->grfStateBits = This->grfStateBits;
     lpStat->reserved = 0;
-  }
-  return hRet;
+
+    return S_OK;
 }
 
 /*************************************************************************
@@ -349,22 +361,21 @@ static const IStreamVtbl SHLWAPI_fsVTable =
  */
 static IStream *IStream_Create(LPCWSTR lpszPath, HANDLE hFile, DWORD dwMode)
 {
- ISHFileStream* fileStream;
-
- fileStream = HeapAlloc(GetProcessHeap(), 0, sizeof(ISHFileStream));
-
- if (fileStream)
- {
-   fileStream->IStream_iface.lpVtbl = &SHLWAPI_fsVTable;
-   fileStream->ref = 1;
-   fileStream->hFile = hFile;
-   fileStream->dwMode = dwMode;
-   fileStream->lpszPath = StrDupW(lpszPath);
-   fileStream->type = 0; /* FIXME */
-   fileStream->grfStateBits = 0; /* FIXME */
- }
- TRACE ("Returning %p\n", fileStream);
- return &fileStream->IStream_iface;
+    ISHFileStream *fileStream;
+
+    fileStream = HeapAlloc(GetProcessHeap(), 0, sizeof(ISHFileStream));
+    if (!fileStream) return NULL;
+
+    fileStream->IStream_iface.lpVtbl = &SHLWAPI_fsVTable;
+    fileStream->ref = 1;
+    fileStream->hFile = hFile;
+    fileStream->dwMode = dwMode;
+    fileStream->lpszPath = StrDupW(lpszPath);
+    fileStream->type = 0; /* FIXME */
+    fileStream->grfStateBits = 0; /* FIXME */
+
+    TRACE ("Returning %p\n", fileStream);
+    return &fileStream->IStream_iface;
 }
 
 /*************************************************************************
@@ -405,12 +416,10 @@ HRESULT WINAPI SHCreateStreamOnFileEx(LPCWSTR lpszPath, DWORD dwMode,
   /* Access */
   switch (STGM_ACCESS_MODE(dwMode))
   {
+  case STGM_WRITE:
   case STGM_READWRITE:
     dwAccess = GENERIC_READ|GENERIC_WRITE;
     break;
-  case STGM_WRITE:
-    dwAccess = GENERIC_WRITE;
-    break;
   case STGM_READ:
     dwAccess = GENERIC_READ;
     break;
@@ -422,6 +431,7 @@ HRESULT WINAPI SHCreateStreamOnFileEx(LPCWSTR lpszPath, DWORD dwMode,
   switch (STGM_SHARE_MODE(dwMode))
   {
   case 0:
+  case STGM_SHARE_DENY_NONE:
     dwShare = FILE_SHARE_READ|FILE_SHARE_WRITE;
     break;
   case STGM_SHARE_DENY_READ:
@@ -433,9 +443,6 @@ HRESULT WINAPI SHCreateStreamOnFileEx(LPCWSTR lpszPath, DWORD dwMode,
   case STGM_SHARE_EXCLUSIVE:
     dwShare = 0;
     break;
-  case STGM_SHARE_DENY_NONE:
-    dwShare = FILE_SHARE_READ|FILE_SHARE_WRITE;
-    break;
   default:
     return E_INVALIDARG;
   }