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
c29f3dff8c
ole32: Accept STGM_DIRECT_SWMR mode.
2013-04-18 17:00:12 +02:00
Andrew Talbot
faaeeea937
ole32: Avoid signed-unsigned integer comparisons.
2013-02-22 10:20:57 +01:00
Hans Leidekker
7895eae15b
ole32: Convert the remaining RegCreateKey and RegOpenKey calls to the wrappers.
2012-11-26 16:59:22 +01:00
Frédéric Delanoy
3cdd1abd09
ole32: Avoid erroneously freeing a variable in ReadFmtUserTypeStg.
2012-11-12 12:14:48 +01:00
Frédéric Delanoy
780228b6ca
ole32: Fix some leaks (coverity).
2012-11-09 11:56:18 +01:00
André Hentschel
fbe682a22a
ole32: Don't leak memory allocated by ProgIDFromCLSID (coverity).
2012-10-29 10:40:32 +01:00
Nikolay Sivov
53dd90aeb3
ole32: Give names to 1Ole stream header fields.
2012-07-18 11:14:18 +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
88e6c8175b
ole32: Use interface macros to call methods.
2012-07-17 12:50:18 +02:00
Nikolay Sivov
3956296128
ole32: Implement SetConvertStg().
2012-07-16 15:21:45 +02:00
Nikolay Sivov
a3a97558de
ole32: No need to test for null implementation pointer in methods.
2012-07-16 15:21:44 +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
08303391e9
ole32: Simplify storage root entry name initialization.
2012-07-13 10:28:57 -05:00
Nikolay Sivov
7b373edb81
ole32: Implement GetConvertStg().
2012-07-13 10:28:42 -05:00
Nikolay Sivov
ea196ef0eb
ole32: COM cleanup of storage IStream implementation.
2012-07-13 10:28:15 -05:00
Bruno Jesus
2cd2628c7b
ole32: Make sure StgIsStorageILockBytes tests real data.
2012-04-16 17:49:30 +02:00
Andrew Talbot
85fc5a3ae9
ole32: Remove unneeded address-of operators from array names.
2011-10-31 23:54:07 +01:00
Vincent Povirk
cb9e572611
ole32: Discard existing data when creating a new storage on an ILockBytes.
2011-09-13 09:20:29 +02:00
Vincent Povirk
c72ecb1de6
ole32: Avoid opening source storage in IStorage::CopyTo.
2011-06-03 17:37:09 +02:00
Alexandre Julliard
7efe6d9895
ole32: Delete the transacted storage scratch file on release.
2011-05-26 13:27:41 +02:00
Michael Stefaniuc
4ff5c02098
ole32: COM cleanup for the IEnumSTATSTG iface.
2011-01-04 11:14:25 +01: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
Andrew Bogott
42cd791c4d
ole32: Use default values if options passed to StgCreateStorageEx are NULL.
2010-11-18 12:52:38 +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
2752c3bcd0
ole32: Don't fail if the file ends during a big block.
...
Apparently, it's valid for the last block in a file to be incomplete.
2010-09-08 13:30:46 +02:00
Vincent Povirk
89646084ba
ole32: Cache data and block locations in BigBlockStream objects.
2010-08-26 13:59:31 +02:00
Vincent Povirk
101de22a1a
ole32: Flush before returning from any storage API call that writes.
2010-08-26 13:59:28 +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
9c95761d9e
ole32: Always check the size of the small block root chain.
...
In some storage files, the size of this stream is not a multiple of the big
block size. This means that we may need to enlarge the stream even when we
don't really have to allocate more space for it.
2010-05-28 16:22:24 +02:00
Vincent Povirk
57ddceea34
ole32: Use a temporary variable in TransactedSnapshotImpl_EnsureReadEntry.
...
CreateStubEntry can change the value of This->entries, in which case the
assignment can go to the wrong place. So instead, assign to a temporary
variable, and copy the data back after all CreateStubEntry calls are finished.
2010-05-13 11:51:07 +02:00
Marcus Meissner
bf1e9a2e93
ole32: Fixed 2 uninitialized variable use (Coverity).
2010-05-10 10:03:43 +02:00
Vincent Povirk
dbf123ba0d
ole32: Fix reads past the end of streams.
2010-05-07 12:46:50 +02:00
Vincent Povirk
4ad114cfae
ole32: Use the cached information in BlockChainStream_GetCount.
2010-05-07 12:46:39 +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
d07a4868a1
ole32: Rewrite transacted storage to be more lazy.
...
When creating a new transacted storage object (or reverting an
existing one), rather than copy the original storage, we simply create
a "stub directory entry" for the root. As stub entries are accessed,
we fill in their data from the parent and create new stubs for any
linked entries. The streams have copy on write semantics - reads are
from the original entry until a change is made, then we make a copy in
the scratch file.
When committing transacted storages, we have to create a new tree with
the new data so that the storage entry can be modified in one step,
but unmodified sections of the tree can now be shared between the new
tree and the old. An entry can be shared if it and all entries
reachable from it are unmodified. In the trivial case where nothing
has been modified, we don't have to make a new tree at all.
2010-05-06 17:55:34 +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
93cc582a8d
ole32: Remove some assumptions about the internals of BlockChainStream.
2010-05-05 10:41:26 +02:00
Vincent Povirk
0b149df987
ole32: Create storage files with 4096-byte blocks when asked.
2010-04-13 11:30:48 +02:00
Konstantin Kondratyuk
eab89da812
ole32: Add missed initialization of virtual function table.
2010-03-29 15:50:22 +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
93c2256cff
ole32: Allow storage files with a block size of 4096 to open.
2010-03-15 13:46:59 +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
4b7e7bd77f
ole32: Fix the big block offset calculation.
...
Use the actual big block size from the open storage file. Also, remove a
special case that was only used for reading/writing the header.
2010-03-15 13:45:55 +01:00
Vincent Povirk
f3db25fc25
ole32: Don't treat the header as a big block in StorageImpl_SaveFileHeader.
2010-03-15 13:45:36 +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
8d58a91fa3
ole32: Allow CopyTo to succeed in spite of already open source streams.
2010-03-15 13:17:34 +01:00
Vincent Povirk
24ff704835
ole32: Clear the sibling links when reinserting a renamed element.
2010-03-02 16:44:12 +01:00
Vincent Povirk
d420a858da
ole32: Add error checking to StorageBaseImpl_CreateStorage.
2010-02-15 12:20:01 +01:00
Vincent Povirk
1fab6e3515
ole32: Add error checking to StorageBaseImpl_CreateStream.
2010-02-15 12:20:00 +01:00
Vincent Povirk
35b800dc92
ole32: Only warn about storage share mode once.
2010-02-12 11:54:36 +01:00
Vincent Povirk
da250c9afe
ole32: IStorage_Revert has no effect for non-transacted storages.
2010-01-25 12:58:22 +01:00
Andrew Eikum
7fe78c14e9
ole32: Downgrade StgIsStorageFile debug info from WARN to TRACE.
2010-01-07 09:25:51 +01:00
Vincent Povirk
0debd2fef4
ole32: Remove fixme for transacted mode.
2010-01-04 11:41:28 +01:00
Alexander Kochetkov
56bc0515c2
ole32/storage32: Fix return value for invalid access mode in OpenStream.
2009-12-30 16:13:57 +01:00
Vincent Povirk
ffc4a49bcb
ole32: Always allow changes to read-only transacted storages.
...
The only time the write permissions of transacted storages matter is when
committing.
2009-12-28 11:54:49 +01:00
Vincent Povirk
b3511ebb70
ole32: Reread the stream entry after setting the size in StreamWriteAt.
...
In simple mode, StreamWriteAt would assume that StreamSetSize uses the size
it asks for, but in some cases the size would be pushed above the small block
limit. StreamWriteAt would then attempt to write using a small block chain,
even though a big block chain was created.
2009-12-21 15:01:24 +01:00
Vincent Povirk
fc50ff07d6
ole32: Store the most recent item name in IEnumSTATSTG instead of a stack.
2009-12-21 15:01:24 +01:00
Vincent Povirk
4492850200
ole32: Make IEnumSTATSTG functions fail when the parent is invalid.
2009-12-21 15:01:23 +01:00
Vincent Povirk
5d9fd1b716
ole32: Compare upper character values directly in entryNameCmp.
...
The sort function used by native is not entirely consistent with lstrcmpiW,
even on Windows.
2009-12-18 11:43:34 +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
3ac34f7416
ole32: Properly free temporary objects when StorageBaseImpl_CopyTo fails.
2009-12-14 12:06:35 +01:00
Vincent Povirk
6afe24c38d
ole32: Remove an unnecessary special case in StorageBaseImpl_CopyTo.
...
Opening a storage when it has already been opened now fails with
STG_E_ACCESSDENIED. If we attempt to copy a storage to its own child, this
will happen during the copy.
2009-12-14 12:06:25 +01:00
Vincent Povirk
0ad48797f8
ole32: Fix a memory leak in StorageBaseImpl_CopyTo.
...
Spotted by valgrind.
2009-12-14 12:06:17 +01:00
Vincent Povirk
3ff33e9303
ole32: Implement Revert for transacted storage objects.
2009-12-11 12:16:26 +01:00
Vincent Povirk
226363f5df
ole32: Implement transacted storage.
2009-12-11 12:16:26 +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
75fe621192
ole32: Create internal storage objects with a refcount of 1.
...
For consistency with StorageImpl_Construct.
2009-12-11 12:16:25 +01:00
Vincent Povirk
8b3ff9d179
ole32: Remove the ancestorStorage attribute.
2009-12-10 11:51:39 +01:00
Vincent Povirk
5d39c31bff
ole32: Make IEnumSTATSTGImpl reference the parent storage.
2009-12-10 11:51:29 +01:00
Vincent Povirk
43184aaf52
ole32: Make findElement take a StorageBaseImpl.
2009-12-10 11:51:21 +01:00
Vincent Povirk
55b3a6e59f
ole32: Don't use ancestorStorage to decide if a storage is transacted.
2009-12-10 11:51:10 +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
5b79c5a5e4
ole32: Store the parent of internal storage objects.
2009-12-09 12:03:30 +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
Vincent Povirk
62e54bacba
ole32: Use the storage vtable to read streams.
2009-12-08 12:35:33 +01:00
Vincent Povirk
ee39a21d2b
ole32: Add DestroyDirEntry to the storage vtable.
2009-12-08 12:35:17 +01:00
Vincent Povirk
f43e013f73
ole32: Take a StorageBaseImpl in removeFromTree.
2009-12-08 12:35:08 +01:00
Vincent Povirk
0425ed1d38
ole32: Take a StorageBaseImpl in insertIntoTree.
2009-12-08 12:35:00 +01:00
Vincent Povirk
9300a92ccc
ole32: Change the base IStorage filename to a pointer type.
...
The maximum size of the name returned by Stat() on a top-level storage has
nothing to do with DIRENTRY_NAME_BUFFER_LEN. Windows can return longer names
and probably has a limit of MAX_PATH. Also, Stat always returns an absolute
pathname, so we don't need a special case in StgOpenStorage.
2009-12-08 12:34:47 +01:00
Nathan Gallaher
de239d86fd
ole32: Fix invalid memory access in storage32.
2009-12-07 14:53:31 +01:00
Vincent Povirk
f3d194b391
ole32: Add ReadDirEntry to the storage vtable.
2009-12-07 09:49:05 +01:00
Vincent Povirk
176cdfc75e
ole32: Add WriteDirEntry to the storage vtable.
2009-12-07 09:49:05 +01:00
Vincent Povirk
8a332db2c5
ole32: Change ReadDirEntry return type to HRESULT.
2009-12-07 09:49:05 +01:00
Vincent Povirk
df13a1d1fe
ole32: Change WriteDirEntry return type to HRESULT.
2009-12-07 09:49:05 +01:00
Vincent Povirk
382ffed003
ole32: Make CreateDirEntry a virtual method.
2009-12-07 09:49:05 +01:00
Vincent Povirk
cc98619ca4
ole32: Add an internal vtable to StorageBaseImpl objects.
2009-12-04 14:34:59 +01:00