Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
ec2edc7e
Commit
ec2edc7e
authored
May 02, 1999
by
Francis Beaudet
Committed by
Alexandre Julliard
May 02, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
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
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
282 additions
and
139 deletions
+282
-139
debugdefs.h
include/debugdefs.h
+35
-32
hglobalstream.c
ole/hglobalstream.c
+26
-7
stg_stream.c
ole/stg_stream.c
+37
-13
storage32.c
ole/storage32.c
+184
-87
No files found.
include/debugdefs.h
View file @
ec2edc7e
...
@@ -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 15
5
#define DEBUG_CHANNEL_COUNT 15
6
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"
,
...
...
ole/hglobalstream.c
View file @
ec2edc7e
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
#include "objbase.h"
#include "objbase.h"
DEFAULT_DEBUG_CHANNEL
(
ol
e
)
DEFAULT_DEBUG_CHANNEL
(
storag
e
)
/****************************************************************************
/****************************************************************************
* 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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"not implemented!
\n
"
);
return
E_NOTIMPL
;
return
E_NOTIMPL
;
}
}
ole/stg_stream.c
View file @
ec2edc7e
...
@@ -20,7 +20,7 @@
...
@@ -20,7 +20,7 @@
#include "storage32.h"
#include "storage32.h"
DEFAULT_DEBUG_CHANNEL
(
ol
e
)
DEFAULT_DEBUG_CHANNEL
(
storag
e
)
/*
/*
...
@@ -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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"not implemented!
\n
"
);
return
E_NOTIMPL
;
return
E_NOTIMPL
;
}
}
ole/storage32.c
View file @
ec2edc7e
...
@@ -27,7 +27,7 @@
...
@@ -27,7 +27,7 @@
#include "storage32.h"
#include "storage32.h"
#include "ole2.h"
#include "ole2.h"
DEFAULT_DEBUG_CHANNEL
(
ol
e
)
DEFAULT_DEBUG_CHANNEL
(
storag
e
)
#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
->
ancestorStorag
e
,
pwcsName
);
IStorage_DestroyElement
(
ifac
e
,
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 s
ource s
tream
*/
*/
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
(
ol
e
,
"unknown element type: %ld
\n
"
,
curElement
.
type
);
WARN
(
storag
e
,
"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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"(%ld): stub!
\n
"
,
grfCommitFlags
);
FIXME
(
storag
e
,
"(%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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"not implemented!
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"Transacted mode not implemented.
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"()
\n
"
);
TRACE
(
storag
e
,
"()
\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
(
ol
e
,
"(),stub!
\n
"
);
FIXME
(
storag
e
,
"(),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
(
ol
e
,
"(%p,%p)
\n
"
,
pPStm
,
pStm
);
TRACE
(
storag
e
,
"(%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
(
ol
e
,
"STGM_CONVERT not implemented!
\n
"
);
FIXME
(
storag
e
,
"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
(
ol
e
,
"unhandled storage mode : 0x%08lx
\n
"
,
stgm
&
~
(
STGM_CREATE
|
STGM_CONVERT
));
FIXME
(
storag
e
,
"unhandled storage mode : 0x%08lx
\n
"
,
stgm
&
~
(
STGM_CREATE
|
STGM_CONVERT
));
return
CREATE_NEW
;
return
CREATE_NEW
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment