* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#define WIN32_NO_STATUS
-#define _INC_WINDOWS
-#define COM_NO_WINDOWS_H
-
#include <stdarg.h>
-//#include <string.h>
+#include <string.h>
#define COBJMACROS
#define NONAMELESSUNION
-#define NONAMELESSSTRUCT
-#include <windef.h>
-#include <winbase.h>
-//#include "winerror.h"
-#include <winnls.h>
+#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>
+#include "shlwapi.h"
+#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
if(IsEqualIID(riid, &IID_IUnknown) ||
IsEqualIID(riid, &IID_IStream))
{
- *ppvObj = This;
IStream_AddRef(iface);
+ *ppvObj = iface;
return S_OK;
}
return E_NOINTERFACE;
}
if (pcbRead)
*pcbRead = dwRead;
- return S_OK;
+ return dwRead == cb ? S_OK : S_FALSE;
}
/**************************************************************************
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;
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);
memcpy(&lpStat->clsid, &IID_IStream, sizeof(CLSID));
lpStat->grfStateBits = This->grfStateBits;
lpStat->reserved = 0;
- }
- return hRet;
+
+ return S_OK;
}
/*************************************************************************
*/
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;
}
/*************************************************************************
/* 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;
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:
case STGM_SHARE_EXCLUSIVE:
dwShare = 0;
break;
- case STGM_SHARE_DENY_NONE:
- dwShare = FILE_SHARE_READ|FILE_SHARE_WRITE;
- break;
default:
return E_INVALIDARG;
}