]> source.dussan.org Git - poi.git/commitdiff
- HPSF documentation added.
authorRainer Klute <klute@apache.org>
Sat, 2 Mar 2002 15:54:08 +0000 (15:54 +0000)
committerRainer Klute <klute@apache.org>
Sat, 2 Mar 2002 15:54:08 +0000 (15:54 +0000)
- Stylesheets modified to support table heads.
- Document DTD modified to support blocks in table cells and list items.
- hpsf/book.xml added to sitemap (whatever that might be good for).

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352128 13f79535-47bb-0310-9956-ffa450edef68

13 files changed:
build/jakarta-poi/docs/changes.html
build/jakarta-poi/docs/hpsf/how-to.html
build/jakarta-poi/docs/hpsf/index.html
build/jakarta-poi/docs/hpsf/internals.html
build/jakarta-poi/docs/hpsf/todo.html [new file with mode: 0644]
src/documentation/sitemap.xmap
src/documentation/stylesheets/docbook2body.xsl
src/documentation/stylesheets/document2docbook.xsl
src/documentation/xdocs/dtd/document-v10.dtd
src/documentation/xdocs/hpsf/book.xml
src/documentation/xdocs/hpsf/index.xml
src/documentation/xdocs/hpsf/internals.xml
src/documentation/xdocs/hpsf/todo.xml [new file with mode: 0644]

index 56044ad3da3d57ceb13541ce2332209c07bb2b85..011d85827d4f0873d9e89fa89506f61c601d2fcc 100644 (file)
 <div align="right">
 <table cellspacing="0" cellpadding="2" border="0" width="100%">
 <tr>
-<td bgcolor="#525D76"><font color="#ffffff" size="+1"><font face="Arial,sans-serif"><b> 1.1-dev (March 1 2002)</b></font></font></td>
+<td bgcolor="#525D76"><font color="#ffffff" size="+1"><font face="Arial,sans-serif"><b> 1.1-dev (March 2 2002)</b></font></font></td>
 </tr>
 <tr>
 <td>
index 2816742dbf0fd906555bf8a14a974ff4862184eb..2987064335ecfa3e099ffa8ba73bafccfbe9a99b 100644 (file)
 <li>
 <a href="../index.html"><font size="-1">Main</font></a>
 </li>
+</ul>
+</font>
+<br>
+<font size="+1" color="#000000">HPSF</font><font size="-1">
+<ul>
+<li>
+<a href="index.html"><font size="-1">Overview</font></a>
+</li>
 <li>
 <a href="how-to.html"><font size="-1">How To</font></a>
 </li>
 <li>
 <a href="internals.html"><font size="-1">Internals</font></a>
 </li>
+<li>
+<a href="todo.html"><font size="-1">To Do</font></a>
+</li>
 </ul>
 </font>
 <br>
index 2419c1cbc1ab4f346a3b66eaa28956303da6b911..73a59fd7415ef4dd5d9e60e3b50c1d7fde918218 100644 (file)
 <li>
 <a href="../index.html"><font size="-1">Main</font></a>
 </li>
+</ul>
+</font>
+<br>
+<font size="+1" color="#000000">HPSF</font><font size="-1">
+<ul>
+<li>
+<a href="index.html"><font size="-1">Overview</font></a>
+</li>
 <li>
 <a href="how-to.html"><font size="-1">How To</font></a>
 </li>
 <li>
 <a href="internals.html"><font size="-1">Internals</font></a>
 </li>
+<li>
+<a href="todo.html"><font size="-1">To Do</font></a>
+</li>
 </ul>
 </font>
 <br>
 <tr>
 <td>
 <br>
-      
-<p align="justify">TODO: This documentation is still to be written.</p>
-    
+   
+<p align="justify">Microsoft applications like "Word" or "Excel" offer the user to
+    describe his document by properties like "title", "category" and so
+    on. The application adds further information by itself: last
+    author, creation date etc. Internally these properties are stored in
+    so-called <em>property set streams</em>. A property set stream is a
+    separate document within a <a href="../poifs/index.html">POI
+     filesystem</a>. HPSF is POI's pure-Java implementation to read (and in
+    future to write) property set streams.</p>
+
+   
+<p align="justify">Once the <a href="how-to.html">HPSF HOWTO</a> is ready, it will
+    describe what a Java application should do to read a property set using
+    HPSF and retrieve the information it needs. Currently this is explained
+    in the javadocs of the <code>org.apache.poi.hpsf</code> package only.</p>
+
+   
+<p align="justify">HPSF supports OLE2 property set streams in general, not only the special
+    case of document properties mentioned above. The <a href="internals.html">HPSF description</a> describes the internal
+    structure of  property set streams.</p>
+  
 </td>
 </tr>
 </table>
index e761c3ac9cedd01f00d1f64243028d99deb1e092..c99ef8784a0336f77e6c8580bdad308a5e50eaf1 100644 (file)
@@ -1,7 +1,7 @@
 <html>
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>HPSF Internals</title>
+<title>HPSF Internals: The Horrible Property Set Format</title>
 </head>
 <body bgcolor="#ffffff" marginheight="4" marginwidth="4" leftmargin="4" topmargin="4" alink="#023264" vlink="#023264" link="#525D76" text="#000000">
 <table border="0" cellpadding="0" cellspacing="0" width="100%">
 <li>
 <a href="../index.html"><font size="-1">Main</font></a>
 </li>
+</ul>
+</font>
+<br>
+<font size="+1" color="#000000">HPSF</font><font size="-1">
+<ul>
+<li>
+<a href="index.html"><font size="-1">Overview</font></a>
+</li>
 <li>
 <a href="how-to.html"><font size="-1">How To</font></a>
 </li>
 <li>
 <a href="internals.html"><font size="-1">Internals</font></a>
 </li>
+<li>
+<a href="todo.html"><font size="-1">To Do</font></a>
+</li>
 </ul>
 </font>
 <br>
 <br>
 </font></td><td align="left" valign="top" width="*">
-<title>HPSF Internals</title>
+<title>HPSF Internals: The Horrible Property Set Format</title>
 <center>
 <table width="80%">
 <tr>
 <td bgcolor="#F3DD61"><font face="Arial,sans-serif" size="+1">
 <center>
-<b>HPSF Internals</b>
+<b>HPSF Internals: The Horrible Property Set Format</b>
 </center>
 </font></td>
 </tr>
 <tr>
 <td>
 <br>
