132 Commits

Author SHA1 Message Date
Vincent Povirk
9cf835a947 ole32: Use grfLocksSupported to decide when LockRegion is implemented. 2015-07-07 16:52:21 +09:00
Francois Gouget
514345b401 ole32: Make some storage32 functions static. 2015-05-04 15:07:39 +09:00
Francois Gouget
356748e6bc ole32: Reorder storage32 functions to avoid forward declarations. 2015-05-04 15:07:35 +09:00
Francois Gouget
58e47c612f ole32: Fix some storage32 comments. 2015-05-04 15:06:53 +09:00
Vincent Povirk
c8791edbdf ole32: Don't use real synchronous locks for storage synchronization. 2015-03-11 12:45:38 +09:00
Vincent Povirk
06b735ae76 ole32: Test the entire range lock block for synchronization. 2015-03-11 12:45:33 +09:00
Nikolay Sivov
73419dc484 ole32: Return END_OF_CHAIN for chains starting with special sector values. 2014-12-29 22:20:29 +01:00
Frédéric Delanoy
2ab8729020 Assorted spelling/grammar fixes. 2014-06-20 12:19:31 +02:00
Vincent Povirk
8107955273 ole32: Support storage files larger than 4 GB. 2014-06-12 13:19:04 +02:00
Vincent Povirk
77e3de5828 ole32: Use a snapshot file when sharing storages for writing. 2014-05-21 10:19:51 +02:00
Vincent Povirk
b3e26be0cb ole32: STGM_NOSNAPSHOT implies deny write. 2014-05-12 10:48:14 +02:00
Vincent Povirk
cf75c5368b ole32: Use real blocking operations for storage locking when possible. 2014-05-09 14:16:12 +02:00
Vincent Povirk
4f0d36d9a0 ole32: Initial implementation of transaction locking. 2014-05-05 10:53:41 +02:00
Vincent Povirk
a60d41d70a ole32: Use symbolic names for range lock offsets. 2014-05-05 10:53:27 +02:00
Vincent Povirk
65887802c5 ole32: Initial storage file locking implementation. 2014-04-29 11:26:51 +02:00
Frédéric Delanoy
37abf45e6c ole32: Use BOOL type where appropriate. 2013-11-20 11:25:55 +01:00
Frédéric Delanoy
4bb61ec0df ole32: Use BOOL type where appropriate. 2013-10-15 14:28:20 +02:00
Nikolay Sivov
5132f60298 ole32: Store SMWR storage instance role separately. 2013-04-19 16:16:17 +02:00
Nikolay Sivov
a06db6cce5 ole32: Stub for IDirectWriterLock. 2013-04-18 17:00:17 +02:00
Nikolay Sivov
52ce30d242 ole32: Make ole stream creation helper capable of handling flags data. 2012-07-17 12:50:19 +02:00
Nikolay Sivov
ac032593c0 ole32: COM cleanup of IPropertySetStorage interface. 2012-07-16 15:21:44 +02:00
Nikolay Sivov
0c658860b1 ole32: COM cleanup for IStorage interface of base storage implementation. 2012-07-13 10:29:13 -05:00
Nikolay Sivov
ea196ef0eb ole32: COM cleanup of storage IStream implementation. 2012-07-13 10:28:15 -05:00
Marcus Meissner
14c4ef3fdd ole32: Mark internal symbols has hidden visibility. 2011-04-25 13:02:01 +02:00
David Hedberg
41193de135 ole32: Avoid unneccessary stream conversion.
Truncating a large stream to less than 0x1000 bytes would cause an
unnecessarily expensive conversion.
2010-11-23 13:17:06 +01:00
Vincent Povirk
e883aeb394 ole32: Cache the contents of one extended big block depot block. 2010-11-16 21:54:18 +01:00
Vincent Povirk
8d101b269d ole32: Cache all extended big block depot locations. 2010-11-04 11:55:48 +01:00
Vincent Povirk
89646084ba ole32: Cache data and block locations in BigBlockStream objects. 2010-08-26 13:59:31 +02:00
Vincent Povirk
5116b979b2 ole32: Flush the ILockBytes object of a storage on commit and final release.
Some ILockBytes objects will not really write changes until their Flush
method is called. Also, further optimizations to the storage implementation
will involve caching writes, which will have to be flushed at times.
2010-07-19 14:38:16 +02:00
Vincent Povirk
b7dbfcbd48 ole32: Remove an unused variable. 2010-07-19 14:38:16 +02:00
Vincent Povirk
d0e6e4aa82 ole32: Use ILockBytes_Stat to get the filename of a storage. 2010-07-19 14:38:16 +02:00
Vincent Povirk
14f8f9d5b5 ole32: Remove the BigBlockFile abstraction and always use an ILockBytes. 2010-07-19 14:38:16 +02:00
Vincent Povirk
7f3c92b2a0 ole32: Update storage header saving code based on the latest MS spec.
These fields are needed for the MS storage implementation to load
files that were created by Wine with a block size of 4096.
2010-07-19 14:38:16 +02:00
Vincent Povirk
e40afcb2b6 ole32: Always move unmodified streams instead of copying on commit. 2010-05-06 17:55:43 +02:00
Vincent Povirk
42550953a6 ole32: Store the location of all blocks in a big block chain in memory.
A big block chain is a linked list, and we pretty much need random
access to them. This should theoretically make accessing a random
point in the chain O(log2 n) instead of O(n) (with disk access scaling
based on the size of the read/write, not its location). It
theoretically takes O(n) memory based on the size, but it can do
better if the chain isn't very fragmented (which I believe will
generally be the case for long chains). It also involves fetching all
the big block locations when we open the chain, but we already do that
anyway (and it should be faster to read it all in one go than
piecemeal).
2010-05-05 10:41:57 +02:00
Vincent Povirk
0b149df987 ole32: Create storage files with 4096-byte blocks when asked. 2010-04-13 11:30:48 +02:00
Vincent Povirk
49a817c064 ole32: Check the small block size limit of storage files.
This value is stored in the storage file header. We currently hard-code it to
0x1000. I don't expect to see files in the wild with other values, but
according to MS this is a valid configuration. For now, just fail if we see
another value.

I've also upgraded the message for unexpected values in storage file headers
to a fixme, since they are valid according to MS.
2010-03-22 10:47:58 +01:00
Vincent Povirk
e05b8416b8 ole32: Track the lowest possibly-free small block in storage files.
This makes creating small block chains O(n) instead of O(n**2) because we
don't have to keep rechecking the first blocks in the file.
2010-03-22 10:47:42 +01:00
Vincent Povirk
5ceb003a24 ole32: Remove knowledge of block sizes from the BigBlockFile object.
We can't determine the correct block size until we read the header, and we
can't create the BigBlockFile until we know the correct block size. To
solve this dilemma, have StorageImpl calculate the file size it needs instead
of asking the BigBlockFile to "ensure a big block exists".
2010-03-15 13:46:48 +01:00
Vincent Povirk
926669741e ole32: Remove the NUM_BLOCKS_PER_DEPOT_BLOCK define.
This should always be calculated based on the big block size.
2010-03-15 13:46:31 +01:00
Vincent Povirk
7b43123762 ole32: Remove the BIG_BLOCK_SIZE define.
Big block sizes can be 512 or 4096, so we define arrays that are large
enough in either case.
2010-03-15 13:46:19 +01:00
Vincent Povirk
7f3211f383 ole32: Don't treat the header as a big block in StorageImpl_LoadFileHeader.
The header is always 512 bytes, regardless of the big block size.
2010-03-15 13:45:30 +01:00
Vincent Povirk
393c5af205 ole32: Add a cache for block chain streams in StorageImpl. 2009-12-16 12:24:27 +01:00
Vincent Povirk
d799f7e189 ole32: Add a stub transacted storage type.
TransactedSnapshotImpl acts as a proxy between the user and the storage
interfaces that modify the file directly (or another transacted storage).
Currently, it does not change the operations.
2009-12-11 12:16:26 +01:00
Vincent Povirk
42142200d5 ole32: Add Invalidate to the storage vtable. 2009-12-11 12:16:26 +01:00
Vincent Povirk
8b3ff9d179 ole32: Remove the ancestorStorage attribute. 2009-12-10 11:51:39 +01:00
Vincent Povirk
df0ef756b3 ole32: Add an attribute to StorageBaseImpl to track its reverted status. 2009-12-09 12:03:40 +01:00
Vincent Povirk
8518323e07 ole32: Don't track the stream size in storage stream objects.
We can't do this safely when there are multiple objects for a single stream.
2009-12-09 12:03:18 +01:00
Vincent Povirk
6d06c43e53 ole32: Use the storage vtable to resize streams. 2009-12-09 12:03:10 +01:00
Vincent Povirk
1d4c698ef3 ole32: Use the storage vtable to write to streams. 2009-12-09 12:02:59 +01:00