[prev in list] [next in list] [prev in thread] [next in thread]
List: poi-user
Subject: Re: getStorageClsid()
From: "Andrew C. Oliver" <acoliver () apache ! org>
Date: 2006-03-21 22:12:25
Message-ID: 44207A49.7080502 () apache ! org
[Download RAW message or body]
Marc (who wrote most of POIFS) said he didn't know what the clsid was so
he just set it to 0.
jwang@dicarta.com wrote:
> The sequence, as far as I can tell, is:
>
> 1) POIFSFileSystem(stream) is called
>
> 2) POIFSFileSystem() is the first call, which sets the property table to
> be new PropertyTable() and root to be null.
> Nothing else of relevance to the current issue, until processProperties,
> with the directory as null
>
> 3)Inside processProperties, the first check for the parent, results it
> being set as getRoot().
>
> 4)In getRoot(), since root is still null, it creates a root from the
> property table, so we can translate how _root got instantiated to:
>
> new DirectoryNode(new PropertyTable().getRoot(), this, null)
>
> in EntryNode (super of Directory Node) the property is assigned, which
> means it is equivalent to new PropertyTable().getRoot()
>
> 5) getStorageClsid() is equivalent to getProperty().getStorageClsid(),
> which means that it is equivalent to (new
> PropertyTable()).getRoot().getStorageClsid()
>
> 6) This can be substituted with (new RootProperty()).getStorageClsid()
> because root property is only ever assigned once in PropertyTable().
>
> 7) in RootProperty, nothing overrides the determination of cls id, so,
> going through a bunch of supers, we get Property() as the one
> responsible for creating it.
>
> 8) since _raw_data is of type new byte[], the assignment to
> _storage_clsid is new ClassID(new byte[], some default offset). Since
> the byte array is empty, the stored class id is therefore all 0s.
>
> In other words,
> new POIFSFileSystem(stream).getRoot().getStorageClsid().toString()
> should always return a bunch of 0s.
>
> Note that there is a PropertyTable(start, blockList) that appears to
> generate better stuff, but that is a local variable in
> POIFSFileSystem(InputStream) perhaps the bug is that it should be
> assigned to the class variable instead?
>
> Jeff Wang
> diCarta, Inc.
>
>
> -----Original Message-----
> From: Daniel Noll [mailto:daniel@nuix.com.au]
> Sent: Monday, March 20, 2006 7:46 PM
> To: POI Users List
> Subject: Re: getStorageClsid()
>
> Daniel Noll wrote:
>
>>I'm fairly certain this is a bug because I've traced the creation of
>
> the
>
>>properties in a debugger, and the root property does have the correct
>>ClassID. At some point in the POIFSFileSystem constructor, it is then
>
>
>>throwing away the class ID, but I can't see exactly where it's being
>>thrown to.
>
>
> A reasonable workaround seems to be adding this at the bottom of the
> (second) POIFSFileSystem constructor:
>
> getRoot().setStorageClsid(properties.getRoot().getStorageClsid());
>
> This doesn't fix the underlying problem which is that the entire root is
>
> somehow being clobbered somewhere, but it does at least make the one
> method I do need to call work as expected.
>
> Daniel
>
---------------------------------------------------------------------
To unsubscribe, e-mail: poi-user-unsubscribe@jakarta.apache.org
Mailing List: http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta Poi Project: http://jakarta.apache.org/poi/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic