Commit ec2edc7e authored by Francis Beaudet's avatar Francis Beaudet Committed by Alexandre Julliard

Fixed a few bugs in the OLE storage implementation, added a new set of

trace statements for the OLE storage related methods and introduced a new debug channel for the storage subsystem.
parent 92ae219e
...@@ -132,39 +132,40 @@ int dbch_snoop = 120; ...@@ -132,39 +132,40 @@ int dbch_snoop = 120;
int dbch_sound = 121; int dbch_sound = 121;
int dbch_static = 122; int dbch_static = 122;
int dbch_statusbar = 123; int dbch_statusbar = 123;
int dbch_stress = 124; int dbch_storage = 124;
int dbch_string = 125; int dbch_stress = 125;
int dbch_syscolor = 126; int dbch_string = 126;
int dbch_system = 127; int dbch_syscolor = 127;
int dbch_tab = 128; int dbch_system = 128;
int dbch_tapi = 129; int dbch_tab = 129;
int dbch_task = 130; int dbch_tapi = 130;
int dbch_text = 131; int dbch_task = 131;
int dbch_thread = 132; int dbch_text = 132;
int dbch_thunk = 133; int dbch_thread = 133;
int dbch_timer = 134; int dbch_thunk = 134;
int dbch_toolbar = 135; int dbch_timer = 135;
int dbch_toolhelp = 136; int dbch_toolbar = 136;
int dbch_tooltips = 137; int dbch_toolhelp = 137;
int dbch_trackbar = 138; int dbch_tooltips = 138;
int dbch_treeview = 139; int dbch_trackbar = 139;
int dbch_ttydrv = 140; int dbch_treeview = 140;
int dbch_tweak = 141; int dbch_ttydrv = 141;
int dbch_updown = 142; int dbch_tweak = 142;
int dbch_ver = 143; int dbch_updown = 143;
int dbch_virtual = 144; int dbch_ver = 144;
int dbch_vxd = 145; int dbch_virtual = 145;
int dbch_wave = 146; int dbch_vxd = 146;
int dbch_win = 147; int dbch_wave = 147;
int dbch_win16drv = 148; int dbch_win = 148;
int dbch_win32 = 149; int dbch_win16drv = 149;
int dbch_wing = 150; int dbch_win32 = 150;
int dbch_winsock = 151; int dbch_wing = 151;
int dbch_wnet = 152; int dbch_winsock = 152;
int dbch_x11 = 153; int dbch_wnet = 153;
int dbch_x11drv = 154; int dbch_x11 = 154;
int dbch_x11drv = 155;
#define DEBUG_CHANNEL_COUNT 155 #define DEBUG_CHANNEL_COUNT 156
char debug_msg_enabled[DEBUG_CHANNEL_COUNT][DEBUG_CLASS_COUNT] = { char debug_msg_enabled[DEBUG_CHANNEL_COUNT][DEBUG_CLASS_COUNT] = {
{1, 1, 0, 0}, {1, 1, 0, 0},
...@@ -321,6 +322,7 @@ char debug_msg_enabled[DEBUG_CHANNEL_COUNT][DEBUG_CLASS_COUNT] = { ...@@ -321,6 +322,7 @@ char debug_msg_enabled[DEBUG_CHANNEL_COUNT][DEBUG_CLASS_COUNT] = {
{1, 1, 0, 0}, {1, 1, 0, 0},
{1, 1, 0, 0}, {1, 1, 0, 0},
{1, 1, 0, 0}, {1, 1, 0, 0},
{1, 1, 0, 0},
{1, 1, 0, 0} {1, 1, 0, 0}
}; };
...@@ -449,6 +451,7 @@ const char * const debug_ch_name[DEBUG_CHANNEL_COUNT] = { ...@@ -449,6 +451,7 @@ const char * const debug_ch_name[DEBUG_CHANNEL_COUNT] = {
"sound", "sound",
"static", "static",
"statusbar", "statusbar",
"storage",
"stress", "stress",
"string", "string",
"syscolor", "syscolor",
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "objbase.h" #include "objbase.h"
DEFAULT_DEBUG_CHANNEL(ole) DEFAULT_DEBUG_CHANNEL(storage)
/**************************************************************************** /****************************************************************************
* HGLOBALStreamImpl definition. * HGLOBALStreamImpl definition.
...@@ -252,6 +252,8 @@ HGLOBALStreamImpl* HGLOBALStreamImpl_Construct( ...@@ -252,6 +252,8 @@ HGLOBALStreamImpl* HGLOBALStreamImpl_Construct(
*/ */
void HGLOBALStreamImpl_Destroy(HGLOBALStreamImpl* This) void HGLOBALStreamImpl_Destroy(HGLOBALStreamImpl* This)
{ {
TRACE(storage, "(%p)\n", This);
/* /*
* Release the HGlobal if the constructor asked for that. * Release the HGlobal if the constructor asked for that.
*/ */
...@@ -376,6 +378,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Read( ...@@ -376,6 +378,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Read(
void* supportBuffer; void* supportBuffer;
ULONG bytesReadBuffer; ULONG bytesReadBuffer;
ULONG bytesToReadFromBuffer; ULONG bytesToReadFromBuffer;
TRACE(storage, "(%p, %p, %ld, %p)\n", iface,
pv, cb, pcbRead);
/* /*
* If the caller is not interested in the nubmer of bytes read, * If the caller is not interested in the nubmer of bytes read,
...@@ -444,6 +449,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Write( ...@@ -444,6 +449,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Write(
void* supportBuffer; void* supportBuffer;
ULARGE_INTEGER newSize; ULARGE_INTEGER newSize;
ULONG bytesWritten = 0; ULONG bytesWritten = 0;
TRACE(storage, "(%p, %p, %ld, %p)\n", iface,
pv, cb, pcbWritten);
/* /*
* If the caller is not interested in the number of bytes written, * If the caller is not interested in the number of bytes written,
...@@ -468,7 +476,7 @@ HRESULT WINAPI HGLOBALStreamImpl_Write( ...@@ -468,7 +476,7 @@ HRESULT WINAPI HGLOBALStreamImpl_Write(
if (newSize.LowPart > This->streamSize.LowPart) if (newSize.LowPart > This->streamSize.LowPart)
{ {
/* grow stream */ /* grow stream */
HGLOBALStreamImpl_SetSize(iface, newSize); IStream_SetSize(iface, newSize);
} }
/* /*
...@@ -514,6 +522,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Seek( ...@@ -514,6 +522,9 @@ HRESULT WINAPI HGLOBALStreamImpl_Seek(
ULARGE_INTEGER newPosition; ULARGE_INTEGER newPosition;
TRACE(storage, "(%p, %ld, %ld, %p)\n", iface,
dlibMove.LowPart, dwOrigin, plibNewPosition);
/* /*
* The caller is allowed to pass in NULL as the new position return value. * The caller is allowed to pass in NULL as the new position return value.
* If it happens, we assign it to a dynamic variable to avoid special cases * If it happens, we assign it to a dynamic variable to avoid special cases
...@@ -587,6 +598,8 @@ HRESULT WINAPI HGLOBALStreamImpl_SetSize( ...@@ -587,6 +598,8 @@ HRESULT WINAPI HGLOBALStreamImpl_SetSize(
{ {
HGLOBALStreamImpl* const This=(HGLOBALStreamImpl*)iface; HGLOBALStreamImpl* const This=(HGLOBALStreamImpl*)iface;
TRACE(storage, "(%p, %ld)\n", iface, libNewSize.LowPart);
/* /*
* As documented. * As documented.
*/ */
...@@ -628,6 +641,9 @@ HRESULT WINAPI HGLOBALStreamImpl_CopyTo( ...@@ -628,6 +641,9 @@ HRESULT WINAPI HGLOBALStreamImpl_CopyTo(
ULARGE_INTEGER totalBytesRead; ULARGE_INTEGER totalBytesRead;
ULARGE_INTEGER totalBytesWritten; ULARGE_INTEGER totalBytesWritten;
TRACE(storage, "(%p, %p, %ld, %p, %p)\n", iface, pstm,
cb.LowPart, pcbRead, pcbWritten);
/* /*
* Sanity check * Sanity check
*/ */
...@@ -649,24 +665,27 @@ HRESULT WINAPI HGLOBALStreamImpl_CopyTo( ...@@ -649,24 +665,27 @@ HRESULT WINAPI HGLOBALStreamImpl_CopyTo(
else else
copySize = cb.LowPart; copySize = cb.LowPart;
HGLOBALStreamImpl_Read(iface, tmpBuffer, 128, &bytesRead); IStream_Read(iface, tmpBuffer, copySize, &bytesRead);
totalBytesRead.LowPart += bytesRead; totalBytesRead.LowPart += bytesRead;
HGLOBALStreamImpl_Write(pstm, tmpBuffer, bytesRead, &bytesWritten); IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
totalBytesWritten.LowPart += bytesWritten; totalBytesWritten.LowPart += bytesWritten;
/* /*
* Check that read & write operations were succesfull * Check that read & write operations were succesfull
*/ */
if ( (bytesRead != copySize) && (bytesWritten != copySize) ) if (bytesRead != bytesWritten)
{ {
hr = STG_E_MEDIUMFULL; hr = STG_E_MEDIUMFULL;
break; break;
} }
cb.LowPart = cb.LowPart - copySize; if (bytesRead!=copySize)
cb.LowPart = 0;
else
cb.LowPart -= bytesRead;
} }
/* /*
...@@ -777,6 +796,6 @@ HRESULT WINAPI HGLOBALStreamImpl_Clone( ...@@ -777,6 +796,6 @@ HRESULT WINAPI HGLOBALStreamImpl_Clone(
IStream* iface, IStream* iface,
IStream** ppstm) /* [out] */ IStream** ppstm) /* [out] */
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "storage32.h" #include "storage32.h"
DEFAULT_DEBUG_CHANNEL(ole) DEFAULT_DEBUG_CHANNEL(storage)
/* /*
...@@ -113,6 +113,8 @@ StgStreamImpl* StgStreamImpl_Construct( ...@@ -113,6 +113,8 @@ StgStreamImpl* StgStreamImpl_Construct(
*/ */
void StgStreamImpl_Destroy(StgStreamImpl* This) void StgStreamImpl_Destroy(StgStreamImpl* This)
{ {
TRACE(storage, "(%p)\n", This);
/* /*
* Release the reference we are holding on the parent storage. * Release the reference we are holding on the parent storage.
*/ */
...@@ -314,7 +316,10 @@ HRESULT WINAPI StgStreamImpl_Read( ...@@ -314,7 +316,10 @@ HRESULT WINAPI StgStreamImpl_Read(
ULONG bytesReadBuffer; ULONG bytesReadBuffer;
ULONG bytesToReadFromBuffer; ULONG bytesToReadFromBuffer;
TRACE(storage, "(%p, %p, %ld, %p)\n",
iface, pv, cb, pcbRead);
/* /*
* If the caller is not interested in the nubmer of bytes read, * If the caller is not interested in the nubmer of bytes read,
* we use another buffer to avoid "if" statements in the code. * we use another buffer to avoid "if" statements in the code.
...@@ -394,6 +399,9 @@ HRESULT WINAPI StgStreamImpl_Write( ...@@ -394,6 +399,9 @@ HRESULT WINAPI StgStreamImpl_Write(
ULARGE_INTEGER newSize; ULARGE_INTEGER newSize;
ULONG bytesWritten = 0; ULONG bytesWritten = 0;
TRACE(storage, "(%p, %p, %ld, %p)\n",
iface, pv, cb, pcbWritten);
/* /*
* If the caller is not interested in the number of bytes written, * If the caller is not interested in the number of bytes written,
...@@ -402,6 +410,11 @@ HRESULT WINAPI StgStreamImpl_Write( ...@@ -402,6 +410,11 @@ HRESULT WINAPI StgStreamImpl_Write(
if (pcbWritten == 0) if (pcbWritten == 0)
pcbWritten = &bytesWritten; pcbWritten = &bytesWritten;
/*
* Initialize the out parameter
*/
*pcbWritten = 0;
if (cb == 0) if (cb == 0)
{ {
return S_OK; return S_OK;
...@@ -418,7 +431,7 @@ HRESULT WINAPI StgStreamImpl_Write( ...@@ -418,7 +431,7 @@ HRESULT WINAPI StgStreamImpl_Write(
if (newSize.LowPart > This->streamSize.LowPart) if (newSize.LowPart > This->streamSize.LowPart)
{ {
/* grow stream */ /* grow stream */
StgStreamImpl_SetSize(iface, newSize); IStream_SetSize(iface, newSize);
} }
/* /*
...@@ -471,6 +484,9 @@ HRESULT WINAPI StgStreamImpl_Seek( ...@@ -471,6 +484,9 @@ HRESULT WINAPI StgStreamImpl_Seek(
ULARGE_INTEGER newPosition; ULARGE_INTEGER newPosition;
TRACE(storage, "(%p, %ld, %ld, %p)\n",
iface, dlibMove.LowPart, dwOrigin, plibNewPosition);
/* /*
* The caller is allowed to pass in NULL as the new position return value. * The caller is allowed to pass in NULL as the new position return value.
* If it happens, we assign it to a dynamic variable to avoid special cases * If it happens, we assign it to a dynamic variable to avoid special cases
...@@ -547,6 +563,8 @@ HRESULT WINAPI StgStreamImpl_SetSize( ...@@ -547,6 +563,8 @@ HRESULT WINAPI StgStreamImpl_SetSize(
StgProperty curProperty; StgProperty curProperty;
BOOL Success; BOOL Success;
TRACE(storage, "(%p, %ld)\n", iface, libNewSize.LowPart);
/* /*
* As documented. * As documented.
*/ */
...@@ -584,9 +602,9 @@ HRESULT WINAPI StgStreamImpl_SetSize( ...@@ -584,9 +602,9 @@ HRESULT WINAPI StgStreamImpl_SetSize(
&curProperty); &curProperty);
/* /*
* Determine if we have to switch from small to big blocks or vice versa * Determine if we have to switch from small to big blocks or vice versa
*/ */
if ( (This->smallBlockChain!=0) &&
if (curProperty.size.LowPart < LIMIT_TO_USE_SMALL_BLOCK) (curProperty.size.LowPart < LIMIT_TO_USE_SMALL_BLOCK) )
{ {
if (libNewSize.LowPart >= LIMIT_TO_USE_SMALL_BLOCK) if (libNewSize.LowPart >= LIMIT_TO_USE_SMALL_BLOCK)
{ {
...@@ -650,6 +668,9 @@ HRESULT WINAPI StgStreamImpl_CopyTo( ...@@ -650,6 +668,9 @@ HRESULT WINAPI StgStreamImpl_CopyTo(
ULARGE_INTEGER totalBytesRead; ULARGE_INTEGER totalBytesRead;
ULARGE_INTEGER totalBytesWritten; ULARGE_INTEGER totalBytesWritten;
TRACE(storage, "(%p, %p, %ld, %p, %p)\n",
iface, pstm, cb.LowPart, pcbRead, pcbWritten);
/* /*
* Sanity check * Sanity check
*/ */
...@@ -671,24 +692,27 @@ HRESULT WINAPI StgStreamImpl_CopyTo( ...@@ -671,24 +692,27 @@ HRESULT WINAPI StgStreamImpl_CopyTo(
else else
copySize = cb.LowPart; copySize = cb.LowPart;
StgStreamImpl_Read(iface, tmpBuffer, 128, &bytesRead); IStream_Read(iface, tmpBuffer, copySize, &bytesRead);
totalBytesRead.LowPart += bytesRead; totalBytesRead.LowPart += bytesRead;
StgStreamImpl_Write(pstm, tmpBuffer, bytesRead, &bytesWritten); IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
totalBytesWritten.LowPart += bytesWritten; totalBytesWritten.LowPart += bytesWritten;
/* /*
* Check that read & write operations were succesfull * Check that read & write operations were succesfull
*/ */
if ( (bytesRead != copySize) && (bytesWritten != copySize) ) if (bytesRead != bytesWritten)
{ {
hr = STG_E_MEDIUMFULL; hr = STG_E_MEDIUMFULL;
break; break;
} }
cb.LowPart = cb.LowPart - copySize; if (bytesRead!=copySize)
cb.LowPart = 0;
else
cb.LowPart -= bytesRead;
} }
/* /*
...@@ -743,7 +767,7 @@ HRESULT WINAPI StgStreamImpl_LockRegion( ...@@ -743,7 +767,7 @@ HRESULT WINAPI StgStreamImpl_LockRegion(
ULARGE_INTEGER cb, /* [in] */ ULARGE_INTEGER cb, /* [in] */
DWORD dwLockType) /* [in] */ DWORD dwLockType) /* [in] */
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -753,7 +777,7 @@ HRESULT WINAPI StgStreamImpl_UnlockRegion( ...@@ -753,7 +777,7 @@ HRESULT WINAPI StgStreamImpl_UnlockRegion(
ULARGE_INTEGER cb, /* [in] */ ULARGE_INTEGER cb, /* [in] */
DWORD dwLockType) /* [in] */ DWORD dwLockType) /* [in] */
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -798,6 +822,6 @@ HRESULT WINAPI StgStreamImpl_Clone( ...@@ -798,6 +822,6 @@ HRESULT WINAPI StgStreamImpl_Clone(
IStream* iface, IStream* iface,
IStream** ppstm) /* [out] */ IStream** ppstm) /* [out] */
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include "storage32.h" #include "storage32.h"
#include "ole2.h" #include "ole2.h"
DEFAULT_DEBUG_CHANNEL(ole) DEFAULT_DEBUG_CHANNEL(storage)
#define FILE_BEGIN 0 #define FILE_BEGIN 0
...@@ -270,9 +270,9 @@ ULONG WINAPI StorageBaseImpl_Release( ...@@ -270,9 +270,9 @@ ULONG WINAPI StorageBaseImpl_Release(
HRESULT WINAPI StorageBaseImpl_OpenStream( HRESULT WINAPI StorageBaseImpl_OpenStream(
IStorage* iface, IStorage* iface,
const OLECHAR* pwcsName, /* [string][in] */ const OLECHAR* pwcsName, /* [string][in] */
void* reserved1, /* [unique][in] */ void* reserved1, /* [unique][in] */
DWORD grfMode, /* [in] */ DWORD grfMode, /* [in] */
DWORD reserved2, /* [in] */ DWORD reserved2, /* [in] */
IStream** ppstm) /* [out] */ IStream** ppstm) /* [out] */
{ {
ICOM_THIS(StorageBaseImpl,iface); ICOM_THIS(StorageBaseImpl,iface);
...@@ -281,6 +281,9 @@ HRESULT WINAPI StorageBaseImpl_OpenStream( ...@@ -281,6 +281,9 @@ HRESULT WINAPI StorageBaseImpl_OpenStream(
StgProperty currentProperty; StgProperty currentProperty;
ULONG foundPropertyIndex; ULONG foundPropertyIndex;
TRACE(storage, "(%p, %s, %p, %lx, %ld, %p)\n",
iface, debugstr_w(pwcsName), reserved1, grfMode, reserved2, ppstm);
/* /*
* Perform a sanity check on the parameters. * Perform a sanity check on the parameters.
*/ */
...@@ -364,9 +367,9 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage( ...@@ -364,9 +367,9 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage(
IStorage* iface, IStorage* iface,
const OLECHAR* pwcsName, /* [string][unique][in] */ const OLECHAR* pwcsName, /* [string][unique][in] */
IStorage* pstgPriority, /* [unique][in] */ IStorage* pstgPriority, /* [unique][in] */
DWORD grfMode, /* [in] */ DWORD grfMode, /* [in] */
SNB snbExclude, /* [unique][in] */ SNB snbExclude, /* [unique][in] */
DWORD reserved, /* [in] */ DWORD reserved, /* [in] */
IStorage** ppstg) /* [out] */ IStorage** ppstg) /* [out] */
{ {
ICOM_THIS(StorageBaseImpl,iface); ICOM_THIS(StorageBaseImpl,iface);
...@@ -374,6 +377,10 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage( ...@@ -374,6 +377,10 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage(
IEnumSTATSTGImpl* propertyEnumeration; IEnumSTATSTGImpl* propertyEnumeration;
StgProperty currentProperty; StgProperty currentProperty;
ULONG foundPropertyIndex; ULONG foundPropertyIndex;
TRACE(storage, "(%p, %s, %p, %lx, %p, %ld, %p)\n",
iface, debugstr_w(pwcsName), pstgPriority,
grfMode, snbExclude, reserved, ppstg);
/* /*
* Perform a sanity check on the parameters. * Perform a sanity check on the parameters.
...@@ -461,15 +468,18 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage( ...@@ -461,15 +468,18 @@ HRESULT WINAPI StorageBaseImpl_OpenStorage(
* See Windows documentation for more details on IStorage methods. * See Windows documentation for more details on IStorage methods.
*/ */
HRESULT WINAPI StorageBaseImpl_EnumElements( HRESULT WINAPI StorageBaseImpl_EnumElements(
IStorage* iface, IStorage* iface,
DWORD reserved1, /* [in] */ DWORD reserved1, /* [in] */
void* reserved2, /* [size_is][unique][in] */ void* reserved2, /* [size_is][unique][in] */
DWORD reserved3, /* [in] */ DWORD reserved3, /* [in] */
IEnumSTATSTG** ppenum) /* [out] */ IEnumSTATSTG** ppenum) /* [out] */
{ {
ICOM_THIS(StorageBaseImpl,iface); ICOM_THIS(StorageBaseImpl,iface);
IEnumSTATSTGImpl* newEnum; IEnumSTATSTGImpl* newEnum;
TRACE(storage, "(%p, %ld, %p, %ld, %p)\n",
iface, reserved1, reserved2, reserved3, ppenum);
/* /*
* Perform a sanity check on the parameters. * Perform a sanity check on the parameters.
*/ */
...@@ -508,13 +518,16 @@ HRESULT WINAPI StorageBaseImpl_EnumElements( ...@@ -508,13 +518,16 @@ HRESULT WINAPI StorageBaseImpl_EnumElements(
*/ */
HRESULT WINAPI StorageBaseImpl_Stat( HRESULT WINAPI StorageBaseImpl_Stat(
IStorage* iface, IStorage* iface,
STATSTG* pstatstg, /* [out] */ STATSTG* pstatstg, /* [out] */
DWORD grfStatFlag) /* [in] */ DWORD grfStatFlag) /* [in] */
{ {
ICOM_THIS(StorageBaseImpl,iface); ICOM_THIS(StorageBaseImpl,iface);
StgProperty curProperty; StgProperty curProperty;
BOOL readSucessful; BOOL readSucessful;
TRACE(storage, "(%p, %p, %lx)\n",
iface, pstatstg, grfStatFlag);
/* /*
* Perform a sanity check on the parameters. * Perform a sanity check on the parameters.
*/ */
...@@ -563,6 +576,9 @@ HRESULT WINAPI StorageBaseImpl_RenameElement( ...@@ -563,6 +576,9 @@ HRESULT WINAPI StorageBaseImpl_RenameElement(
StgProperty currentProperty; StgProperty currentProperty;
ULONG foundPropertyIndex; ULONG foundPropertyIndex;
TRACE(storage, "(%p, %s, %s)\n",
iface, debugstr_w(pwcsOldName), debugstr_w(pwcsNewName));
/* /*
* Create a property enumeration to search the properties * Create a property enumeration to search the properties
*/ */
...@@ -704,9 +720,9 @@ HRESULT WINAPI StorageBaseImpl_RenameElement( ...@@ -704,9 +720,9 @@ HRESULT WINAPI StorageBaseImpl_RenameElement(
HRESULT WINAPI StorageBaseImpl_CreateStream( HRESULT WINAPI StorageBaseImpl_CreateStream(
IStorage* iface, IStorage* iface,
const OLECHAR* pwcsName, /* [string][in] */ const OLECHAR* pwcsName, /* [string][in] */
DWORD grfMode, /* [in] */ DWORD grfMode, /* [in] */
DWORD reserved1, /* [in] */ DWORD reserved1, /* [in] */
DWORD reserved2, /* [in] */ DWORD reserved2, /* [in] */
IStream** ppstm) /* [out] */ IStream** ppstm) /* [out] */
{ {
ICOM_THIS(StorageBaseImpl,iface); ICOM_THIS(StorageBaseImpl,iface);
...@@ -715,6 +731,10 @@ HRESULT WINAPI StorageBaseImpl_CreateStream( ...@@ -715,6 +731,10 @@ HRESULT WINAPI StorageBaseImpl_CreateStream(
StgProperty currentProperty, newStreamProperty; StgProperty currentProperty, newStreamProperty;
ULONG foundPropertyIndex, newPropertyIndex; ULONG foundPropertyIndex, newPropertyIndex;
TRACE(storage, "(%p, %s, %lx, %ld, %ld, %p)\n",
iface, debugstr_w(pwcsName), grfMode,
reserved1, reserved2, ppstm);
/* /*
* Validate parameters * Validate parameters
*/ */
...@@ -761,7 +781,9 @@ HRESULT WINAPI StorageBaseImpl_CreateStream( ...@@ -761,7 +781,9 @@ HRESULT WINAPI StorageBaseImpl_CreateStream(
* An element with this name already exists * An element with this name already exists
*/ */
if (grfMode & STGM_CREATE) if (grfMode & STGM_CREATE)
StorageImpl_DestroyElement((IStorage*)This->ancestorStorage, pwcsName); {
IStorage_DestroyElement(iface, pwcsName);
}
else else
return STG_E_FILEALREADYEXISTS; return STG_E_FILEALREADYEXISTS;
} }
...@@ -851,12 +873,14 @@ HRESULT WINAPI StorageBaseImpl_CreateStream( ...@@ -851,12 +873,14 @@ HRESULT WINAPI StorageBaseImpl_CreateStream(
*/ */
HRESULT WINAPI StorageBaseImpl_SetClass( HRESULT WINAPI StorageBaseImpl_SetClass(
IStorage* iface, IStorage* iface,
REFCLSID clsid) /* [in] */ REFCLSID clsid) /* [in] */
{ {
ICOM_THIS(StorageBaseImpl,iface); ICOM_THIS(StorageBaseImpl,iface);
HRESULT hRes = E_FAIL; HRESULT hRes = E_FAIL;
StgProperty curProperty; StgProperty curProperty;
BOOL success; BOOL success;
TRACE(storage, "(%p, %p)\n", iface, clsid);
success = StorageImpl_ReadProperty(This->ancestorStorage, success = StorageImpl_ReadProperty(This->ancestorStorage,
This->rootPropertySetIndex, This->rootPropertySetIndex,
...@@ -903,6 +927,9 @@ HRESULT WINAPI StorageImpl_CreateStorage( ...@@ -903,6 +927,9 @@ HRESULT WINAPI StorageImpl_CreateStorage(
ULONG newPropertyIndex; ULONG newPropertyIndex;
HRESULT hr; HRESULT hr;
TRACE(storage, "(%p, %s, %lx, %ld, %ld, %p)\n",
iface, debugstr_w(pwcsName), grfMode,
reserved1, reserved2, ppstg);
/* /*
* Validate parameters * Validate parameters
...@@ -942,7 +969,7 @@ HRESULT WINAPI StorageImpl_CreateStorage( ...@@ -942,7 +969,7 @@ HRESULT WINAPI StorageImpl_CreateStorage(
* An element with this name already exists * An element with this name already exists
*/ */
if (grfMode & STGM_CREATE) if (grfMode & STGM_CREATE)
StorageImpl_DestroyElement((IStorage*)This->ancestorStorage, pwcsName); IStorage_DestroyElement(iface, pwcsName);
else else
return STG_E_FILEALREADYEXISTS; return STG_E_FILEALREADYEXISTS;
} }
...@@ -1001,7 +1028,7 @@ HRESULT WINAPI StorageImpl_CreateStorage( ...@@ -1001,7 +1028,7 @@ HRESULT WINAPI StorageImpl_CreateStorage(
/* /*
* Open it to get a pointer to return. * Open it to get a pointer to return.
*/ */
hr = StorageBaseImpl_OpenStorage( hr = IStorage_OpenStorage(
iface, iface,
(OLECHAR*)pwcsName, (OLECHAR*)pwcsName,
0, 0,
...@@ -1212,7 +1239,7 @@ static void updatePropertyChain( ...@@ -1212,7 +1239,7 @@ static void updatePropertyChain(
found = 1; found = 1;
} }
} }
else else if (diff > 0)
{ {
if (next != PROPERTY_NULL) if (next != PROPERTY_NULL)
{ {
...@@ -1230,6 +1257,14 @@ static void updatePropertyChain( ...@@ -1230,6 +1257,14 @@ static void updatePropertyChain(
found = 1; found = 1;
} }
} }
else
{
/*
* Trying to insert an item with the same name in the
* subtree structure.
*/
assert(FALSE);
}
previous = currentProperty.previousProperty; previous = currentProperty.previousProperty;
next = currentProperty.nextProperty; next = currentProperty.nextProperty;
...@@ -1253,10 +1288,10 @@ static void updatePropertyChain( ...@@ -1253,10 +1288,10 @@ static void updatePropertyChain(
*/ */
HRESULT WINAPI StorageImpl_CopyTo( HRESULT WINAPI StorageImpl_CopyTo(
IStorage* iface, IStorage* iface,
DWORD ciidExclude, /* [in] */ DWORD ciidExclude, /* [in] */
const IID *rgiidExclude,/* [size_is][unique][in] */ const IID* rgiidExclude, /* [size_is][unique][in] */
SNB snbExclude, /* [unique][in] */ SNB snbExclude, /* [unique][in] */
IStorage *pstgDest) /* [unique][in] */ IStorage* pstgDest) /* [unique][in] */
{ {
IEnumSTATSTG *elements = 0; IEnumSTATSTG *elements = 0;
STATSTG curElement, strStat; STATSTG curElement, strStat;
...@@ -1265,7 +1300,11 @@ HRESULT WINAPI StorageImpl_CopyTo( ...@@ -1265,7 +1300,11 @@ HRESULT WINAPI StorageImpl_CopyTo(
IStream *pstrTmp, *pstrChild; IStream *pstrTmp, *pstrChild;
if ((ciidExclude != 0) || (rgiidExclude != NULL) || (snbExclude != NULL)) if ((ciidExclude != 0) || (rgiidExclude != NULL) || (snbExclude != NULL))
FIXME( ole, "Exclude option not implemented\n"); FIXME( storage, "Exclude option not implemented\n");
TRACE(storage, "(%p, %ld, %p, %p, %p)\n",
iface, ciidExclude, rgiidExclude,
snbExclude, pstgDest);
/* /*
* Perform a sanity check * Perform a sanity check
...@@ -1284,7 +1323,7 @@ HRESULT WINAPI StorageImpl_CopyTo( ...@@ -1284,7 +1323,7 @@ HRESULT WINAPI StorageImpl_CopyTo(
/* /*
* set the class ID * set the class ID
*/ */
StorageBaseImpl_Stat( iface, &curElement, STATFLAG_NONAME); IStorage_Stat( iface, &curElement, STATFLAG_NONAME);
IStorage_SetClass( pstgDest, &curElement.clsid ); IStorage_SetClass( pstgDest, &curElement.clsid );
do do
...@@ -1305,9 +1344,9 @@ HRESULT WINAPI StorageImpl_CopyTo( ...@@ -1305,9 +1344,9 @@ HRESULT WINAPI StorageImpl_CopyTo(
/* /*
* open child source storage * open child source storage
*/ */
hr = StorageBaseImpl_OpenStorage( iface, curElement.pwcsName, NULL, hr = IStorage_OpenStorage( iface, curElement.pwcsName, NULL,
STGM_READ|STGM_SHARE_EXCLUSIVE, STGM_READ|STGM_SHARE_EXCLUSIVE,
NULL, 0, &pstgChild ); NULL, 0, &pstgChild );
if (hr != S_OK) if (hr != S_OK)
break; break;
...@@ -1327,7 +1366,8 @@ HRESULT WINAPI StorageImpl_CopyTo( ...@@ -1327,7 +1366,8 @@ HRESULT WINAPI StorageImpl_CopyTo(
* create a new storage in destination storage * create a new storage in destination storage
*/ */
hr = IStorage_CreateStorage( pstgDest, curElement.pwcsName, hr = IStorage_CreateStorage( pstgDest, curElement.pwcsName,
STGM_FAILIFTHERE|STGM_WRITE, 0, 0, STGM_FAILIFTHERE|STGM_WRITE|STGM_SHARE_EXCLUSIVE,
0, 0,
&pstgTmp ); &pstgTmp );
/* /*
* if it already exist, don't create a new one use this one * if it already exist, don't create a new one use this one
...@@ -1368,17 +1408,22 @@ HRESULT WINAPI StorageImpl_CopyTo( ...@@ -1368,17 +1408,22 @@ HRESULT WINAPI StorageImpl_CopyTo(
/* /*
* open child stream storage * open child stream storage
*/ */
hr = StorageBaseImpl_OpenStream( iface, curElement.pwcsName, NULL, hr = IStorage_OpenStream( iface, curElement.pwcsName, NULL,
STGM_READ|STGM_SHARE_EXCLUSIVE, STGM_READ|STGM_SHARE_EXCLUSIVE,
0, &pstrChild ); 0, &pstrChild );
if (hr != S_OK) if (hr != S_OK)
break; break;
/* /*
* Get the size of the stream * Get the size of the source stream
*/ */
IStream_Stat( pstrChild, &strStat, STATFLAG_NONAME ); IStream_Stat( pstrChild, &strStat, STATFLAG_NONAME );
/*
* Set the size of the destination stream.
*/
IStream_SetSize(pstrTmp, strStat.cbSize);
/* /*
* do the copy * do the copy
...@@ -1391,7 +1436,7 @@ HRESULT WINAPI StorageImpl_CopyTo( ...@@ -1391,7 +1436,7 @@ HRESULT WINAPI StorageImpl_CopyTo(
} }
else else
{ {
WARN(ole, "unknown element type: %ld\n", curElement.type); WARN(storage, "unknown element type: %ld\n", curElement.type);
} }
} while (hr == S_OK); } while (hr == S_OK);
...@@ -1414,7 +1459,7 @@ HRESULT WINAPI StorageImpl_MoveElementTo( ...@@ -1414,7 +1459,7 @@ HRESULT WINAPI StorageImpl_MoveElementTo(
const OLECHAR *pwcsNewName,/* [string][in] */ const OLECHAR *pwcsNewName,/* [string][in] */
DWORD grfFlags) /* [in] */ DWORD grfFlags) /* [in] */
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -1425,7 +1470,7 @@ HRESULT WINAPI StorageImpl_Commit( ...@@ -1425,7 +1470,7 @@ HRESULT WINAPI StorageImpl_Commit(
IStorage* iface, IStorage* iface,
DWORD grfCommitFlags)/* [in] */ DWORD grfCommitFlags)/* [in] */
{ {
FIXME(ole, "(%ld): stub!\n", grfCommitFlags); FIXME(storage, "(%ld): stub!\n", grfCommitFlags);
return S_OK; return S_OK;
} }
...@@ -1435,7 +1480,7 @@ HRESULT WINAPI StorageImpl_Commit( ...@@ -1435,7 +1480,7 @@ HRESULT WINAPI StorageImpl_Commit(
HRESULT WINAPI StorageImpl_Revert( HRESULT WINAPI StorageImpl_Revert(
IStorage* iface) IStorage* iface)
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -1465,6 +1510,9 @@ HRESULT WINAPI StorageImpl_DestroyElement( ...@@ -1465,6 +1510,9 @@ HRESULT WINAPI StorageImpl_DestroyElement(
ULONG typeOfRelation; ULONG typeOfRelation;
ULONG parentPropertyId; ULONG parentPropertyId;
TRACE(storage, "(%p, %s)\n",
iface, debugstr_w(pwcsName));
/* /*
* Perform a sanity check on the parameters. * Perform a sanity check on the parameters.
*/ */
...@@ -1680,6 +1728,11 @@ static HRESULT deleteStreamProperty( ...@@ -1680,6 +1728,11 @@ static HRESULT deleteStreamProperty(
return hr; return hr;
} }
/*
* Release the stream object.
*/
IStream_Release(pis);
/* /*
* Invalidate the property by zeroing it's name member. * Invalidate the property by zeroing it's name member.
*/ */
...@@ -1689,7 +1742,6 @@ static HRESULT deleteStreamProperty( ...@@ -1689,7 +1742,6 @@ static HRESULT deleteStreamProperty(
* Here we should re-read the property so we get the updated pointer * Here we should re-read the property so we get the updated pointer
* but since we are here to zap it, I don't do it... * but since we are here to zap it, I don't do it...
*/ */
StorageImpl_WriteProperty( StorageImpl_WriteProperty(
parentStorage->ancestorStorage, parentStorage->ancestorStorage,
indexOfPropertyToDelete, indexOfPropertyToDelete,
...@@ -1952,7 +2004,7 @@ HRESULT WINAPI StorageImpl_SetElementTimes( ...@@ -1952,7 +2004,7 @@ HRESULT WINAPI StorageImpl_SetElementTimes(
const FILETIME *patime, /* [in] */ const FILETIME *patime, /* [in] */
const FILETIME *pmtime) /* [in] */ const FILETIME *pmtime) /* [in] */
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -1964,7 +2016,7 @@ HRESULT WINAPI StorageImpl_SetStateBits( ...@@ -1964,7 +2016,7 @@ HRESULT WINAPI StorageImpl_SetStateBits(
DWORD grfStateBits,/* [in] */ DWORD grfStateBits,/* [in] */
DWORD grfMask) /* [in] */ DWORD grfMask) /* [in] */
{ {
FIXME(ole, "not implemented!\n"); FIXME(storage, "not implemented!\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -2159,6 +2211,8 @@ HRESULT StorageImpl_Construct( ...@@ -2159,6 +2211,8 @@ HRESULT StorageImpl_Construct(
void StorageImpl_Destroy( void StorageImpl_Destroy(
StorageImpl* This) StorageImpl* This)
{ {
TRACE(storage, "(%p)\n", This);
BlockChainStream_Destroy(This->smallBlockRootChain); BlockChainStream_Destroy(This->smallBlockRootChain);
BlockChainStream_Destroy(This->rootBlockChain); BlockChainStream_Destroy(This->rootBlockChain);
BlockChainStream_Destroy(This->smallBlockDepotChain); BlockChainStream_Destroy(This->smallBlockDepotChain);
...@@ -4004,12 +4058,17 @@ BOOL BlockChainStream_ReadAt(BlockChainStream* This, ...@@ -4004,12 +4058,17 @@ BOOL BlockChainStream_ReadAt(BlockChainStream* This,
BYTE* bufferWalker; BYTE* bufferWalker;
BYTE* bigBlockBuffer; BYTE* bigBlockBuffer;
if (This->lastBlockNoInSequence == 0xFFFFFFFF)
This->lastBlockNoInSequence = blockNoInSequence;
/* /*
* Find the first block in the stream that contains part of the buffer. * Find the first block in the stream that contains part of the buffer.
*/ */
if (blockNoInSequence > This->lastBlockNoInSequence) if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
(This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
(blockNoInSequence < This->lastBlockNoInSequence) )
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
else
{ {
ULONG temp = blockNoInSequence; ULONG temp = blockNoInSequence;
...@@ -4017,11 +4076,6 @@ BOOL BlockChainStream_ReadAt(BlockChainStream* This, ...@@ -4017,11 +4076,6 @@ BOOL BlockChainStream_ReadAt(BlockChainStream* This,
blockNoInSequence -= This->lastBlockNoInSequence; blockNoInSequence -= This->lastBlockNoInSequence;
This->lastBlockNoInSequence = temp; This->lastBlockNoInSequence = temp;
} }
else
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN)) while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
{ {
...@@ -4093,13 +4147,17 @@ BOOL BlockChainStream_WriteAt(BlockChainStream* This, ...@@ -4093,13 +4147,17 @@ BOOL BlockChainStream_WriteAt(BlockChainStream* This,
BYTE* bufferWalker; BYTE* bufferWalker;
BYTE* bigBlockBuffer; BYTE* bigBlockBuffer;
if (This->lastBlockNoInSequence == 0xFFFFFFFF)
This->lastBlockNoInSequence = blockNoInSequence;
/* /*
* Find the first block in the stream that contains part of the buffer. * Find the first block in the stream that contains part of the buffer.
*/ */
if (blockNoInSequence > This->lastBlockNoInSequence) if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
(This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
(blockNoInSequence < This->lastBlockNoInSequence) )
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
else
{ {
ULONG temp = blockNoInSequence; ULONG temp = blockNoInSequence;
...@@ -4107,11 +4165,6 @@ BOOL BlockChainStream_WriteAt(BlockChainStream* This, ...@@ -4107,11 +4165,6 @@ BOOL BlockChainStream_WriteAt(BlockChainStream* This,
blockNoInSequence -= This->lastBlockNoInSequence; blockNoInSequence -= This->lastBlockNoInSequence;
This->lastBlockNoInSequence = temp; This->lastBlockNoInSequence = temp;
} }
else
{
blockIndex = BlockChainStream_GetHeadOfChain(This);
This->lastBlockNoInSequence = blockNoInSequence;
}
while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN)) while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
{ {
...@@ -4175,6 +4228,12 @@ BOOL BlockChainStream_Shrink(BlockChainStream* This, ...@@ -4175,6 +4228,12 @@ BOOL BlockChainStream_Shrink(BlockChainStream* This,
ULONG count = 1; ULONG count = 1;
/* /*
* Reset the last accessed block cache.
*/
This->lastBlockNoInSequence = 0xFFFFFFFF;
This->lastBlockNoInSequenceIndex = BLOCK_END_OF_CHAIN;
/*
* Figure out how many blocks are needed to contain the new size * Figure out how many blocks are needed to contain the new size
*/ */
numBlocks = newSize.LowPart / This->parentStorage->bigBlockSize; numBlocks = newSize.LowPart / This->parentStorage->bigBlockSize;
...@@ -4306,26 +4365,29 @@ BOOL BlockChainStream_Enlarge(BlockChainStream* This, ...@@ -4306,26 +4365,29 @@ BOOL BlockChainStream_Enlarge(BlockChainStream* This,
/* /*
* Add new blocks to the chain * Add new blocks to the chain
*/ */
while (oldNumBlocks < newNumBlocks) if (oldNumBlocks < newNumBlocks)
{ {
blockIndex = StorageImpl_GetNextFreeBigBlock(This->parentStorage); while (oldNumBlocks < newNumBlocks)
{
blockIndex = StorageImpl_GetNextFreeBigBlock(This->parentStorage);
StorageImpl_SetNextBlockInChain( StorageImpl_SetNextBlockInChain(
This->parentStorage, This->parentStorage,
currentBlock, currentBlock,
blockIndex); blockIndex);
StorageImpl_SetNextBlockInChain( StorageImpl_SetNextBlockInChain(
This->parentStorage, This->parentStorage,
blockIndex, blockIndex,
BLOCK_END_OF_CHAIN); BLOCK_END_OF_CHAIN);
currentBlock = blockIndex; currentBlock = blockIndex;
oldNumBlocks++; oldNumBlocks++;
} }
This->tailIndex = blockIndex; This->tailIndex = blockIndex;
This->numBlocks = newNumBlocks; This->numBlocks = newNumBlocks;
}
return TRUE; return TRUE;
} }
...@@ -4902,7 +4964,7 @@ BOOL SmallBlockChainStream_Shrink( ...@@ -4902,7 +4964,7 @@ BOOL SmallBlockChainStream_Shrink(
{ {
ULONG blockIndex, extraBlock; ULONG blockIndex, extraBlock;
ULONG numBlocks; ULONG numBlocks;
ULONG count = 1; ULONG count = 0;
numBlocks = newSize.LowPart / This->parentStorage->smallBlockSize; numBlocks = newSize.LowPart / This->parentStorage->smallBlockSize;
...@@ -4920,14 +4982,40 @@ BOOL SmallBlockChainStream_Shrink( ...@@ -4920,14 +4982,40 @@ BOOL SmallBlockChainStream_Shrink(
count++; count++;
} }
/* Get the next block before marking the new end */ /*
extraBlock = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex); * If the count is 0, we have a special case, the head of the chain was
* just freed.
*/
if (count == 0)
{
StgProperty chainProp;
/* Mark the new end of chain */ StorageImpl_ReadProperty(This->parentStorage,
SmallBlockChainStream_SetNextBlockInChain( This->ownerPropertyIndex,
This, &chainProp);
blockIndex,
BLOCK_END_OF_CHAIN); chainProp.startingBlock = BLOCK_END_OF_CHAIN;
StorageImpl_WriteProperty(This->parentStorage,
This->ownerPropertyIndex,
&chainProp);
/*
* We start freeing the chain at the head block.
*/
extraBlock = blockIndex;
}
else
{
/* Get the next block before marking the new end */
extraBlock = SmallBlockChainStream_GetNextBlockInChain(This, blockIndex);
/* Mark the new end of chain */
SmallBlockChainStream_SetNextBlockInChain(
This,
blockIndex,
BLOCK_END_OF_CHAIN);
}
/* /*
* Mark the extra blocks as free * Mark the extra blocks as free
...@@ -4962,6 +5050,7 @@ BOOL SmallBlockChainStream_Enlarge( ...@@ -4962,6 +5050,7 @@ BOOL SmallBlockChainStream_Enlarge(
*/ */
if (blockIndex == BLOCK_END_OF_CHAIN) if (blockIndex == BLOCK_END_OF_CHAIN)
{ {
StgProperty chainProp; StgProperty chainProp;
StorageImpl_ReadProperty(This->parentStorage, This->ownerPropertyIndex, StorageImpl_ReadProperty(This->parentStorage, This->ownerPropertyIndex,
...@@ -5108,6 +5197,10 @@ HRESULT WINAPI StgCreateDocfile( ...@@ -5108,6 +5197,10 @@ HRESULT WINAPI StgCreateDocfile(
DWORD fileAttributes; DWORD fileAttributes;
WCHAR tempFileName[MAX_PATH]; WCHAR tempFileName[MAX_PATH];
TRACE(storage, "(%s, %lx, %ld, %p)\n",
debugstr_w(pwcsName), grfMode,
reserved, ppstgOpen);
/* /*
* Validate the parameters * Validate the parameters
*/ */
...@@ -5153,7 +5246,7 @@ HRESULT WINAPI StgCreateDocfile( ...@@ -5153,7 +5246,7 @@ HRESULT WINAPI StgCreateDocfile(
fileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS; fileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS;
if (grfMode & STGM_TRANSACTED) if (grfMode & STGM_TRANSACTED)
FIXME(ole, "Transacted mode not implemented.\n"); FIXME(storage, "Transacted mode not implemented.\n");
/* /*
* Initialize the "out" parameter. * Initialize the "out" parameter.
...@@ -5220,6 +5313,10 @@ HRESULT WINAPI StgOpenStorage( ...@@ -5220,6 +5313,10 @@ HRESULT WINAPI StgOpenStorage(
DWORD shareMode; DWORD shareMode;
DWORD accessMode; DWORD accessMode;
TRACE(storage, "(%s, %p, %lx, %p, %ld, %p)\n",
debugstr_w(pwcsName), pstgPriority, grfMode,
snbExclude, reserved, ppstgOpen);
/* /*
* Perform a sanity check * Perform a sanity check
*/ */
...@@ -5313,7 +5410,7 @@ HRESULT WINAPI ReadClassStg(IStorage *pstg,CLSID *pclsid){ ...@@ -5313,7 +5410,7 @@ HRESULT WINAPI ReadClassStg(IStorage *pstg,CLSID *pclsid){
STATSTG pstatstg; STATSTG pstatstg;
HRESULT hRes; HRESULT hRes;
TRACE(ole,"()\n"); TRACE(storage,"()\n");
if(pclsid==NULL) if(pclsid==NULL)
return E_POINTER; return E_POINTER;
...@@ -5338,7 +5435,7 @@ HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvOb ...@@ -5338,7 +5435,7 @@ HRESULT WINAPI OleLoadFromStream(IStream *pStm,REFIID iidInterface,void** ppvOb
CLSID clsid; CLSID clsid;
HRESULT res; HRESULT res;
FIXME(ole,"(),stub!\n"); FIXME(storage,"(),stub!\n");
res=ReadClassStm(pStm,&clsid); res=ReadClassStm(pStm,&clsid);
...@@ -5365,7 +5462,7 @@ HRESULT WINAPI OleSaveToStream(IPersistStream *pPStm,IStream *pStm) ...@@ -5365,7 +5462,7 @@ HRESULT WINAPI OleSaveToStream(IPersistStream *pPStm,IStream *pStm)
CLSID clsid; CLSID clsid;
HRESULT res; HRESULT res;
TRACE(ole,"(%p,%p)\n",pPStm,pStm); TRACE(storage,"(%p,%p)\n",pPStm,pStm);
res=IPersistStream_GetClassID(pPStm,&clsid); res=IPersistStream_GetClassID(pPStm,&clsid);
...@@ -5555,11 +5652,11 @@ static DWORD GetCreationModeFromSTGM(DWORD stgm) ...@@ -5555,11 +5652,11 @@ static DWORD GetCreationModeFromSTGM(DWORD stgm)
if ( stgm & STGM_CREATE) if ( stgm & STGM_CREATE)
return CREATE_ALWAYS; return CREATE_ALWAYS;
if (stgm & STGM_CONVERT) { if (stgm & STGM_CONVERT) {
FIXME(ole, "STGM_CONVERT not implemented!\n"); FIXME(storage, "STGM_CONVERT not implemented!\n");
return CREATE_NEW; return CREATE_NEW;
} }
/* All other cases */ /* All other cases */
if (stgm & ~ (STGM_CREATE|STGM_CONVERT)) if (stgm & ~ (STGM_CREATE|STGM_CONVERT))
FIXME(ole,"unhandled storage mode : 0x%08lx\n",stgm & ~ (STGM_CREATE|STGM_CONVERT)); FIXME(storage,"unhandled storage mode : 0x%08lx\n",stgm & ~ (STGM_CREATE|STGM_CONVERT));
return CREATE_NEW; return CREATE_NEW;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment