From 50836090d6d00a6ac608cb5bb896302c41becf90 Mon Sep 17 00:00:00 2001 From: mjohnson Date: Tue, 19 Feb 2002 04:03:10 +0000 Subject: [PATCH] updated poifs docs git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352106 13f79535-47bb-0310-9956-ffa450edef68 --- .../images/BlockClassDiagram.gif | Bin 0 -> 7922 bytes src/documentation/images/POIFSAddDocument.gif | Bin 0 -> 6982 bytes .../images/POIFSClassDiagram.gif | Bin 0 -> 13412 bytes .../images/POIFSInitialization.gif | Bin 0 -> 2473 bytes src/documentation/images/POIFSLifeCycle.gif | Bin 0 -> 1813 bytes .../images/POIFSPropertyTablePreWrite.gif | Bin 0 -> 4777 bytes .../images/POIFSRootPropertyPreWrite.gif | Bin 0 -> 1855 bytes .../images/POIFSWriteArchive.gif | Bin 0 -> 9591 bytes .../images/POIFSWriteFilesystem.gif | Bin 0 -> 9603 bytes src/documentation/images/PropertySet.jpg | Bin 0 -> 17843 bytes .../images/PropertyTableClassDiagram.gif | Bin 0 -> 11195 bytes src/documentation/images/made-with-cocoon.png | Bin 0 -> 2086 bytes src/documentation/images/utilClasses.gif | Bin 0 -> 20250 bytes src/documentation/xdocs/poifs/book.xml | 1 + src/documentation/xdocs/poifs/fileformat.xml | 666 ++++++++++++++ .../xdocs/poifs/html/POIFSFormat.html | 837 ------------------ 16 files changed, 667 insertions(+), 837 deletions(-) create mode 100644 src/documentation/images/BlockClassDiagram.gif create mode 100644 src/documentation/images/POIFSAddDocument.gif create mode 100644 src/documentation/images/POIFSClassDiagram.gif create mode 100644 src/documentation/images/POIFSInitialization.gif create mode 100644 src/documentation/images/POIFSLifeCycle.gif create mode 100644 src/documentation/images/POIFSPropertyTablePreWrite.gif create mode 100644 src/documentation/images/POIFSRootPropertyPreWrite.gif create mode 100644 src/documentation/images/POIFSWriteArchive.gif create mode 100644 src/documentation/images/POIFSWriteFilesystem.gif create mode 100644 src/documentation/images/PropertySet.jpg create mode 100644 src/documentation/images/PropertyTableClassDiagram.gif create mode 100644 src/documentation/images/made-with-cocoon.png create mode 100644 src/documentation/images/utilClasses.gif create mode 100644 src/documentation/xdocs/poifs/fileformat.xml delete mode 100755 src/documentation/xdocs/poifs/html/POIFSFormat.html diff --git a/src/documentation/images/BlockClassDiagram.gif b/src/documentation/images/BlockClassDiagram.gif new file mode 100644 index 0000000000000000000000000000000000000000..2433adc92c61d38e78ac81160385f63190eae38f GIT binary patch literal 7922 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 literal 0 HcmV?d00001 diff --git a/src/documentation/images/POIFSAddDocument.gif b/src/documentation/images/POIFSAddDocument.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9b200282495842a58e8eb5263515e6e51765558 GIT binary patch literal 6982 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 G002Axscp9a literal 0 HcmV?d00001 diff --git a/src/documentation/images/POIFSInitialization.gif b/src/documentation/images/POIFSInitialization.gif new file mode 100644 index 0000000000000000000000000000000000000000..d23bf292260283341943d2d521855ed906c08010 GIT binary patch literal 2473 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 Dn)sTs literal 0 HcmV?d00001 diff --git a/src/documentation/images/POIFSPropertyTablePreWrite.gif b/src/documentation/images/POIFSPropertyTablePreWrite.gif new file mode 100644 index 0000000000000000000000000000000000000000..801c1d8a1489cdd4d7309c6637cc039b6cfa7909 GIT binary patch literal 4777 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 literal 0 HcmV?d00001 diff --git a/src/documentation/images/POIFSWriteArchive.gif b/src/documentation/images/POIFSWriteArchive.gif new file mode 100644 index 0000000000000000000000000000000000000000..eac7fd7a2e5167c6d2a290fdddc0e83213778051 GIT binary patch literal 9591 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 literal 0 HcmV?d00001 diff --git a/src/documentation/images/POIFSWriteFilesystem.gif b/src/documentation/images/POIFSWriteFilesystem.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5011a0f728d3ca2bd119bc39bb215457413a5ac GIT binary patch literal 9603 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 Z9sltmKk_Ai@+rUaE&uW{A8-l)06RrB7gYcN literal 0 HcmV?d00001 diff --git a/src/documentation/images/made-with-cocoon.png b/src/documentation/images/made-with-cocoon.png new file mode 100644 index 0000000000000000000000000000000000000000..e409cb413b99a7f38af333f542cc9d5f02c48eac GIT binary patch literal 2086 zcmV+>2-)|EP)(_FA0NHBTpN-AX(x@}U-vuTIlpu6x#xV}xfrhhHf#cb^+gBpzk<&@ z5iL!|htjXB(gQ$aLk$2JbXtQ>`$)oCe~#B%HMh34cPV8O zr`z{Z>stVzDN-wC5`#{QbY6MmA^;e4TEb=rfGM|6gR3c?NtahH6<6rAN|^+yS!@mf zu-F_&mlkDQK2az;=Ufzq)G+Ss|l-}u-X;0Q^R6&$Yo-u%STx42A#I;QrAlS zj{8)`JT8kPD>t#45^kIoc|q@~Gt zthtris;kmdnsI3#3TsS637$9U@}hf@u|>st;q(c5B33eKY^br=9O!11OT{fs#=}22 z^&m0CCVD+sV`~_6+D?-hjeYAh(co(8eVlIJ17=~vvBru}$|M$>W6I^LtJb5-f&$eY zj4!{E$?AuHU6sCKh5rls*11cU8DTsu){=-4JP*|{eD+^J2h|!6ZbC<6Lk(&Z1bY25 ze%Lm)HP(`d`s(sy&8_H5)>Y|I&9B*{!(^sTK{R)LAy`Wy2&?86@?I_AurOPlD z#`HTK`0$g#&|;X9Xp0N7GPW?eNSJbYd;3Si;Rpb1%ge&^RlpD4>l86ltd+Ru+l1nl9Fp=dO^%sYk^6l`6Hu#UWN#^(>d_@lZ)Rodw2XspvTNm{|y zZ7-buqp5e05-wFlPKLa;a_@m>zBW8DlPE}w8#Dm$MbbQ#^1xSil^gUoJ)tC_1eWJK zF){JPvG0BB!0sRa^7ruo?b}cFH3|hE!E?3TF2ZO#k!RuM#xfbvDpSE{ZZw%(q-&yR!!x; zzhAz3rEmCW#)I>|iNgE?SG&7CA+AilV|C8L-1PUlx=4{qo{7`tJZ@5zq3o~!ywXG1 zx5`ue&hdiW%+AXliE{j#hrjXBr-PGsn8R2PF`|_4W@p?0fU#I2MQ$Q5Io9KqPaH?; z4h5WcVdmpVa<9orlH_m&t49m~BmfJ;xXH|_AxW6^d#0{`OahQV0!c=rBmfA+>G$U( zNfw)($Ya(*BocAocDQf$V;BGc8I43qlEq?ig_4EYz!>qbSSl8a1tdfk7h< z`QXggYmah8`GnQpW3m6~OtWXkzmoe;`>((F+rOB4ukG7a-2Udv)BYd{Btu6e5ZrK# zoO!*KuiDdLGVk5B{q5IJ`tAl|*^&i<+s;dio{C1v#c()Q2Z1EXa5zHuv}~Y~ z2|%1M7Y)tFS^_|DHrRi|Bh4)V0A(_yu;(Ko=KZn|S|A3j3F6!oc@8>9<$_2G79^vQ zxSW$yleg!1B6%(bkd+Ea5kDDWY6gPAK1;ticPC#Y2LKiZDiO&E`ytBw3^Ow`7VAiA zb_qXKo|mQUfBzpz>BXExUaVgZo1G)$_H_SyOTIQvBL1JTIaw}YGZ9PpFC@-&BaJci Q=>Px#07*qoM6N<$f}id5bN~PV literal 0 HcmV?d00001 diff --git a/src/documentation/images/utilClasses.gif b/src/documentation/images/utilClasses.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cb07b79a5758429de74228240e54c7989bc0aba GIT binary patch literal 20250 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 literal 0 HcmV?d00001 diff --git a/src/documentation/xdocs/poifs/book.xml b/src/documentation/xdocs/poifs/book.xml index 7a7262409..9ee98e5fd 100644 --- a/src/documentation/xdocs/poifs/book.xml +++ b/src/documentation/xdocs/poifs/book.xml @@ -8,6 +8,7 @@ + diff --git a/src/documentation/xdocs/poifs/fileformat.xml b/src/documentation/xdocs/poifs/fileformat.xml new file mode 100644 index 000000000..506d0dfac --- /dev/null +++ b/src/documentation/xdocs/poifs/fileformat.xml @@ -0,0 +1,666 @@ + + + +
+ + + +
+ + + +

POIFS file systems are essentially normal files stored on a + Java-compatible platform's native file system. They are + typically identified by names ending in a four character + extension noting what type of data they contain. For + example, a file ending in ".xls" would likely + contain spreadsheet data, and a file ending in + ".doc" would probably contain a word processing + document. POIFS file systems are called "file + system", because they contain multiple embedded files + in a manner similar to traditional file systems. Along + functional lines, it would be more accurate to call these + POIFS archives. For the remainder of this document it is + referred to as a file system in order to avoid confusion + with the "files" it contains.

+

POIFS file systems are compatible with those document + formats used by a well-known software company's popular + office productivity suite and programs outputting + compatible data. Because the POIFS file system does not + provide compression, encryption or any other worthwhile + feature, its not a good choice unless you require + interoperability with these programs.

+

The POIFS file system does not encode the documents + themselves. For example, if you had a word processor file + with the extension ".doc", you would actually + have a POIFS file system with a document file archived + inside of that file system.

+
+ +

This document utilizes the numeric types as described by + the Java Language Specification, which can be found at + http://java.sun.com. In + short:

+
    +
  • A byte is an 8 bit signed integer ranging from + -128 to 127.
  • +
  • A short is a 16 bit signed integer ranging from + -32768 to 32767
  • +
  • An int is a 32 bit signed integer ranging from + -2147483648 to 2147483647
  • +
  • A long is a 64 bit signed integer ranging from + -9.22E18 to 9.22E18.
  • +
+

The Java Language Specification spells out a number of + other types that are not referred to by this document.

+

Where this document makes references to "endian + conversion" it is referring to the byte order of + stored numbers. Numbers in "little-endian order" + are stored with the least significant byte first. In + order to properly read a short, for example, you'd read two + bytes and then shift the second byte 8 bits to the left + before performing an or operation to it + against the first byte. The following code illustrates this + method:

+ +public int getShort (byte[] rec) +{ + return ((rec[1] << 8) | (rec[0] & 0x00ff)); +} +
+ +

This is a walkthrough of a POIFS file system and how it is + put together. It is not intended to give a concise + description but to give a "big picture" of the + general structure and how it's interpreted.

+

A POIFS file system begins with a header. This header + identifies locations in the file by function and provides a + sanity check identifying a file as a POIFS file system.

+

The first 64 bits of the header compose a magic number + identifier. This identifier tells the client software + that this is indeed a POIFS file system and that it should + be treated as such. This is a "sanity check" to + make sure this is a POIFS file system and not some other + format. The header also contains an array of block + numbers. These block numbers refer to blocks in the + file. When these blocks are read together they form the + Block Allocation Table. The header also contains a + pointer to the first element in the property table, + also known as the root element, and a pointer to the + small Block Allocation Table (SBAT).

+

The block allocation table or BAT, along with + the property table, specify which blocks in the file + system belong to which files. After the header block, the + file system is divided into identically sized blocks of + data, numbered from 0 to however many blocks there are in + the file system. For each file in the file system, its + entry in the property table includes the index of the first + block in the array of blocks. Each block's index into the + array of blocks is also its index into the BAT, and the + integer value stored at that index in the BAT gives the + index of the next block in the array (and thus the index of + the next BAT value). A special value is stored in the BAT + to indicate "end of file".

+

The property table is essentially the directory + storage for the file system. It consists of the name of the + file or directory, its start block in both the file + system and BAT, and its actual size. The first + property in the property table is the root + element. It has two purposes: to be a directory entry + (the root of the directory tree, to be specific), and to + hold the start block for the small block data.

+

Small block data is a special file that contains the data + for small files (less than 4K bytes). It subdivides its + blocks into smaller blocks and there is a special small + block allocation table that, like the main BAT for larger + files, is used to map a small file to its small blocks.

+
+ +

The POIFS file system begins with a header + block. The first 64 bits of the header form a long + file type id or magic number identifier of + 0xE11AB1A1E011CFD0L. This is basically a + sanity check. If this isn't the first thing in the header + (and consequently the file system) then this is not a + POIFS file system and should be read with some other + library.

+

It's important to know the most important parts of the + header. These are discussed in the rest of this + section.

+ +

At offset 0x2C is an int specifying the number + of elements in the BAT array. The array at + 0x4C an array of ints. This array contains the + indices of every block in the Block Allocation + Table.

+
+ +

Very large POIFS archives may have more blocks than can + be addressed by the BAT blocks enumerated in the header + block. How large? Well, the BAT array in the header can + contain up to 109 BAT block indices; each BAT block + references up to 128 blocks, and each block is 512 + bytes, so we're talking about 109 * 128 * 512 = + 6.8MB. That's a pretty respectable document! But, you + could have much more data than that, and in today's + world of cheap gigabyte drives, why not? So, the BAT + may be extended in that event. The integer value at + offset 0x44 of the header is the index of the + first extended BAT (XBAT) block. At offset + 0x48 of the header, there is an int value that + specifies how many XBAT blocks there are. The XBAT + blocks begin at the specified index into the array of + blocks making up the POIFS file system, and continue in + sequence for the specified count of XBAT blocks.

+

Each XBAT block contains the indices of up to 128 BAT + blocks, so the document size can be expanded by another + 8MB for each XBAT block. The BAT blocks indexed by an + XBAT block are appended to the end of the list of BAT + blocks enumerated in the header block. Thus the BAT + blocks enumerated in the header block are BAT blocks 0 + through 108, the BAT blocks enumerated in the first + XBAT block are BAT blocks 109 through 236, the BAT + blocks enumerated in the second XBAT block are BAT + blocks 237 through 364, and so on.

+

Through the use of XBAT blocks, the limit on the + overall document size is that imposed by the 4-byte + block indices; if the indices are unsigned ints, the + maximum file size is 2 terabytes, 1 terabyte if the + indices are treated as signed ints. Either way, I have + yet to see a disk drive large enough to accommodate + such a file on the shelves at the local office supply + stores.

+
+ +

If a file contained in a POIFS archive is smaller than + 4096 bytes, it is stored in small blocks. Small blocks + are 64 bytes in length and are contained within big + blocks, up to 8 to a big block. As the main BAT is used + to navigate the array of big blocks, so the small + block allocation table is used to navigate the + array of small blocks. The SBAT's start block index is + found at offset 0x3C of the header block, and + remaining blocks constituting the SBAT are found by + walking the main BAT as if it were an ordinary file in + the POIFS file system (this process is described + below).

+
+ +

An integer at address 0x30 specifies the start + index of the property table. This integer is specified + as a "block index". The Property Table + is stored, as is almost everything in a POIFS file + system, in big blocks and walked via the BAT. The + Property Table is described below.

+
+
+ +

The property table is essentially nothing more than the + directory system. Properties are 128 byte records + contained within the 512 byte blocks. The first property + is always the Root Entry. The following applies to + individual properties within a property table:

+
    +
  • At offset 0x00 in the property is the + "name". This is stored as an + uncompressed 16 bit unicode string. In short every + other byte corresponds to an "ASCII" + character. The size of this string is stored at offset + 0x40 (string size) as a short.
  • +
  • At offset 0x42 is the property type + (byte). The type is 1 for directory, 2 for file or 5 + for the Root Entry.
  • +
  • At offset 0x43 is the node color + (byte). The color is either 1, (black), or 0, + (red). Properties are apparently meant to be arranged + in a red-black binary tree, subject to the following + rules: +
      +
    1. The root of the tree is always black
    2. +
    3. Two consecutive nodes cannot both be red
    4. +
    5. A property is less than another property if its + name length is less than the other property's name + length
    6. +
    7. If two properties have the same name length, the + sort order is determined by the sort order of the + properties' names.
    8. +
  • +
  • At offset 0x44 is the index (int) of the + previous property.
  • +
  • At offset 0x48 is the index (int) of the + next property.
  • +
  • At offset 0x4C is the index (int) of the + first directory entry. This is used by + directory entries.
  • +
  • At offset 0x74 is an integer giving the + start block for the file described by this + property. This index corresponds to an index in the + array of indices that is the Block Allocation Table + (or the Small Block Allocation Table) as well as the + index of the first block in the file. This is used by + files and the root entry.
  • +
  • At offset 0x78 is an integer giving the total + actual size of the file pointed at by this + property. If the file size is less than 4096, the file + is stored in small blocks and the SBAT is used to walk + the small blocks making up the file. If the file size + is 4096 or larger, the file is stored in big blocks + and the main BAT is used to walk the big blocks making + up the file. The exception to this rule is the Root + Entry, which, regardless of its size, is + always stored in big blocks and the main BAT is + used to walk the big blocks making up this special + file.
  • +
+
+ +

The Root Entry in the Property Table + contains the information necessary to read and write + small files, which are files less than 4096 bytes + long. The start block field of the Root Entry is the + start index of the Small Block Array, which is + read like any other file in the POIFS file system. Since + the SBAT cannot be used without the Small Block Array, + the Root Entry MUST be read or written using the Block + Allocation Table. The blocks making up the Small + Block Array are divided into 64-byte small blocks, up to + the size indicated in the Root Entry (which should always + be a multiple of 64).

+
+ +

The individual properties form a directory tree, with the + Root Entry as the directory tree's root, as shown + in the accompanying drawing. Note the numbers in + parentheses in each node; they represent the node's index + in the array of properties. The NEXT_PROP, + PREVIOUS_PROP, and CHILD_PROP fields hold + these indices, and are used to navigate the tree.

+ +

Each directory entry (i.e., a property whose type is + directory or root entry) uses its + CHILD_PROP field to point to one of its + subordinate (child) properties. It doesn't seem to matter + which of its children it points to. Thus in the previous + drawing, the Root Entry's CHILD_PROP field may contain 1, + 4, or the index of one of its other children. Similarly, + the directory node (index 1) may have, in its CHILD_PROP + field, 2, 3, or the index of one of its other + children.

+

The children of a given directory property point to each + other in a similar fashion by using their + NEXT_PROP and PREVIOUS_PROP fields.

+

Unused NEXT_PROP, PREVIOUS_PROP, and + CHILD_PROP fields contain the marker value of + -1. All file properties have a value of -1 for their + CHILD_PROP fields for example.

+
+ +

The BAT blocks are pointed at by the bat array + contained in the header and supplemented, if necessary, + by the XBAT blocks. These blocks form a large + table of integers. These integers are block numbers. The + Block Allocation Table holds chains of integers. + These chains are terminated with -2. The elements in + these chains refer to blocks in the files. The starting + block of a file is NOT specified in the BAT. It is + specified by the property for a given file. The + elements in this BAT are both the block number (within + the file minus the header) and the number of the + next BAT element in the chain. This can be thought of as + a linked list of blocks. The BAT array contains the links + from one block to the next, including the end of chain + marker.

+

Here's an example: Let's assume that the BAT begins as + follows:

+

BAT[ 0 ] = 2

+

BAT[ 1 ] = 5

+

BAT[ 2 ] = 3

+

BAT[ 3 ] = 4

+

BAT[ 4 ] = 6

+

BAT[ 5 ] = -2

+

BAT[ 6 ] = 7

+

BAT[ 7 ] = -2

+

...

+

Now, if we have a file whose Property Table entry says it + begins with index 0, we walk the BAT array and see that + the file consists of blocks 0 (because the start block is + 0), 2 (because BAT[ 0 ] is 2), 3 (BAT[ 2 ] is 3), 4 (BAT[ + 3 ] is 4), 6 (BAT[ 4 ] is 6), and 7 (BAT[ 6 ] is 7). It + ends at block 7 because BAT[ 7 ] is -2, which is the end + of chain marker.

+

Similarly, a file beginning at index 1 consists of + blocks 1 and 5.

+

Other special numbers in a BAT array are:

+
    +
  • -1, which indicates an unused block
  • +
  • -3, which indicates a "special" block, such + as a block used to make up the Small Block Array, the + Property Table, the main BAT, or the SBAT
  • +
+
+ +

The following outlines the basic file system structures.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescriptionOffsetLengthDefault value or const
FILETYPEMagic number identifying this as a POIFS file + system.0x0000Long0xE11AB1A1E011CFD0
UK1Unknown constant0x0008Integer0
UK2Unknown Constant0x000CInteger0
UK3Unknown Constant0x0014Integer0
UK4Unknown Constant (revision?)0x0018Short0x003B
UK5Unknown Constant (version?)0x001AShort0x0003
UK6Unknown Constant0x001CShort-2
LOG_2_BIG_BLOCK_SIZELog, base 2, of the big block size0x001EShort9 (2 ^ 9 = 512 bytes)
LOG_2_SMALL_BLOCK_SIZELog, base 2, of the small block size0x0020Integer6 (2 ^ 6 = 64 bytes)
UK7Unknown Constant0x0024Integer0
UK8Unknown Constant0x0028Integer0
BAT_COUNTNumber of elements in the BAT array0x002CIntegerrequired
PROPERTIES_STARTBlock index of the first block of the property + table0x0030Integerrequired
UK9Unknown Constant0x0034Integer0
UK10Unknown Constant0x0038Integer0x00001000
SBAT_STARTBlock index of first big block containing the small + block allocation table (SBAT)0x003CInteger-2
UK11Unknown Constant0x0040Integer1
XBAT_STARTBlock index of the first block in the Extended Block + Allocation Table (XBAT)0x0044Integer-2
XBAT_COUNTNumber of elements in the Extended Block Allocation + Table (to be added to the BAT)0x0048Integer0
BAT_ARRAYArray of block indices constituting the Block + Allocation Table (BAT)0x004C, 0x0050, 0x0054 ... 0x01FCInteger[]-1 for unused elements, at least first element must + be filled.
N/AHeader block data not otherwise described in this + tableN/AN/A-1
+
+ + + + + + + + + + + + + + + + +
FieldDescriptionOffsetLengthDefault value or const
BAT_ELEMENTAny given element in the BAT block0x0000, 0x0004, 0x0008, ... 0x01FCInteger +
    +
  • -1 = unused
  • +
  • -2 = end of chain
  • +
  • -3 = special (e.g., BAT block)
  • +
+

All other values point to the next element in the + chain and the next index of a block composing the + file.

+
+
+ + + + + + + + + + + + + + + + +
FieldDescriptionOffsetLengthDefault value or const
Properties[]This block contains the properties.0x0000, 0x0080, 0x0100, 0x0180128 bytesAll unused space is set to -1.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescriptionOffsetLengthDefault value or const
NAMEA unicode null-terminated uncompressed 16bit string + (lose the high bytes) containing the name of the + property.0x00, 0x02, 0x04, ... 0x3EShort[]0x0000 for unused elements, field required, 32 + (0x40) element max
NAME_SIZENumber of characters in the NAME field0x40ShortRequired
PROPERTY_TYPEProperty type (directory, file, or root)0x42Byte1 (directory), 2 (file), or 5 (root entry)
NODE_COLORNode color0x43Byte0 (red) or 1 (black)
PREVIOUS_PROPPrevious property index0x44Integer-1
NEXT_PROPNext property index0x48Integer-1
CHILD_PROPFirst child property index0x4cInteger-1
SECONDS_1Seconds component of the created timestamp?0x64Integer0
DAYS_1Days component of the created timestamp?0x68Integer0
SECONDS_2Seconds component of the modified timestamp?0x6CInteger0
DAYS_2Days component of the modified timestamp?0x70Integer0
START_BLOCKStarting block of the file, used as the first block + in the file and the pointer to the next block from + the BAT0x74IntegerRequired
SIZEActual size of the file this property points + to. (used to truncate the blocks to the real + size).0x78Integer0
+
+
+
+ +
diff --git a/src/documentation/xdocs/poifs/html/POIFSFormat.html b/src/documentation/xdocs/poifs/html/POIFSFormat.html deleted file mode 100755 index a1ec87ad7..000000000 --- a/src/documentation/xdocs/poifs/html/POIFSFormat.html +++ /dev/null @@ -1,837 +0,0 @@ - - - - - - - - - - - - - -

POI Filesystem format

-

Introduction

-

- The POI file format is essentially an archive wrapper - around files. It is intended to mimic a filesystem. For - the remainder of this document it is referred to as a - filesystem in order to avoid confusion with the - "files" it contains. -

-

- POI filesystems are compatible with those document formats - used by a well-known software company's popular office - productivity suite and programs outputting compatible - data. Because the POI filesystem does not provide - compression, encryption or any other worthwhile feature, - its not a good choice unless you require interoperability - with these programs. -

-

- The POI filesystem does not encode the documents - themselves. For example, if you had a word processor file - with the extension ".doc", you would actually - have a POI filesystem with a document file archived inside - of the filesystem. -

-

Document Conventions

-

- This document utilizes the numeric types as described by - the Java Language Specification, which can be found at - java.sun.com. In short: -

-
    -
  • -

    - a byte is an 8 bit signed integer ranging from - (-128) to 127. -

    -
  • -
  • -

    - a short is a 16 bit signed integer ranging from - (-32768) to 32767 -

    -
  • -
  • -

    - an int is a 32 bit signed integer ranging from - (-2.14e+9) to 2.14e+9 -

    -
  • -
  • -

    - a long is a 64 bit signed integer ranging from - (-9.22e+18) to 9.22e+18 -

    -
  • -
-

- The Java Language Specification spells out a number of - other types that are not referred to by this document. -

-

- Where this document makes references to "endian - conversion" it is referring to the byte order of - stored numbers. Numbers in "little-endian order" - are stored with the LEAST significant byte first. In order - to properly read a short, for example, you'd read two - bytes and then shift the second byte 8 bits to the left - before performing an or operation to it - against the first byte while stripping the - "sign" from the first byte. The following code - illustrates this method: -

-

- public int getShort (byte[ ] rec) - { -

-

- return ( - (rec[1] << 8) | (rec[0] & 0xff) - ); -

-

- } -

-

Filesystem Introduction

-

- POI filesystems are essentially normal files stored on a - Java-compatible platform's native filesystem. They are - identified by names ending in a four character identifier - noting what type of data they contain. For example, a file - ending in ".xls" would likely contain - spreadsheet data, and a file ending in ".doc" - would probably contain a word processing document. POI - filesystems are called "filesystem", because - they contain multiple embedded files in a manner similar - to traditional filesystems. Along functional lines, it - would be more accurate to call these POI archives. -

-

- POI filesystems do not provide encryption, compression, or - any other feature of a modern archive and are therefore a - poor choice for implementing new file formats. It is - suggested that POI filesystems are most useful for - interoperability with legacy applications that use a - compatible file format. -

-

Filesystem Walkthrough

-

- This is a walkthrough of a POI filesystem and how it is - put together. It is not intended to give a concise - description but to give a "big picture" of the - general structure and how it's interpreted. -

-
-

- The first 64 bits of the header compose a magic - number identifier. This identifier tells the - client software that this is indeed a POI filesystem and - that it should be treated as such. This is a "sanity - check" to make sure this is a POI filesystem and not - some other format. The header also contains an array - of block numbers. These block numbers refer to - blocks in the file. When these blocks are read together - they form the Block Allocation - Table. The header also contains a pointer to - the first element in the property table - also known as the root - element, and a pointer to the small Block - Allocation Table (SBAT). -

-

- The block allocation - table or BAT, along with the property table - specify which blocks in the filesystem belong to which - files. It is somewhat hard to conceptualize the Block - Allocation Table at first. The block allocation table is - essentially an array of integers that point at each - other. These elements form chains. -

-

- To read the block allocation - table you must first read the start - block of the file from the property - table. This is both your index for the next - element in the BAT array as well as the - index of the first block in your file. For instance: if - the start block from your file's property is - 0 then you read block 0 (the first block after the header) - from your filesystem as the first block of your file. You - also read element 0 from the BAT array. - Supposing this element has a value equal to 2, you'd read - block 2 from your filesystem as the next block of your - file and element 2 from your BAT array. - This will be covered further later in this document. -

-

- The Property - Table is essentially the directory structure - for the filesystem. It consists of the name of the file or - directory, its start block in both the - filesystem and BAT, and its actual size. - The first property in the property table is the root element. Its real - purpose is to hold the start block for the small - blocks. -

-

Filesystem Structure

-

- All values in the POI filesystem are stored in - "little-endian" order, meaning you must reverse - the order of the bytes before assigning them to - variables. Assume the values you see below are originally - stored backwards. -

-

- The POI filesystem is divided into 512 byte blocks. Each - block has an implicit block-type. The order and - description of these is described below. -

-

Header Block

-

- The POI filesystem begins with a header - block. The first 64 bits of the header form a long - file type id or magic number - identifier of - 0xE11AB1A1E011CFD0L. This is basically a - sanity check. If this isn't the first thing in the header - (and consequently the filesystem) then this is not a POI - filesystem and should be read with some other library. -

-

- It's important to know the most important parts of the - header. These are discussed in the rest of this - section. -

-

BATs

-

- At offset 0x2c is an int specifying the number of - elements in the BAT array. The array at - 0x4c an array of ints. This array contains the - indices of every block in the Block - Allocation Table. -

-

XBATs

-

- Very large POI archives may have more blocks than can be - addressed by the BAT blocks enumerated in the header - block. How large? Well, the BAT array in the header can - contain up to 109 BAT block indices; each BAT block - references up to 128 blocks, and each block is 512 bytes, - so we're talking about 109 * 128 * 512 = 6.8MB. That's a - pretty respectable document! But, you could have much more - data than that, and in today's world of cheap gigabyte - drives, why not? So, the BAT may be extended in that - event. The integer value at offset 0x44 of the - header is the index of the first extended BAT (XBAT) - block. At offset 0x48 of the header, there - is an int value that specifies how many XBAT blocks there - are. The XBAT blocks begin at the specified index into the - array of blocks making up the POI filesystem, and continue - in sequence for the specified count of XBAT blocks. -

-

- Each XBAT block contains the indices of up to 128 BAT - blocks, so the document size can be expanded by another - 8MB for each XBAT block. The BAT blocks indexed by an XBAT - block are appended to the end of the list of BAT blocks - enumerated in the header block. Thus the BAT blocks - enumerated in the header block are BAT blocks 0 through - 108, the BAT blocks enumerated in the first XBAT block are - BAT blocks 109 through 236, the BAT blocks enumerated in - the second XBAT block are BAT blocks 237 through 364, and - so on. -

-

- Through the use of XBAT blocks, the limit on the overall - document size is that imposed by the 4-byte block indices; - if the indices are unsigned ints, the maximum file size is - 2 terabytes, 1 terabyte if the indices are treated as - signed ints. Either way, I have yet to see a disk drive - large enough to accommodate such a file on the shelves at - the local office supply stores. -

-

SBATs

-

- If a file contained in a POI archive is smaller than 4096 - bytes, it is stored in small blocks. Small blocks are 64 - bytes in length and are contained within big blocks, up to - 8 to a big block. As the main BAT is used to navigate the - array of big blocks, so the small block allocation - table is used to navigate the array of small - blocks. The SBAT's start block index is found at offset - 0x3C of the header block, and remaining blocks - constituting the SBAT are found by walking the main BAT as - if it were an ordinary file in the POI filesystem (this - process is described below). -

-

Property Table Start Index

-

- An integer at address 0x30 specifies the start - index of the property - table. This integer is specified as a - "block index". The Property Table is stored, as is - almost everything in a POI file system, in big blocks and - walked via the BAT. The Property - Table is described below. -

-

Property Table

-

- The property table is essentially nothing more than the - directory system. Properties are 128 byte records - contained within the 512 byte blocks. The first property - is always the Root Entry. The - following applies to individual properties within a - property table: -

-

- At offset 0x00 in the property is the - "name". This is stored as an - uncompressed 16 bit unicode string. In short every other - byte corresponds to an "ASCII" character. The - size of this string is stored at offset 0x40 - (string size) as a short. -

-

- At offset 0x42 is the property type - (byte). The type is 1 for directory, 2 for file or 5 for - the Root Entry. -

-

- At offset 0x43 is the node color - (byte). The color is either 1, (black), or 0, - (red). Properties are apparently meant to be arranged in a - red-black binary tree, subject to the following rules: - -

    -
  1. The root of the tree is always black -
  2. Two consecutive nodes cannot both be red -
  3. A property is less than another property if its - name length is less than the other property's name - length -
  4. If two properties have the same name length, the - sort order is determined by the sort order of the - properties' names. -
-

-

- At offset 0x44 is the index (int) of the - previous property. -

-

- At offset 0x48 is the index (int) of the next - property. -

-

- At offset 0x4C is the index (int) of the - first directory entry. -

-

- At offset 0x74 is an integer giving the start - block for the file described by this - property. This index corresponds to an index in the array - of indices that is the Block Allocation Table (or the - Small Block Allocation Table) as well as the index of the - first block in the file. -

-

- At offset 0x78 is an integer giving the total - actual size of the file pointed at by this - property. If the file size is less than 4096, the file is - stored in small blocks and the SBAT is used to walk the - small blocks making up the file. If the file size is 4096 - or larger, the file is stored in big blocks and the main - BAT is used to walk the big blocks making up the file. The - exception to this rule is the Root Entry, - which, regardless of its size, is ALWAYS stored in big - blocks and the main BAT is used to walk the big blocks - making up this special file. -

-

Root Entry

-

- The Root Entry in the Property Table - contains the information necessary to read and write small - files, which are files less than 4096 bytes long. The - start block field of the Root Entry is the start index of - the Small Block Array, which is read like - any other file in the POI filesysstem. Since the SBAT - cannot be used without the Small Block Array, the Root - Entry MUST be read or written using the Block Allocation Table. The - blocks making up the Small Block Array are divided into - 64-byte small blocks, up to the size indicated in the Root - Entry (which should always be a multiple of 64) -

-

Walking the Nodes of the Property - Table

-

- The individual properties form a directory tree, with the - Root Entry as the directory tree's root, as - shown in the accompanying drawing. Note the numbers in - parentheses in each node; they represent the node's index - in the array of properties. The NEXT_PROP, - PREVIOUS_PROP, and CHILD_PROP fields hold - these indices, and are used to navigate the tree. -

-

- -

-

- Each directory entry (i.e., a - property whose type is directory or - root entry) uses its CHILD_PROP field - to point to one of its subordinate (child) properties. It - doesn't seem to matter which of its children it points - to. Thus in the previous drawing, the Root Entry's - CHILD_PROP field may contain 1, 4, or the index of one of - its other children. Similarly, the directory node (index - 1) may have, in its CHILD_PROP field, 2, 3, or the index - of one of its other children. -

-

- The children of a given directory property point to - each other in a similar fashion by using their - NEXT_PROP and PREVIOUS_PROP fields. The - ordering of the children is governed by rules described here -

-

- Unused NEXT_PROP, PREVIOUS_PROP, and - CHILD_PROP fields contain the marker value of - -1. All file properties have a value of -1 for their - CHILD_PROP fields for example. -

-

Block Allocation Table

-

- The BAT blocks are pointed at by the bat - array contained in the header - and supplemented, if necessary, by the XBAT - blocks. These blocks form a large table of - integers. These integers are block numbers. The - Block Allocation Table holds chains of - integers. These chains are terminated with -2. The - elements in these chains refer to blocks in the files. The - starting block of a file is NOT specified in the BAT. It - is specified by the property for a given - file. The elements in this BAT are both the block number - (within the file minus the header) AND the number of the - next BAT element in the chain. This can be thought of as a - linked list of blocks. The BAT array contains the links - from one block to the next, including the end of chain - marker. -

-

- Here's an example: Let's assume that the BAT begins as - follows: -

-

- BAT[ 0 ] = 2 -

-

- BAT[ 1 ] = 5 -

-

- BAT[ 2 ] = 3 -

-

- BAT[ 3 ] = 4 -

-

- BAT[ 4 ] = 6 -

-

- BAT[ 5 ] = - -2 -

-

- BAT[ 6 ] = 7 -

-

- BAT[ 7 ] = - -2 -

-

- ... -

-

- Now, if we have a file whose Property Table entry says it - begins with index 0, we walk the BAT array and see that - the file consists of blocks 0 (because the start block is - 0), 2 (because BAT[ 0 ] is 2), 3 (BAT[ 2 ] is 3), 4 (BAT[ - 3 ] is 4), 6 (BAT[ 4 ] is 6), and 7 (BAT[ 6 ] is 7). It - ends at block 7 because BAT[ 7 ] is -2, which is the end - of chain marker. -

-

- Similarly, a file beginning at index 1 consists of - blocks 1 and 5. -

-

- Other special numbers in a BAT array are: -

-
    -
  • -

    - -1, which indicates an unused block -

    -
  • -
  • -

    - -3, which indicates a "special" block, - such as a block used to make up the Small Block - Array, the Property - Table, the main BAT, or the SBAT -

    -
  • -
-

Filesystem Structures

-

- The following outlines the basic filesystem structures. -

-

Header (block 1) -- 512 (0x200) bytes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldDescriptionOffsetLengthDefault value or const
FILETYPEMagic number identifying this as a POI - filesystem.0x0000Long0xE11AB1A1E011CFD0
UK1Unknown constant0x0008Integer0
UK2Unknown Constant0x000CInteger0
UK3Unknown Constant0x0014Integer0
UK4Unknown Constant (revision?)0x0018Short0x003B
UK5Unknown Constant (version?)0x001AShort0x0003
UK6Unknown Constant0x001CShort-2
LOG_2_BIG_BLOCK_SIZELog, base 2, of the big block size0x001EShort9 (2 ^ 9 = 512 bytes)
LOG_2_SMALL_BLOCK_SIZELog, base 2, of the small block size0x0020Integer6 (2 ^ 6 = 64 bytes)
UK7Unknown Constant0x0024Integer0
UK8Unknown Constant0x0028Integer0
BAT_COUNTNumber of elements in the BAT array0x002CIntegerrequired
PROPERTIES_STARTBlock index of the first block of the property table0x0030Integerrequired
UK9Unknown Constant0x0034Integer0
UK10Unknown Constant0x0038Integer0x00001000
SBAT_STARTBlock index of first big block containing the - small block allocation table (SBAT)0x003CInteger-2
UK11Unknown Constant0x0040Integer1
XBAT_STARTBlock index of the first block in the Extended - Block Allocation Table (XBAT)0x0044Integer-2
XBAT_COUNTNumber of elements in the Extended Block - Allocation Table (to be added to the BAT)0x0048Integer0
BAT_ARRAYArray of block indicies constituting the Block Allocation Table (BAT)0x004C, 0x0050, 0x0054 ... 0x01FCInteger[ ]-1 for unused elements, at least first element - must be filled.
N/AHeader block data not otherwise described in this - tableN/AN/A-1
-

Block Allocation Table Block -- 512 - (0x200) bytes

- - - - - - - - - - - - - - - -
FieldDescriptionOffsetLengthDefault value or const
BAT_ELEMENTAny given element in the BAT block0x0000, 0x0004, 0x0008, ... 0x01FCInteger-1 = unused
- -2 = end of chain
- -3 = special (e.g., BAT block)
- All other values point to the next element in the - chain and the next index of a block composing the - file.
-

Property Block -- 512 (0x200) byte block

- - - - - - - - - - - - - - - -
FieldDescriptionOffsetLengthDefault value or const
Properties[ ]This block contains the properties.0x0000, 0x0080, 0x0100, 0x0180128 bytesAll unused space is set to -1.
-

Property -- 128 (0x80) byte block

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldDescriptionOffsetLengthDefault value or const
NAMEA unicode null-terminated uncompressed 16bit - string (lose the high bytes) containing the name - of the property.0x00, 0x02, 0x04, ... 0x3EShort[ ]0x0000 for unused elements, field required, 32 - (0x40) element max
NAME_SIZENumber of characters in the NAME field0x40ShortRequired
PROPERTY_TYPEProperty type (directory, file, or root)0x42Byte1 (directory), 2 (file), or 5 (root entry)
NODE_COLORNode color0x43Byte0 (red) or 1 (black)
PREVIOUS_PROPPrevious property index0x44Integer-1
NEXT_PROPNext property index0x48Integer-1
CHILD_PROPFirst child property index0x4cInteger-1
SECONDS_1Seconds component of the created timestamp?0x64Integer0
DAYS_1Days since epoch component of the created - timestamp?0x68Integer0
SECONDS_2Seconds component of the modified timestamp?0x6CInteger0
DAYS_2Days since epoch component of the modified - timestamp?0x70Integer0
START_BLOCKStarting block of the file, used as the first - block in the file and the pointer to the next - block from the BAT0x74IntegerRequired
SIZEActual size of the file this property points - to. (used to truncate the blocks to the real - size).0x78Integer0
- - \ No newline at end of file

- A POI filesystem begins with a header. This header - identifies locations in the file by function and provides - a sanity check identifying a native filesystem file as - indeed a POI filesystem. -