+
+    
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>Introduction</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+    
+<p align="justify">A Microsoft Office document is internally organized like a filesystem
+     with directory and files. Microsoft calls these files
+     <em>streams</em>. A document can have properties attached to it,
+     like author, title, number of words etc. These metadata are not  stored in
+     the main stream of, say, a Word document, but instead in a dedicated
+     stream with a special format. Usually this stream's name is
+     <code>\005SummaryInformation</code>, where <code>\005</code> represents
+     the character with a decimal value of 5.</p>
+
+    
+<p align="justify">A single piece of information in the stream is called a
+     <em>property</em>, for example the document title. Each property
+     has an integral <em>ID</em> (e.g. 2 for title), a
+     <em>type</em> (telling that the title is a string of bytes) and a
+     <em>value</em> (what this is should be obvious). A stream
+     containing properties is called a
+     <em>property set stream</em>.</p>
+
+    
+<p align="justify">This document describes the internal structure of a property set stream,
+     i.e. the <em>Horrible Property Set Format (HDF)</em>.  It does not
+     describe how a Microsoft Office document is organized internally and how
+     to retrieve a stream from it. See the <a href="../POIFS/index.html">POIFS documentation</a> for
+     that kind of stuff.</p>
+
+    
+<p align="justify">The Horrible Property Set Format is not only used in the Summary
+     Information stream in the top-level document of a Microsoft Office
+     document. Often there is also a property set stream named
+     <code>\005DocumentSummaryInformation</code> with additional properties.
+     Embedded documents may have their own property set streams. You cannot
+     tell by a stream's name whether it is a property set stream or not.
+     Instead you have to open the stream and look at its bytes.</p>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+    
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>Data Types</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+    
+<p align="justify">Before delving into the details of the property set stream format we
+     have to have a short look at data types. Integral values are stored in the
+     so-called <em>little endian</em> format. In this format the bytes
+     that make out an integral value are stored in the "wrong" order. For
+     example, the decimal value 4660 is 0x1234 in the hexadecimal notation. If
+     you think this should be represented by a byte 0x12 followed by another
+     byte 0x34, you are right. This is called the <em>big endian</em>
+     format. In the little endian format, however, this order is reversed and
+     the low-value byte comes first: 0x3412.
+    </p>
+
+    
+<p align="justify">The following table gives an overview about some important data
+     types:</p>
+
+    
+<table width="100%" cellspacing="2" cellpadding="2" border="0">
+<tr>
+      
+<td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Name</p>
+      
+</font></td>
+      <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Length</p>
+      
+</font></td>
+      <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Example (Little Endian)</p>
+      
+</font></td>
+      <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Example (Big Endian)</p>
+      
+</font></td>
+     
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<em>Bytes</em>
+</p>
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">1 byte</p>
+      
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x12</code>
+</p>
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x12</code>
+</p>
+</font></td>
+     
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<em>Word</em>
+</p>
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">2 bytes</p>
+      
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x1234</code>
+</p>
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x3412</code>
+</p>
+</font></td>
+     
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<em>DWord</em>
+</p>
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">4 bytes</p>
+      
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x12345678</code>
+</p>
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x78563412</code>
+</p>
+</font></td>
+     
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">
+<em>ClassID</em>
+</p>
+       
+<p align="justify">A sequence of one DWord, two Words and eight Bytes</p>
+      
+</font></td>
+
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">16 bytes</p>
+      
+</font></td>
+
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">
+<code>0xE0859FF2F94F6810AB9108002B27B3D9</code> resp.
+       <code>E0859FF2-F94F-6810-AB-91-08-00-2B-27-B3-D9</code>
+</p>
+      
+</font></td>
+
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">
+<code>0xF29F85E04FF91068AB9108002B27B3D9</code> resp.
+       <code>F29F85E0-4FF9-1068-AB-91-08-00-2B-27-B3-D9</code>
+</p>
+      
+</font></td>
+     
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">The ClassID examples are given here in two different notations. The
+       second notation without the "0x" at the beginning and with dashes
+       inside shows the internal grouping into one DWord, two Words and eight
+       Bytes.</p>
+      
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">
+<em>Watch out:</em> Microsoft documentation and tools show class IDs
+       a little bit differently like
+       <code>F29F85E0-4FF9-1068-AB91-08002B27B3D9</code>.
+       However, that representation is (intentionally?) misleading with
+       respect to endianess.</p>
+      
+</font></td>
+     
+</tr>
+</table>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+   
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>HPSF Overview</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+    
+<p align="justify">A property set stream consists of three main parts:</p>
+
+    
+<ol>
+     
+<li>
+      
+<p align="justify">The <em>header</em> and</p>
+     
+</li>
+     
+<li>
+      
+<p align="justify">the <em>section(s)</em> containing the properties.</p>
+     
+</li>
+    
+</ol>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+   
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>The Header</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+    
+<p align="justify">The first bytes in a property set stream is the <em>header</em>.
+     It has a fixed length and looks like this:</p>
+
+    
+<table width="100%" cellspacing="2" cellpadding="2" border="0">
+<tr>
+       
+<td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Offset</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Type</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Contents</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Remarks</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">0</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Word</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0xFFFE</code>
+</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">If the first four bytes of a stream do not contain these values, the
+        stream is not a property set stream.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">2</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Word</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x0000</code>
+</p>
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">4</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Denotes the operating system and the OS version under which this
+        stream was created. The operating system ID is in the DWord's higher
+        word (after little endian decoding): <code>0x0000</code> for Win16,
+        <code>0x0001</code> for Macintosh and <code>0x0002</code> for Win32 - that's
+        all. The reader is most likely aware of the fact that there are some
+        more operating systems. However, Microsoft does not seem to know.</p>
+      
+</font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">8</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">ClassID</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<code>0x00000000000000000000000000000000</code>
+</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Most property set streams have this value but this is not
+        required.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">24</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">
+<code>0x01000000</code> or greater</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Section count. This field's value should be equal to 1 or greater.
+        Microsoft claims that this is a "reserved" field, but it seems to tell
+        how many sections (see below) are following in the stream. This would
+        really make sense because otherwise you could not know where and how
+        far you should read section data.</p>
+       
+</font></td>
+     
+</tr>
+</table>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+   
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>Section List</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+    
+<p align="justify">Following the header is the section list. This is an array of pairs each
+     consisting of a section format ID and an offset. This array has as many
+     pairs of ClassID and and DWord fields as the section count field in the
+     header says. The Summary Information stream contains a single section, the
+     Document Summary Information stream contains two.</p>
+
+    
+<table width="100%" cellspacing="2" cellpadding="2" border="0">
+<tr>
+       
+<td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Type</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Contents</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Remarks</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">ClassID</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Section format ID</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">
+<code>0xF29F85E04FF91068AB9108002B27B3D9</code> for the single section
+        in the Summary Information stream.</p>
+
+       
+<p align="justify">
+<code>0xD5CDD5022E9C101B939708002B2CF9AE</code> for the first
+        section in the Document Summary Information stream.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Offset</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">The number of bytes between the beginning of the stream and the
+        beginning of the section within the stream.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">ClassID</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Section format ID</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Offset</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
       
-<p align="justify">TODO: This documentation is still to be written. For the
-       time being, please see <a href="http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html">http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html</a>.</p>
+</tr>
+</table>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+   
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>Section</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+    
+<p align="justify">A section is divided into three parts: the section header (with the
+     section length and the number of properties in the section), the
+     properties list (with type and offset of each property), and the
+     properties themselves. Here are the details:</p>
+
     
+<table width="100%" cellspacing="2" cellpadding="2" border="0">
+<tr>
+       
+<td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">&nbsp;</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Type</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Contents</p>
+       
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+       
+<p align="justify">Remarks</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Section header</p>
+       
+</font></td>
+
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Length</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">The length of the section in bytes.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+      <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Property count</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">The number of properties in the section.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Properties list</p>
+       
+</font></td>
+
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Property ID</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">The property ID tells what the property means. For example, an ID of
+        <code>0x0002</code> in the Summary Information stands for the document's
+       title. See the <a href="#property_ids">Property IDs</a>
+        chapter below for more details.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Offset</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">The number of bytes between the beginning of the section and the
+        property.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Properties</p>
+       
+</font></td>
+
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">DWord</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Property type ("variant")</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">This is the property's data type, e.g. an integer value,  a byte
+        string or a Unicode string. See the
+        <a href="#property_types"><em>Property Types</em></a> chapter for
+        details!</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<em>Field length depends on the property type
+         ("variant")</em>
+</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">Property value</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">This field's length depends on the property's type. These are the
+        bytes that make out the DWord, the byte string or some other data of
+        fixed or variable length.</p>
+
+       
+<p align="justify">The  property value's length is always stored in an area which is a
+        multiple of 4 in length. If the property is shorter, e.g. a byte
+        string of 13 bytes, the remaining bytes are padded with <code>0x00</code>
+        bytes.</p>
+       
+</font></td>
+      
+</tr>
+<tr>
+      
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000"></font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+       
+<p align="justify">...</p>
+       
+</font></td>
+      
+</tr>
+</table>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+   
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>Property IDs</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+    
+<anchor id="property_ids"></anchor>
+
+    
+<p align="justify">As seen above, a section holds a property list: an array with property
+     IDs and offsets. The property ID gives each property a meaning. For
+     example, in the Summary Information stream the property ID 2 says that
+     this property is the document's title.</p>
+
+    
+<p align="justify">If you want to know a property ID's meaning, it is not sufficient to
+     know the ID itself. You must also know the
+     <em>section format ID</em>.  For example, in the Document Summary
+     Information stream the property ID 2 means not the document's title but
+     its category. Due to Microsoft's infinite wisdom the section format ID is
+     not part of the section. Thus if you have only a section without the
+     stream it is in, you cannot make any sense of the properties because you
+     do not know what they mean.</p>
+
+    
+<p align="justify">So each section format ID has its own name space of property IDs.
+     Microsoft defined some "well-known" property IDs for the Summary
+     Information and the Document Summary Information streams. You can extend
+     them by your own additional IDs. This will be described below.</p>
+
+    
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="98%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="-1"><font face="Arial,sans-serif"><b>Property IDs in The Summary Information Stream</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+     
+<p align="justify">The Summary Information stream has a single section with a section
+      format ID of <code>0xF29F85E04FF91068AB9108002B27B3D9</code>. The following
+      table defines the meaning of its property IDs. Each row associates a
+      property ID with a <em>name</em> and an <em>ID string</em>. (The property
+      <em>type</em> is just for informational purposes given here. As we have
+      seen above, the type is always given along with the value.)</p>
+
+     
+<p align="justify">The property <em>name</em> is a readable string which could be
+      displayed to the user. However, this string is useful only for users who
+      understand English. The property name does not help with other
+      languages.</p>
+
+     
+<p align="justify">The property <em>ID string</em> is about the same but looks more
+      technically and is nothing a user should bother with. You could the ID
+      string and map it to an appropriate display string in a particular
+      language.  Of course you could do that with the property ID as well and
+      with less overhead, but people (including software developers) tend to be
+      better in remembering symbolic constants than remembering numbers.</p>
+
+     
+<table width="100%" cellspacing="2" cellpadding="2" border="0">
+<tr>
+       
+<td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Property ID</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Property Name</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Property ID String</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Property Type</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">2</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Title</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_TITLE</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">3</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Subject</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_SUBJECT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">4</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Author</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_AUTHOR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">5</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Keywords</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_KEYWORDS</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">6</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Comments</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_COMMENTS</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">7</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Template</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_TEMPLATE</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">8</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Last Saved By</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_LASTAUTHOR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">9</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Revision Number</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_REVNUMBER</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">10</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Total Editing Time</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_EDITTIME</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_FILETIME</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">11</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Last Printed</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_LASTPRINTED</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_FILETIME</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">12</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Create Time/Date</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_CREATE_DTM</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_FILETIME</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">13</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Last Saved Time/Date</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_LASTSAVE_DTM</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_FILETIME</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">14</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Number of Pages</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_PAGECOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">15</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Number of Words</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_WORDCOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">16</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Number of Characters</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_CHARCOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">17</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Thumbnail</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_THUMBNAIL</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_CF</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">18</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Name of Creating Application</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_APPNAME</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">19</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Security</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_SECURITY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+      
+</tr>
+</table>
+    
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+    
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="98%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="-1"><font face="Arial,sans-serif"><b>Property IDs in The Document Summary Information Stream</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+     
+<p align="justify">The Document Summary Information stream has two sections with a section
+      format ID of <code>0xD5CDD5022E9C101B939708002B2CF9AE</code> for the first
+      one.  The following table defines the meaning of the property IDs in the
+      first section. See the preceeding section for interpreting the table.</p>
+
+     
+<table width="100%" cellspacing="2" cellpadding="2" border="0">
+<tr>
+       
+<td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Property ID</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Property name</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Property ID string</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">VT type</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">2</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Category</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_CATEGORY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">3</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PresentationTarget</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_PRESFORMAT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">4</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Bytes</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_BYTECOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">5</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Lines</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_LINECOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">6</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Paragraphs</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_PARCOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">7</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Slides</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_SLIDECOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">8</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Notes</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_NOTECOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">9</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">HiddenSlides</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_HIDDENCOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">10</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">MMClips</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_MMCLIPCOUNT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">11</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">ScaleCrop</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_SCALE</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_BOOL</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">12</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">HeadingPairs</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_HEADINGPAIR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_VARIANT | VT_VECTOR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">13</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">TitlesofParts</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_DOCPARTS</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR | VT_VECTOR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">14</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Manager</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_MANAGER</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">15</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Company</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_COMPANY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">16</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">LinksUpTo Date</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">PID_LINKSDIRTY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_BOOL</p>
+</font></td>
+       
+</tr>
+</table>
+    
+</td>
+</tr>
+</table>
+</div>
+<br>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+   
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>Property Types</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+    
+<anchor id="property_types"></anchor>
+
+    
+<p align="justify">A property consists of a DWord <em>type field</em> followed by the
+     property value. The property type is an integer value and tells how the
+     data byte following it are to be interpreted. In the Microsoft world it is
+     also known as the <em>variant</em>.</p>
+
+    
+<p align="justify">The <em>Usage</em> column says where a variant type may occur. Not all
+     of them are allowed in a property set but just those marked with a [P].
+     <em>[V]</em> - may appear in a VARIANT, <em>[T]</em> - may
+     appear in a TYPEDESC, <em>[P]</em> - may appear in an OLE property
+     set, <em>[S]</em> - may appear in a Safe Array.</p>
+
+    
+<table width="100%" cellspacing="2" cellpadding="2" border="0">
+<tr>
+       
+<td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Variant ID</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Variant Type</p>
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Usage</p> 
+</font></td>
+       <td style="font-weight: bold" valign="top" bgcolor="#006CB8" align="center"><font size="-1" color="#ffffff">
+<p align="justify">Description</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_EMPTY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">nothing</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">1</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_NULL</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">SQL style Null</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">2</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I2</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">2 byte signed int</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">3</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I4</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">4 byte signed int</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">4</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_R4</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">4 byte real</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">5</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_R8</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">8 byte real</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">6</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_CY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">currency</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">7</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_DATE</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">date</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">8</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_BSTR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">OLE Automation string</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">9</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_DISPATCH</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">IDispatch *</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">10</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_ERROR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">SCODE</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">11</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_BOOL</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">True=-1, False=0</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">12</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_VARIANT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VARIANT *</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">13</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_UNKNOWN</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">IUnknown *</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">14</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_DECIMAL</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">16 byte fixed point</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">16</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I1</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">signed char</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">17</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_UI1</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V] [T] [P] [S]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">unsigned char</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">18</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_UI2</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">unsigned short</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">19</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_UI4</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">unsigned short</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">20</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_I8</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">signed 64-bit int</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">21</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_UI8</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">unsigned 64-bit int</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">22</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_INT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">signed machine int</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">23</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_UINT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">unsigned machine int</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">24</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_VOID</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">C style void</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">25</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_HRESULT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Standard return type</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">26</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_PTR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">pointer type</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">27</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_SAFEARRAY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">(use VT_ARRAY in VARIANT)</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">28</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_CARRAY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">C style array</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">29</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_USERDEFINED</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">user defined type</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">30</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPSTR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">null terminated string</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">31</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_LPWSTR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[T] [P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">wide null terminated string</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">64</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_FILETIME</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">FILETIME</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">65</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_BLOB</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Length prefixed bytes</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">66</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_STREAM</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Name of the stream follows</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">67</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_STORAGE</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Name of the storage follows</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">68</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_STREAMED_OBJECT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Stream contains an object</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">69</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_STORED_OBJECT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Storage contains an object</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">70</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_BLOB_OBJECT</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Blob contains an object</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">71</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_CF</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">Clipboard format</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">72</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_CLSID</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">A Class ID</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0x1000</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_VECTOR</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[P]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">simple counted array</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0x2000</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_ARRAY</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">SAFEARRAY*</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0x4000</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_BYREF</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">[V]</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">void* for local use</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0x8000</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_RESERVED</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0xFFFF</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_ILLEGAL</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0xFFF</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_ILLEGALMASKED</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+      
+</tr>
+<tr>
+       
+<td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">0xFFF</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">VT_TYPEMASK</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+       <td valign="top" bgcolor="#a0ddf0" align="left"><font size="-1" color="#000000">
+<p align="justify">
+<p align="justify"></p>
+</p>
+</font></td>
+      
+</tr>
+</table>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+
+
+
+   
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="99%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+0"><font face="Arial,sans-serif"><b>References</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+    
+<p align="justify">In order to assemble the HPSF description I used information publically
+     available on the Internet only. The references given below have been very
+     helpful. If you have any amendments or corrections, please let us know!
+     Thank you!</p>
+
+   
+<ol>
+
+    
+<li>
+     
+<p align="justify">In
+      <a href="http://www.kyler.com/pubs/ddj9894.html"><em>Understanding OLE
+        documents</em></a>, Ken Kyler gives an introduction to OLE2
+       documents
+      and especially to property sets. He names the property names, types, and
+      IDs of the Summary Information and Document Summary Information
+      stream.</p>
+    
+</li>
+
+    
+<li>
+     
+<p align="justify">The
+      <a href="http://www.dwam.net/docs/oleref/"><em>ActiveX Programmer's
+       Reference</em></a> at
+      <a href="http://www.dwam.net/docs/oleref/">http://www.dwam.net/docs/oleref/</a>
+      seems a little outdated, but that's what I have found.</p>
+    
+</li>
+
+    
+<li>
+     
+<p align="justify">An overview of the <code>VT_</code> types is in
+      <a href="http://www.marin.clara.net/COM/variant_type_definitions.htm"><em>Variant
+       Type Definitions</em></a>.</p>
+    
+</li>
+
+    
+<li>
+     
+<p align="justify">What is a <code>FILETIME</code>? The answer can be found for example under
+      <a href="http://www.vbapi.com/ref/f/filetime.html">http://www.vbapi.com/ref/f/filetime.html</a>
+      or
+      <a href="http://www.cs.rpi.edu/courses/fall01/os/FILETIME.html">http://www.cs.rpi.edu/courses/fall01/os/FILETIME.html</a>. In
+      short:
+      <em>The FILETIME structure holds a date and time associated with a file.
+       The structure identifies a 64-bit integer specifying the number of
+       100-nanosecond intervals which have passed since January 1, 1601. This
+       64-bit value is split into the two dwords stored in the
+       structure.</em>
+</p>
+           
+</li>
+
+     
+<li>
+      
+<p align="justify">This documentation origins from the <a href="http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html">HPSF description</a> available at <a href="http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html">http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html</a>.</p>
+     
+</li>
+    
+</ol>
+   
+</td>
+</tr>
+</table>
+</div>
+<br>
+  
 </td>
 </tr>
 </table>
diff --git a/build/jakarta-poi/docs/hpsf/todo.html b/build/jakarta-poi/docs/hpsf/todo.html
new file mode 100644 (file)
index 0000000..d9ab52e
--- /dev/null
@@ -0,0 +1,133 @@
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>To Do</title>
+</head>
+<body bgcolor="#ffffff" marginheight="4" marginwidth="4" leftmargin="4" topmargin="4" alink="#023264" vlink="#023264" link="#525D76" text="#000000">
+<table border="0" cellpadding="0" cellspacing="0" width="100%">
+<tr>
+<td align="left" valign="top"><a href="http://jakarta.apache.org/index.html"><img src="images/jakarta-logo.gif" border="0" vspace="0" hspace="0"></a></td><td bgcolor="#ffffff" align="left" valign="top" width="100%"><img src="images/header.gif" align="right" border="0" vspace="0" hspace="0"></td>
+</tr>
+<tr>
+<td colspan="2" height="2" width="100%">
+<hr size="1" noshade="">
+</td>
+</tr>
+</table>
+<table border="0" cellpadding="0" cellspacing="0" width="100%">
+<tr>
+<td valign="top" width="1%"></td><td nowrap="1" valign="top" width="14%">
+<br>
+<font face="arial,helvetica,sanserif">
+<br>
+<font size="+1" color="#000000">Navigation</font><font size="-1">
+<ul>
+<li>
+<a href="../index.html"><font size="-1">Main</font></a>
+</li>
+</ul>
+</font>
+<br>
+<font size="+1" color="#000000">HPSF</font><font size="-1">
+<ul>
+<li>
+<a href="index.html"><font size="-1">Overview</font></a>
+</li>
+<li>
+<a href="how-to.html"><font size="-1">How To</font></a>
+</li>
+<li>
+<a href="internals.html"><font size="-1">Internals</font></a>
+</li>
+<li>
+<a href="todo.html"><font size="-1">To Do</font></a>
+</li>
+</ul>
+</font>
+<br>
+<br>
+</font></td><td align="left" valign="top" width="*">
+<title>To Do</title>
+<center>
+<table width="80%">
+<tr>
+<td bgcolor="#F3DD61"><font face="Arial,sans-serif" size="+1">
+<center>
+<b>To Do</b>
+</center>
+</font></td>
+</tr>
+</table>
+</center>
+<font size="-2" color="#000000">
+<p>
+<a href="mailto:"></a>
+</p>
+</font>
+<br>
+<div align="right">
+<table cellspacing="0" cellpadding="2" border="0" width="100%">
+<tr>
+<td bgcolor="#525D76"><font color="#ffffff" size="+1"><font face="Arial,sans-serif"><b>To Do</b></font></font></td>
+</tr>
+<tr>
+<td>
+<br>
+
+   
+<p align="justify">The following functionalities should be added to HPFS:</p>
+
+   
+<ol>
+    
+<li>
+     
+<p align="justify">Add writing capability for property sets.</p>
+    
+</li>
+    
+<li>
+     
+<p align="justify">Add codepage support.</p>
+    
+</li>
+    
+<li>
+     
+<p align="justify">Add Unicode support.</p>
+    
+</li>
+    
+<li>
+     
+<p align="justify">Add resource bundles to
+      <code>org.apache.poi.hpsf.wellknown</code> to ease
+      localizations.</p>
+    
+</li>
+   
+</ol>
+  
+</td>
+</tr>
+</table>
+</div>
+<br>
+</td>
+</tr>
+</table>
+<br>
+<table cellpadding="0" cellspacing="0" border="0" width="100%">
+<tr>
+<td>
+<hr size="1" noshade="">
+</td>
+</tr>
+<tr>
+<td align="center"><font color="#525D76" size="-1" face="arial,helvetica,sanserif"><i>
+              Copyright &copy;2002 Apache Software Foundation
+            </i></font></td><td width="5%" align="right"><img src="images/cocoon2-small.jpg" align="right" border="0" vspace="0" hspace="0"></td>
+</tr>
+</table>
+</body>
+</html>
index 95c05705411c174b18f41af1e9277992b081a79d..49b348ba8b43bb6ea17a0fe7b38d828ed4e0476e 100755 (executable)
        <map:part src="cocoon:/doclist/xdocs/poifs/book.xml"/>
        <map:part src="cocoon:/doclist/xdocs/hdf/book.xml"/>
        <map:part src="cocoon:/doclist/xdocs/hssf/book.xml"/>
+       <map:part src="cocoon:/doclist/xdocs/hpsf/book.xml"/>
        <map:part src="cocoon:/doclist/xdocs/utils/book.xml"/>     
      </map:aggregate>
      <map:transform src="stylesheets/doclist2document.xsl"/>
index 3d1c56b43991d9fed85dda817d7be53dd98d195b..88f0d6928a43100f80e0404859acc2219335b9d2 100755 (executable)
     <xsl:apply-templates/>
   </xsl:template>
 
+  <xsl:template match="entry[@role='th']">
+    <td align="center" bgcolor="#006CB8" valign="top"
+        style="font-weight: bold">
+      <font color="#ffffff" size="-1"><xsl:apply-templates/></font>
+    </td>
+  </xsl:template>
+
   <xsl:template match="entry">
     <td align="left" bgcolor="#a0ddf0" valign="top">
       <font color="#000000" size="-1"><xsl:apply-templates/></font>
index 33b48beae2122a46f0c40e635b8af108b8baecdc..2967f769166788dbe809c2648e09c4fb33aaa32d 100755 (executable)
     <table>
       <tgroup>
         <xsl:attribute name="cols"><xsl:value-of select="count(tr/td)"/></xsl:attribute>
-        <xsl:if test="th">
-          <thead>
-            <xsl:apply-templates select="th"/>
-          </thead>
-        </xsl:if>
+        <xsl:apply-templates select="th"/>
         <tbody>
           <xsl:apply-templates select="tr"/>
         </tbody>
     </table>
   </xsl:template>
 
-  <xsl:template match="th|tr">
+  <xsl:template match="th">
+          <entry role="th">
+      <xsl:apply-templates/>
+          </entry>
+  </xsl:template>
+
+  <xsl:template match="tr">
     <row>
       <xsl:apply-templates/>
     </row>
     </xsl:copy>
   </xsl:template>
 </xsl:stylesheet>
-
index 78c7d877a32a1802bc4463dd2f0b05cfe7f50e1a..baaf26cdd3217eb1245c0900dd63481a466a68f8 100755 (executable)
@@ -405,12 +405,12 @@ COPYRIGHT:
         <!ATTLIST tr %common.att;>
 
             <!-- The table row header element -->
-            <!ELEMENT th (%content.mix;)*>
+            <!ELEMENT th (%blocks;|%content.mix;)*>
             <!ATTLIST th %common.att;
                          %cell.span;>
 
             <!-- The table row description element -->
-            <!ELEMENT td (%content.mix;)*>
+            <!ELEMENT td (%blocks;|%content.mix;)*>
             <!ATTLIST td %common.att;
                          %cell.span;>
 
@@ -443,7 +443,7 @@ COPYRIGHT:
     <!ATTLIST sl %common.att;>
 
         <!-- List item -->
-        <!ELEMENT li (%content.mix;|%lists;)*>
+        <!ELEMENT li (%blocks;|%content.mix;)*>
         <!ATTLIST li %common.att;>
 
     <!-- Definition list (typically two-column) -->
@@ -455,7 +455,7 @@ COPYRIGHT:
         <!ATTLIST dt %common.att;>
 
         <!-- Definition description -->
-        <!ELEMENT dd (%content.mix;)*>
+        <!ELEMENT dd (%blocks;|%content.mix;)*>
         <!ATTLIST dd %common.att;>
 
     <!-- ==================================================== -->
index 2af07554bbdc0b3cfe81ebdefbc042dc0dbf8ab5..027d430e4dd9f41d6d1321b7065d21ee6a739a37 100644 (file)
@@ -7,8 +7,12 @@
 
   <menu label="Navigation">
     <menu-item label="Main" href="../index.html"/>
+  </menu>
+  <menu label="HPSF">
+    <menu-item label="Overview" href="index.html"/>
     <menu-item label="How To" href="how-to.html"/>
     <menu-item label="Internals" href="internals.html"/>
+    <menu-item label="To Do" href="todo.html"/>
   </menu>
 
 </book>
index 91d6166b97a94c541572709ce92ef308a9747ef6..2e095d48df2409f166a9bee3baefe66501bbd450 100644 (file)
@@ -1,16 +1,50 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.0//EN" "../dtd/document-v10.dtd">
 <document>
-  <header>
-    <title>HPSF (Horrible Property Set Format)</title>
-    <subtitle>Overview</subtitle>
-    <authors>     
-      <person name="Rainer Klute" email="klute@rainer-klute.de"/>
-    </authors>
-  </header>
-  <body>
-    <s1 title="Overview">
-      <p class="todo">TODO: This documentation is still to be written.</p>
-    </s1>
-  </body>
+ <header>
+  <title>HPSF (Horrible Property Set Format)</title>
+  <subtitle>Overview</subtitle>
+  <authors>     
+   <person name="Rainer Klute" email="klute@rainer-klute.de"/>
+  </authors>
+ </header>
+ <body>
+  <s1 title="Overview">
+   <p>Microsoft applications like "Word" or "Excel" let the user describe his
+    document by properties like "title", "category" and so on. The application
+    itself adds further information: last author, creation date etc. These
+    properties are stored in so-called <strong>property set streams</strong>. A
+    property set stream is a separate document within a <link
+     href="../poifs/index.html">POI filesystem</link>. HPSF is POI's pure-Java
+    implementation to read (and in future to write) property set streams.</p>
+
+   <p>Once the <link href="how-to.html">HPSF HOWTO</link> is ready, it will
+    describe what a Java application should do to read a property set using
+    HPSF and retrieve the information it needs. Currently this is explained
+    in the javadocs of the <code>org.apache.poi.hpsf</code> package only.</p>
+
+   <p>HPSF supports OLE2 property set streams in general, not only the special
+    case of document properties mentioned above. The <link
+     href="internals.html">HPSF description</link> describes the internal
+    structure of  property set streams.</p>
+  </s1>
+ </body>
 </document>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: xml
+sgml-omittag:nil
+sgml-shorttag:nil
+sgml-namecase-general:nil
+sgml-general-insert-case:lower
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
index 37602d07926e9717f9691d8009084d637138fb7c..9be00dbf76f8f2e96e0bbde492a05833f52789a7 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.0//EN" "../dtd/document-v10.dtd"> 
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.0//EN" "../dtd/document-v10.dtd">
 <document>
   <header>
-    <title>HPSF Internals</title>
+    <title>HPSF Internals: The Horrible Property Set Format</title>
     <authors>
       <person name="Rainer Klute" email="klute@rainer-klute.de"/>
     </authors>
   </header>
   <body>
     <s1 title="HPSF Internals">
-      <p class="todo">TODO: This documentation is still to be written. For the
-       time being, please see <link
-         href="http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html">http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html</link>.</p>
-    </s1>
-  </body>
+
+    <s2 title="Introduction">
+
+    <p>A Microsoft Office document is internally organized like a filesystem
+     with directory and files. Microsoft calls these files
+     <strong>streams</strong>. A document can have properties attached to it,
+     like author, title, number of words etc. These metadata are not  stored in
+     the main stream of, say, a Word document, but instead in a dedicated
+     stream with a special format. Usually this stream's name is
+     <code>\005SummaryInformation</code>, where <code>\005</code> represents
+     the character with a decimal value of 5.</p>
+
+    <p>A single piece of information in the stream is called a
+     <strong>property</strong>, for example the document title. Each property
+     has an integral <strong>ID</strong> (e.g. 2 for title), a
+     <strong>type</strong> (telling that the title is a string of bytes) and a
+     <strong>value</strong> (what this is should be obvious). A stream
+     containing properties is called a
+     <strong>property set stream</strong>.</p>
+
+    <p>This document describes the internal structure of a property set stream,
+     i.e. the <strong>Horrible Property Set Format (HDF)</strong>.  It does not
+     describe how a Microsoft Office document is organized internally and how
+     to retrieve a stream from it. See the <link href="../POIFS/index.html">POIFS documentation</link> for
+     that kind of stuff.</p>
+
+    <p>The Horrible Property Set Format is not only used in the Summary
+     Information stream in the top-level document of a Microsoft Office
+     document. Often there is also a property set stream named
+     <code>\005DocumentSummaryInformation</code> with additional properties.
+     Embedded documents may have their own property set streams. You cannot
+     tell by a stream's name whether it is a property set stream or not.
+     Instead you have to open the stream and look at its bytes.</p>
+   </s2>
+
+
+
+    <s2 title="Data Types">
+
+    <p>Before delving into the details of the property set stream format we
+     have to have a short look at data types. Integral values are stored in the
+     so-called <strong>little endian</strong> format. In this format the bytes
+     that make out an integral value are stored in the "wrong" order. For
+     example, the decimal value 4660 is 0x1234 in the hexadecimal notation. If
+     you think this should be represented by a byte 0x12 followed by another
+     byte 0x34, you are right. This is called the <strong>big endian</strong>
+     format. In the little endian format, however, this order is reversed and
+     the low-value byte comes first: 0x3412.
+    </p>
+
+    <p>The following table gives an overview about some important data
+     types:</p>
+
+    <table>
+
+     <tr>
+      <th>
+       <p>Name</p>
+      </th>
+      <th>
+       <p>Length</p>
+      </th>
+      <th>
+       <p>Example (Little Endian)</p>
+      </th>
+      <th>
+       <p>Example (Big Endian)</p>
+      </th>
+     </tr>
+
+     <tr>
+      <td><p><strong>Bytes</strong></p></td>
+      <td>
+       <p>1 byte</p>
+      </td>
+      <td><p><code>0x12</code></p></td>
+      <td><p><code>0x12</code></p></td>
+     </tr>
+
+     <tr>
+      <td><p><strong>Word</strong></p></td>
+      <td>
+       <p>2 bytes</p>
+      </td>
+      <td><p><code>0x1234</code></p></td>
+      <td><p><code>0x3412</code></p></td>
+     </tr>
+
+     <tr>
+      <td><p><strong>DWord</strong></p></td>
+      <td>
+       <p>4 bytes</p>
+      </td>
+      <td><p><code>0x12345678</code></p></td>
+      <td><p><code>0x78563412</code></p></td>
+     </tr>
+
+     <tr>
+      <td>
+       <p><strong>ClassID</strong></p>
+       <p>A sequence of one DWord, two Words and eight Bytes</p>
+      </td>
+
+      <td>
+       <p>16 bytes</p>
+      </td>
+
+      <td>
+       <p><code>0xE0859FF2F94F6810AB9108002B27B3D9</code> resp.
+       <code>E0859FF2-F94F-6810-AB-91-08-00-2B-27-B3-D9</code></p>
+      </td>
+
+      <td>
+       <p><code>0xF29F85E04FF91068AB9108002B27B3D9</code> resp.
+       <code>F29F85E0-4FF9-1068-AB-91-08-00-2B-27-B3-D9</code></p>
+      </td>
+     </tr>
+
+     <tr>
+      <td></td>
+      <td></td>
+      <td>
+       <p>The ClassID examples are given here in two different notations. The
+       second notation without the "0x" at the beginning and with dashes
+       inside shows the internal grouping into one DWord, two Words and eight
+       Bytes.</p>
+      </td>
+      <td>
+       <p><em>Watch out:</em> Microsoft documentation and tools show class IDs
+       a little bit differently like
+       <code>F29F85E0-4FF9-1068-AB91-08002B27B3D9</code>.
+       However, that representation is (intentionally?) misleading with
+       respect to endianess.</p>
+      </td>
+     </tr>
+    </table>
+   </s2>
+
+
+
+   <s2 title="HPSF Overview">
+
+    <p>A property set stream consists of three main parts:</p>
+
+    <ol>
+     <li>
+      <p>The <strong>header</strong> and</p>
+     </li>
+     <li>
+      <p>the <strong>section(s)</strong> containing the properties.</p>
+     </li>
+    </ol>
+   </s2>
+
+
+
+   <s2 title="The Header">
+
+    <p>The first bytes in a property set stream is the <strong>header</strong>.
+     It has a fixed length and looks like this:</p>
+
+    <table>
+      <tr>
+       <th>
+       <p>Offset</p>
+       </th>
+       <th>
+       <p>Type</p>
+       </th>
+       <th>
+       <p>Contents</p>
+       </th>
+       <th>
+       <p>Remarks</p>
+       </th>
+      </tr>
+
+      <tr>
+       <td>
+       <p>0</p>
+       </td>
+       <td>
+       <p>Word</p>
+       </td>
+       <td><p><code>0xFFFE</code></p></td>
+       <td>
+       <p>If the first four bytes of a stream do not contain these values, the
+        stream is not a property set stream.</p>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>2</p>
+       </td>
+       <td>
+       <p>Word</p>
+       </td>
+       <td><p><code>0x0000</code></p></td>
+      <td></td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>4</p>
+       </td>
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Denotes the operating system and the OS version under which this
+        stream was created. The operating system ID is in the DWord's higher
+        word (after little endian decoding): <code>0x0000</code> for Win16,
+        <code>0x0001</code> for Macintosh and <code>0x0002</code> for Win32 - that's
+        all. The reader is most likely aware of the fact that there are some
+        more operating systems. However, Microsoft does not seem to know.</p>
+      </td>
+      <td></td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>8</p>
+       </td>
+       <td>
+       <p>ClassID</p>
+       </td>
+       <td><p><code>0x00000000000000000000000000000000</code></p></td>
+       <td>
+       <p>Most property set streams have this value but this is not
+        required.</p>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>24</p>
+       </td>
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p><code>0x01000000</code> or greater</p>
+       </td>
+       <td>
+       <p>Section count. This field's value should be equal to 1 or greater.
+        Microsoft claims that this is a "reserved" field, but it seems to tell
+        how many sections (see below) are following in the stream. This would
+        really make sense because otherwise you could not know where and how
+        far you should read section data.</p>
+       </td>
+     </tr>
+    </table>
+   </s2>
+
+
+
+   <s2 title="Section List">
+
+    <p>Following the header is the section list. This is an array of pairs each
+     consisting of a section format ID and an offset. This array has as many
+     pairs of ClassID and and DWord fields as the section count field in the
+     header says. The Summary Information stream contains a single section, the
+     Document Summary Information stream contains two.</p>
+
+    <table>
+      <tr>
+       <th>
+       <p>Type</p>
+       </th>
+       <th>
+       <p>Contents</p>
+       </th>
+       <th>
+       <p>Remarks</p>
+       </th>
+      </tr>
+
+      <tr>
+       <td>
+       <p>ClassID</p>
+       </td>
+       <td>
+       <p>Section format ID</p>
+       </td>
+       <td>
+       <p><code>0xF29F85E04FF91068AB9108002B27B3D9</code> for the single section
+        in the Summary Information stream.</p>
+
+       <p><code>0xD5CDD5022E9C101B939708002B2CF9AE</code> for the first
+        section in the Document Summary Information stream.</p>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Offset</p>
+       </td>
+       <td>
+       <p>The number of bytes between the beginning of the stream and the
+        beginning of the section within the stream.</p>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>ClassID</p>
+       </td>
+       <td>
+       <p>Section format ID</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Offset</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>...</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+      </tr>
+    </table>
+   </s2>
+
+
+
+   <s2 title="Section">
+
+    <p>A section is divided into three parts: the section header (with the
+     section length and the number of properties in the section), the
+     properties list (with type and offset of each property), and the
+     properties themselves. Here are the details:</p>
+
+    <table>
+      <tr>
+       <th>
+       <p>&nbsp;</p>
+       </th>
+       <th>
+       <p>Type</p>
+       </th>
+       <th>
+       <p>Contents</p>
+       </th>
+       <th>
+       <p>Remarks</p>
+       </th>
+      </tr>
+
+      <tr>
+       <td>
+       <p>Section header</p>
+       </td>
+
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Length</p>
+       </td>
+       <td>
+       <p>The length of the section in bytes.</p>
+       </td>
+      </tr>
+
+     <tr>
+      <td></td>
+      <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Property count</p>
+       </td>
+       <td>
+       <p>The number of properties in the section.</p>
+       </td>
+      </tr>
+
+      <tr>
+
+       <td>
+       <p>Properties list</p>
+       </td>
+
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Property ID</p>
+       </td>
+       <td>
+       <p>The property ID tells what the property means. For example, an ID of
+        <code>0x0002</code> in the Summary Information stands for the document's
+       title. See the <link href="#property_ids">Property IDs</link>
+        chapter below for more details.</p>
+       </td>
+      </tr>
+
+      <tr>
+      <td></td>
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Offset</p>
+       </td>
+       <td>
+       <p>The number of bytes between the beginning of the section and the
+        property.</p>
+       </td>
+      </tr>
+
+      <tr>
+      <td></td>
+       <td>
+       <p>...</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+      </tr>
+
+      <tr>
+       <td>
+       <p>Properties</p>
+       </td>
+
+       <td>
+       <p>DWord</p>
+       </td>
+       <td>
+       <p>Property type ("variant")</p>
+       </td>
+       <td>
+       <p>This is the property's data type, e.g. an integer value,  a byte
+        string or a Unicode string. See the
+        <link href="#property_types"><em>Property Types</em></link> chapter for
+        details!</p>
+       </td>
+      </tr>
+
+      <tr>
+      <td></td>
+       <td><p><em>Field length depends on the property type
+         ("variant")</em></p></td>
+       <td>
+       <p>Property value</p>
+       </td>
+       <td>
+       <p>This field's length depends on the property's type. These are the
+        bytes that make out the DWord, the byte string or some other data of
+        fixed or variable length.</p>
+
+       <p>The  property value's length is always stored in an area which is a
+        multiple of 4 in length. If the property is shorter, e.g. a byte
+        string of 13 bytes, the remaining bytes are padded with <code>0x00</code>
+        bytes.</p>
+       </td>
+      </tr>
+
+      <tr>
+      <td></td>
+       <td>
+       <p>...</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+       <td>
+       <p>...</p>
+       </td>
+      </tr>
+    </table>
+   </s2>
+
+
+
+   <s2 title="Property IDs">
+    <anchor id="property_ids"/>
+
+    <p>As seen above, a section holds a property list: an array with property
+     IDs and offsets. The property ID gives each property a meaning. For
+     example, in the Summary Information stream the property ID 2 says that
+     this property is the document's title.</p>
+
+    <p>If you want to know a property ID's meaning, it is not sufficient to
+     know the ID itself. You must also know the
+     <strong>section format ID</strong>.  For example, in the Document Summary
+     Information stream the property ID 2 means not the document's title but
+     its category. Due to Microsoft's infinite wisdom the section format ID is
+     not part of the section. Thus if you have only a section without the
+     stream it is in, you cannot make any sense of the properties because you
+     do not know what they mean.</p>
+
+    <p>So each section format ID has its own name space of property IDs.
+     Microsoft defined some "well-known" property IDs for the Summary
+     Information and the Document Summary Information streams. You can extend
+     them by your own additional IDs. This will be described below.</p>
+
+    <s3 title="Property IDs in The Summary Information Stream">
+
+     <p>The Summary Information stream has a single section with a section
+      format ID of <code>0xF29F85E04FF91068AB9108002B27B3D9</code>. The following
+      table defines the meaning of its property IDs. Each row associates a
+      property ID with a <em>name</em> and an <em>ID string</em>. (The property
+      <em>type</em> is just for informational purposes given here. As we have
+      seen above, the type is always given along with the value.)</p>
+
+     <p>The property <em>name</em> is a readable string which could be
+      displayed to the user. However, this string is useful only for users who
+      understand English. The property name does not help with other
+      languages.</p>
+
+     <p>The property <em>ID string</em> is about the same but looks more
+      technically and is nothing a user should bother with. You could the ID
+      string and map it to an appropriate display string in a particular
+      language.  Of course you could do that with the property ID as well and
+      with less overhead, but people (including software developers) tend to be
+      better in remembering symbolic constants than remembering numbers.</p>
+
+     <table>
+      <tr>
+       <th><p>Property ID</p></th>
+       <th><p>Property Name</p></th>
+       <th><p>Property ID String</p></th>
+       <th><p>Property Type</p></th>
+      </tr>
+      <tr>
+       <td><p>2</p></td>
+       <td><p>Title</p></td>
+       <td><p>PID_TITLE</p></td>
+       <td><p>VT_LPSTR</p></td>
+      </tr>
+       <tr>
+       <td><p>3</p></td>
+       <td><p>Subject</p></td>
+       <td><p>PID_SUBJECT</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>4</p></td>
+       <td><p>Author</p></td>
+       <td><p>PID_AUTHOR</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>5</p></td>
+       <td><p>Keywords</p></td>
+       <td><p>PID_KEYWORDS</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>6</p></td>
+       <td><p>Comments</p></td>
+       <td><p>PID_COMMENTS</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>7</p></td>
+       <td><p>Template</p></td>
+       <td><p>PID_TEMPLATE</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>8</p></td>
+       <td><p>Last Saved By</p></td>
+       <td><p>PID_LASTAUTHOR</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>9</p></td>
+       <td><p>Revision Number</p></td>
+       <td><p>PID_REVNUMBER</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>10</p></td>
+       <td><p>Total Editing Time</p></td>
+       <td><p>PID_EDITTIME</p></td>
+       <td><p>VT_FILETIME</p></td>
+       </tr>
+       <tr>
+       <td><p>11</p></td>
+       <td><p>Last Printed</p></td>
+       <td><p>PID_LASTPRINTED</p></td>
+       <td><p>VT_FILETIME</p></td>
+       </tr>
+       <tr>
+       <td><p>12</p></td>
+       <td><p>Create Time/Date</p></td>
+       <td><p>PID_CREATE_DTM</p></td>
+       <td><p>VT_FILETIME</p></td>
+       </tr>
+       <tr>
+       <td><p>13</p></td>
+       <td><p>Last Saved Time/Date</p></td>
+       <td><p>PID_LASTSAVE_DTM</p></td>
+       <td><p>VT_FILETIME</p></td>
+       </tr>
+       <tr>
+       <td><p>14</p></td>
+       <td><p>Number of Pages</p></td>
+       <td><p>PID_PAGECOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>15</p></td>
+       <td><p>Number of Words</p></td>
+       <td><p>PID_WORDCOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>16</p></td>
+       <td><p>Number of Characters</p></td>
+       <td><p>PID_CHARCOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>17</p></td>
+       <td><p>Thumbnail</p></td>
+       <td><p>PID_THUMBNAIL</p></td>
+       <td><p>VT_CF</p></td>
+       </tr>
+       <tr>
+       <td><p>18</p></td>
+       <td><p>Name of Creating Application</p></td>
+       <td><p>PID_APPNAME</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>19</p></td>
+       <td><p>Security</p></td>
+       <td><p>PID_SECURITY</p></td>
+       <td><p>VT_I4</p></td>
+      </tr>
+     </table>
+    </s3>
+
+
+
+    <s3 title="Property IDs in The Document Summary Information Stream">
+
+     <p>The Document Summary Information stream has two sections with a section
+      format ID of <code>0xD5CDD5022E9C101B939708002B2CF9AE</code> for the first
+      one.  The following table defines the meaning of the property IDs in the
+      first section. See the preceeding section for interpreting the table.</p>
+
+     <table>
+       <tr>
+       <th><p>Property ID</p></th>
+       <th><p>Property name</p></th>
+       <th><p>Property ID string</p></th>
+       <th><p>VT type</p></th>
+       </tr>
+       <tr>
+       <td><p>2</p></td>
+       <td><p>Category</p></td>
+       <td><p>PID_CATEGORY</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>3</p></td>
+       <td><p>PresentationTarget</p></td>
+       <td><p>PID_PRESFORMAT</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>4</p></td>
+       <td><p>Bytes</p></td>
+       <td><p>PID_BYTECOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>5</p></td>
+       <td><p>Lines</p></td>
+       <td><p>PID_LINECOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>6</p></td>
+       <td><p>Paragraphs</p></td>
+       <td><p>PID_PARCOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>7</p></td>
+       <td><p>Slides</p></td>
+       <td><p>PID_SLIDECOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>8</p></td>
+       <td><p>Notes</p></td>
+       <td><p>PID_NOTECOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>9</p></td>
+       <td><p>HiddenSlides</p></td>
+       <td><p>PID_HIDDENCOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>10</p></td>
+       <td><p>MMClips</p></td>
+       <td><p>PID_MMCLIPCOUNT</p></td>
+       <td><p>VT_I4</p></td>
+       </tr>
+       <tr>
+       <td><p>11</p></td>
+       <td><p>ScaleCrop</p></td>
+       <td><p>PID_SCALE</p></td>
+       <td><p>VT_BOOL</p></td>
+       </tr>
+       <tr>
+       <td><p>12</p></td>
+       <td><p>HeadingPairs</p></td>
+       <td><p>PID_HEADINGPAIR</p></td>
+       <td><p>VT_VARIANT | VT_VECTOR</p></td>
+       </tr>
+       <tr>
+       <td><p>13</p></td>
+       <td><p>TitlesofParts</p></td>
+       <td><p>PID_DOCPARTS</p></td>
+       <td><p>VT_LPSTR | VT_VECTOR</p></td>
+       </tr>
+       <tr>
+       <td><p>14</p></td>
+       <td><p>Manager</p></td>
+       <td><p>PID_MANAGER</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>15</p></td>
+       <td><p>Company</p></td>
+       <td><p>PID_COMPANY</p></td>
+       <td><p>VT_LPSTR</p></td>
+       </tr>
+       <tr>
+       <td><p>16</p></td>
+       <td><p>LinksUpTo Date</p></td>
+       <td><p>PID_LINKSDIRTY</p></td>
+       <td><p>VT_BOOL</p></td>
+       </tr>
+     </table>
+    </s3>
+   </s2>
+
+
+
+   <s2 title="Property Types">
+    <anchor id="property_types"/>
+
+    <p>A property consists of a DWord <em>type field</em> followed by the
+     property value. The property type is an integer value and tells how the
+     data byte following it are to be interpreted. In the Microsoft world it is
+     also known as the <em>variant</em>.</p>
+
+    <p>The <em>Usage</em> column says where a variant type may occur. Not all
+     of them are allowed in a property set but just those marked with a [P].
+     <strong>[V]</strong> - may appear in a VARIANT, <strong>[T]</strong> - may
+     appear in a TYPEDESC, <strong>[P]</strong> - may appear in an OLE property
+     set, <strong>[S]</strong> - may appear in a Safe Array.</p>
+
+    <table>
+      <tr>
+       <th><p>Variant ID</p></th>
+       <th><p>Variant Type</p></th>
+       <th><p>Usage</p> </th>
+       <th><p>Description</p></th>
+      </tr>
+      <tr>
+       <td><p>0</p></td>
+       <td><p>VT_EMPTY</p></td>
+       <td><p>[V] [P]</p></td>
+       <td><p>nothing</p></td>
+      </tr>
+      <tr>
+       <td><p>1</p></td>
+       <td><p>VT_NULL</p></td>
+       <td><p>[V] [P]</p></td>
+       <td><p>SQL style Null</p></td>
+      </tr>
+      <tr>
+       <td><p>2</p></td>
+       <td><p>VT_I2</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>2 byte signed int</p></td>
+      </tr>
+      <tr>
+       <td><p>3</p></td>
+       <td><p>VT_I4</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>4 byte signed int</p></td>
+      </tr>
+      <tr>
+       <td><p>4</p></td>
+       <td><p>VT_R4</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>4 byte real</p></td>
+      </tr>
+      <tr>
+       <td><p>5</p></td>
+       <td><p>VT_R8</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>8 byte real</p></td>
+      </tr>
+      <tr>
+       <td><p>6</p></td>
+       <td><p>VT_CY</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>currency</p></td>
+      </tr>
+      <tr>
+       <td><p>7</p></td>
+       <td><p>VT_DATE</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>date</p></td>
+      </tr>
+      <tr>
+       <td><p>8</p></td>
+       <td><p>VT_BSTR</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>OLE Automation string</p></td>
+      </tr>
+      <tr>
+       <td><p>9</p></td>
+       <td><p>VT_DISPATCH</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>IDispatch *</p></td>
+      </tr>
+      <tr>
+       <td><p>10</p></td>
+       <td><p>VT_ERROR</p></td>
+       <td><p>[V] [T] [S]</p></td>
+       <td><p>SCODE</p></td>
+      </tr>
+      <tr>
+       <td><p>11</p></td>
+       <td><p>VT_BOOL</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>True=-1, False=0</p></td>
+      </tr>
+      <tr>
+       <td><p>12</p></td>
+       <td><p>VT_VARIANT</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>VARIANT *</p></td>
+      </tr>
+      <tr>
+       <td><p>13</p></td>
+       <td><p>VT_UNKNOWN</p></td>
+       <td><p>[V] [T] [S]</p></td>
+       <td><p>IUnknown *</p></td>
+      </tr>
+      <tr>
+       <td><p>14</p></td>
+       <td><p>VT_DECIMAL</p></td>
+       <td><p>[V] [T] [S]</p></td>
+       <td><p>16 byte fixed point</p></td>
+      </tr>
+      <tr>
+       <td><p>16</p></td>
+       <td><p>VT_I1</p></td>
+       <td><p>[T]</p></td>
+       <td><p>signed char</p></td>
+      </tr>
+      <tr>
+       <td><p>17</p></td>
+       <td><p>VT_UI1</p></td>
+       <td><p>[V] [T] [P] [S]</p></td>
+       <td><p>unsigned char</p></td>
+      </tr>
+      <tr>
+       <td><p>18</p></td>
+       <td><p>VT_UI2</p></td>
+       <td><p>[T] [P]</p></td>
+       <td><p>unsigned short</p></td>
+      </tr>
+      <tr>
+       <td><p>19</p></td>
+       <td><p>VT_UI4</p></td>
+       <td><p>[T] [P]</p></td>
+       <td><p>unsigned short</p></td>
+      </tr>
+      <tr>
+       <td><p>20</p></td>
+       <td><p>VT_I8</p></td>
+       <td><p>[T] [P]</p></td>
+       <td><p>signed 64-bit int</p></td>
+      </tr>
+      <tr>
+       <td><p>21</p></td>
+       <td><p>VT_UI8</p></td>
+       <td><p>[T] [P]</p></td>
+       <td><p>unsigned 64-bit int</p></td>
+      </tr>
+      <tr>
+       <td><p>22</p></td>
+       <td><p>VT_INT</p></td>
+       <td><p>[T]</p></td>
+       <td><p>signed machine int</p></td>
+      </tr>
+      <tr>
+       <td><p>23</p></td>
+       <td><p>VT_UINT</p></td>
+       <td><p>[T]</p></td>
+       <td><p>unsigned machine int</p></td>
+      </tr>
+      <tr>
+       <td><p>24</p></td>
+       <td><p>VT_VOID</p></td>
+       <td><p>[T]</p></td>
+       <td><p>C style void</p></td>
+      </tr>
+      <tr>
+       <td><p>25</p></td>
+       <td><p>VT_HRESULT</p></td>
+       <td><p>[T]</p></td>
+       <td><p>Standard return type</p></td>
+      </tr>
+      <tr>
+       <td><p>26</p></td>
+       <td><p>VT_PTR</p></td>
+       <td><p>[T]</p></td>
+       <td><p>pointer type</p></td>
+      </tr>
+      <tr>
+       <td><p>27</p></td>
+       <td><p>VT_SAFEARRAY</p></td>
+       <td><p>[T]</p></td>
+       <td><p>(use VT_ARRAY in VARIANT)</p></td>
+      </tr>
+      <tr>
+       <td><p>28</p></td>
+       <td><p>VT_CARRAY</p></td>
+       <td><p>[T]</p></td>
+       <td><p>C style array</p></td>
+      </tr>
+      <tr>
+       <td><p>29</p></td>
+       <td><p>VT_USERDEFINED</p></td>
+       <td><p>[T]</p></td>
+       <td><p>user defined type</p></td>
+      </tr>
+      <tr>
+       <td><p>30</p></td>
+       <td><p>VT_LPSTR</p></td>
+       <td><p>[T] [P]</p></td>
+       <td><p>null terminated string</p></td>
+      </tr>
+      <tr>
+       <td><p>31</p></td>
+       <td><p>VT_LPWSTR</p></td>
+       <td><p>[T] [P]</p></td>
+       <td><p>wide null terminated string</p></td>
+      </tr>
+      <tr>
+       <td><p>64</p></td>
+       <td><p>VT_FILETIME</p></td>
+       <td><p>[P]</p></td>
+       <td><p>FILETIME</p></td>
+      </tr>
+      <tr>
+       <td><p>65</p></td>
+       <td><p>VT_BLOB</p></td>
+       <td><p>[P]</p></td>
+       <td><p>Length prefixed bytes</p></td>
+      </tr>
+      <tr>
+       <td><p>66</p></td>
+       <td><p>VT_STREAM</p></td>
+       <td><p>[P]</p></td>
+       <td><p>Name of the stream follows</p></td>
+      </tr>
+      <tr>
+       <td><p>67</p></td>
+       <td><p>VT_STORAGE</p></td>
+       <td><p>[P]</p></td>
+       <td><p>Name of the storage follows</p></td>
+      </tr>
+      <tr>
+       <td><p>68</p></td>
+       <td><p>VT_STREAMED_OBJECT</p></td>
+       <td><p>[P]</p></td>
+       <td><p>Stream contains an object</p></td>
+      </tr>
+      <tr>
+       <td><p>69</p></td>
+       <td><p>VT_STORED_OBJECT</p></td>
+       <td><p>[P]</p></td>
+       <td><p>Storage contains an object</p></td>
+      </tr>
+      <tr>
+       <td><p>70</p></td>
+       <td><p>VT_BLOB_OBJECT</p></td>
+       <td><p>[P]</p></td>
+       <td><p>Blob contains an object</p></td>
+      </tr>
+      <tr>
+       <td><p>71</p></td>
+       <td><p>VT_CF</p></td>
+       <td><p>[P]</p></td>
+       <td><p>Clipboard format</p></td>
+      </tr>
+      <tr>
+       <td><p>72</p></td>
+       <td><p>VT_CLSID</p></td>
+       <td><p>[P]</p></td>
+       <td><p>A Class ID</p></td>
+      </tr>
+      <tr>
+       <td><p>0x1000</p></td>
+       <td><p>VT_VECTOR</p></td>
+       <td><p>[P]</p></td>
+       <td><p>simple counted array</p></td>
+      </tr>
+      <tr>
+       <td><p>0x2000</p></td>
+       <td><p>VT_ARRAY</p></td>
+       <td><p>[V]</p></td>
+       <td><p>SAFEARRAY*</p></td>
+      </tr>
+      <tr>
+       <td><p>0x4000</p></td>
+       <td><p>VT_BYREF</p></td>
+       <td><p>[V]</p></td>
+       <td><p>void* for local use</p></td>
+      </tr>
+      <tr>
+       <td><p>0x8000</p></td>
+       <td><p>VT_RESERVED</p></td>
+       <td><p><br/></p></td>
+       <td><p><br/></p></td>
+      </tr>
+      <tr>
+       <td><p>0xFFFF</p></td>
+       <td><p>VT_ILLEGAL</p></td>
+       <td><p><br/></p></td>
+       <td><p><br/></p></td>
+      </tr>
+      <tr>
+       <td><p>0xFFF</p></td>
+       <td><p>VT_ILLEGALMASKED</p></td>
+       <td><p><br/></p></td>
+       <td><p><br/></p></td>
+      </tr>
+      <tr>
+       <td><p>0xFFF</p></td>
+       <td><p>VT_TYPEMASK</p></td>
+       <td><p><br/></p></td>
+       <td><p><br/></p></td>
+      </tr>
+    </table>
+   </s2>
+
+
+
+   <s2 title="References">
+
+    <p>In order to assemble the HPSF description I used information publically
+     available on the Internet only. The references given below have been very
+     helpful. If you have any amendments or corrections, please let us know!
+     Thank you!</p>
+
+   <ol>
+
+    <li>
+     <p>In
+      <link href="http://www.kyler.com/pubs/ddj9894.html"><em>Understanding OLE
+        documents</em></link>, Ken Kyler gives an introduction to OLE2
+       documents
+      and especially to property sets. He names the property names, types, and
+      IDs of the Summary Information and Document Summary Information
+      stream.</p>
+    </li>
+
+    <li>
+     <p>The
+      <link href="http://www.dwam.net/docs/oleref/"><em>ActiveX Programmer's
+       Reference</em></link> at
+      <link href="http://www.dwam.net/docs/oleref/">http://www.dwam.net/docs/oleref/</link>
+      seems a little outdated, but that's what I have found.</p>
+    </li>
+
+    <li>
+     <p>An overview of the <code>VT_</code> types is in
+      <link href="http://www.marin.clara.net/COM/variant_type_definitions.htm"><em>Variant
+       Type Definitions</em></link>.</p>
+    </li>
+
+    <li>
+     <p>What is a <code>FILETIME</code>? The answer can be found for example under
+      <link href="http://www.vbapi.com/ref/f/filetime.html">http://www.vbapi.com/ref/f/filetime.html</link>
+      or
+      <link href="http://www.cs.rpi.edu/courses/fall01/os/FILETIME.html">http://www.cs.rpi.edu/courses/fall01/os/FILETIME.html</link>. In
+      short:
+      <em>The FILETIME structure holds a date and time associated with a file.
+       The structure identifies a 64-bit integer specifying the number of
+       100-nanosecond intervals which have passed since January 1, 1601. This
+       64-bit value is split into the two dwords stored in the
+       structure.</em></p>
+           </li>
+
+     <li>
+      <p>This documentation origins from the <link href="http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html">HPSF description</link> available at <link href="http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html">http://www.rainer-klute.de/~klute/Software/poibrowser/doc/HPSF-Description.html</link>.</p>
+     </li>
+    </ol>
+   </s2>
+  </s1>
+ </body>
 </document>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: xml
+sgml-omittag:nil
+sgml-shorttag:nil
+sgml-namecase-general:nil
+sgml-general-insert-case:lower
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
diff --git a/src/documentation/xdocs/hpsf/todo.xml b/src/documentation/xdocs/hpsf/todo.xml
new file mode 100644 (file)
index 0000000..c20844b
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.0//EN" "../dtd/document-v10.dtd">
+<document>
+ <header>
+  <title>To Do</title>
+  <authors>
+   <person name="Rainer Klute" email="klute@rainer-klute.de"/>
+  </authors>
+ </header>
+ <body>
+  <s1 title="To Do">
+
+   <p>The following functionalities should be added to HPFS:</p>
+
+   <ol>
+    <li>
+     <p>Add writing capability for property sets.</p>
+    </li>
+    <li>
+     <p>Add codepage support.</p>
+    </li>
+    <li>
+     <p>Add Unicode support.</p>
+    </li>
+    <li>
+     <p>Add resource bundles to
+      <code>org.apache.poi.hpsf.wellknown</code> to ease
+      localizations.</p>
+    </li>
+   </ol>
+  </s1>
+ </body>
+</document>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: xml
+sgml-omittag:nil
+sgml-shorttag:nil
+sgml-namecase-general:nil
+sgml-general-insert-case:lower
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->