From 2a0276c665240b65edade0e89634c26cad5b6eea Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Thu, 21 Jun 2007 19:28:04 +0000 Subject: [PATCH] Start on processing the commands stored within a HDGF chunk, plus initial tests for it git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@549588 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 8 + .../src/org/apache/poi/hdgf/LZW4HDGF.java | 20 +- .../src/org/apache/poi/hdgf/chunks/Chunk.java | 11 + .../apache/poi/hdgf/chunks/ChunkFactory.java | 95 +- .../poi/hdgf/chunks/chunks_parse_cmds.tbl | 964 ++++++++++++++++++ .../apache/poi/hdgf/chunks/TestChunks.java | 50 + 6 files changed, 1135 insertions(+), 13 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/hdgf/chunks/chunks_parse_cmds.tbl diff --git a/build.xml b/build.xml index cb5c6d649..5012001fb 100644 --- a/build.xml +++ b/build.xml @@ -329,6 +329,14 @@ under the License. + + + + + + + + diff --git a/src/scratchpad/src/org/apache/poi/hdgf/LZW4HDGF.java b/src/scratchpad/src/org/apache/poi/hdgf/LZW4HDGF.java index ad4e6de9a..32953a042 100644 --- a/src/scratchpad/src/org/apache/poi/hdgf/LZW4HDGF.java +++ b/src/scratchpad/src/org/apache/poi/hdgf/LZW4HDGF.java @@ -1,13 +1,13 @@ -/** - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ +/* ==================================================================== + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 3 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +==================================================================== */ package org.apache.poi.hdgf; import java.io.ByteArrayOutputStream; diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java index eedba0888..9018edf4a 100644 --- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java +++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/Chunk.java @@ -16,6 +16,8 @@ ==================================================================== */ package org.apache.poi.hdgf.chunks; +import org.apache.poi.hdgf.chunks.ChunkFactory.CommandDefinition; + /** * Base of all chunks, which hold data, flags etc */ @@ -30,6 +32,8 @@ public class Chunk { private ChunkTrailer trailer; /** May be null */ private ChunkSeparator separator; + /** The possible different commands we can hold */ + protected CommandDefinition[] commandDefinitions; public Chunk(ChunkHeader header, ChunkTrailer trailer, ChunkSeparator separator, byte[] contents) { this.header = header; @@ -52,6 +56,13 @@ public class Chunk { public ChunkTrailer getTrailer() { return trailer; } + /** + * Gets the command definitions, which define and describe much + * of the data held by the chunk. + */ + public CommandDefinition[] getCommandDefinitions() { + return commandDefinitions; + } /** * Returns the size of the chunk, including any diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java index f7e6cf912..8b9d03df2 100644 --- a/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java +++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/ChunkFactory.java @@ -16,18 +16,80 @@ ==================================================================== */ package org.apache.poi.hdgf.chunks; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.StringTokenizer; + /** * Factor class to create the appropriate chunks, which * needs the version of the file to process the chunk header * and trailer areas. * Makes use of chunks_parse_cmds.tbl from vsdump to be able - * to c + * to process the chunk value area */ public class ChunkFactory { + /** The version of the currently open document */ private int version; - public ChunkFactory(int version) { + /** + * Key is a Chunk's type, value is an array of its CommandDefinitions + */ + private Hashtable chunkCommandDefinitions = new Hashtable(); + /** What the name is of the chunk table */ + private static String chunkTableName = + "/org/apache/poi/hdgf/chunks/chunks_parse_cmds.tbl"; + + public ChunkFactory(int version) throws IOException { this.version = version; + + processChunkParseCommands(); } + + /** + * Open chunks_parse_cmds.tbl and process it, to get the definitions + * of all the different possible chunk commands. + */ + private void processChunkParseCommands() throws IOException { + String line; + InputStream cpd = ChunkFactory.class.getResourceAsStream(chunkTableName); + BufferedReader inp = new BufferedReader(new InputStreamReader(cpd)); + while( (line = inp.readLine()) != null ) { + if(line.startsWith("#")) continue; + if(line.startsWith(" ")) continue; + if(line.startsWith("\t")) continue; + if(line.length() == 0) continue; + + // Start xxx + if(!line.startsWith("start")) { + throw new IllegalStateException("Expecting start xxx, found " + line); + } + int chunkType = Integer.parseInt(line.substring(6)); + ArrayList defsL = new ArrayList(); + + // Data entries + while( ! (line = inp.readLine()).startsWith("end") ) { + StringTokenizer st = new StringTokenizer(line, " "); + int defType = Integer.parseInt(st.nextToken()); + int offset = Integer.parseInt(st.nextToken()); + String name = st.nextToken("\uffff").substring(1); + + CommandDefinition def = new CommandDefinition(defType,offset,name); + defsL.add(def); + } + + CommandDefinition[] defs = (CommandDefinition[]) + defsL.toArray(new CommandDefinition[defsL.size()]); + + // Add to the hashtable + chunkCommandDefinitions.put(new Integer(chunkType), defs); + } + inp.close(); + cpd.close(); + } + public int getVersion() { return version; } /** @@ -88,9 +150,36 @@ public class ChunkFactory { Chunk chunk = new Chunk(header, trailer, separator, contents); // Feed in the stuff from chunks_parse_cmds.tbl - // TODO + CommandDefinition[] defs = (CommandDefinition[]) + chunkCommandDefinitions.get(new Integer(header.getType())); + chunk.commandDefinitions = defs; // All done return chunk; } + + /** + * The definition of a Command, which a chunk may hold. + * The Command holds the value, this describes it. + */ + public class CommandDefinition { + private int type; + private int offset; + private String name; + public CommandDefinition(int type, int offset, String name) { + this.type = type; + this.offset = offset; + this.name = name; + } + + public String getName() { + return name; + } + public int getOffset() { + return offset; + } + public int getType() { + return type; + } + } } diff --git a/src/scratchpad/src/org/apache/poi/hdgf/chunks/chunks_parse_cmds.tbl b/src/scratchpad/src/org/apache/poi/hdgf/chunks/chunks_parse_cmds.tbl new file mode 100644 index 000000000..530e6c228 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hdgf/chunks/chunks_parse_cmds.tbl @@ -0,0 +1,964 @@ +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# +# version 0.0.26 +# +# Need to extend with 'format' field for conversion length (inch->mm), angles(rad->degree) and enums (e.g. +# for aligns -- left/right/justify etc. +# +# The Format description for .tbl file. +# Lines start with # are comments. +# Every list of commands starts with 'start ch_type' +# and ends with 'end'. +# In between start and end are space-separeted lines +# with 'type', 'offset', 'name' values. +# Atm I use 'atoi', so only decimal value is allowed for ch_type, type and offset. +# The possible values for 'type' are: +# 0..7 - flag at bit 0..7 at offset 'offset' +# 8 - 1 byte value +# 9 - 8 bytes IEEE-754 fraction +# 10(a) - name of chunk (we must start with a name atm, because with parse for printing) +# 11(b) - offset to start of blocks +# 12(c) - text block +# 13(d) - some "name" from the list +# 14(e) - one byte "function" from the list +# 15(f) - some "function" from the list +# 16 - string, next byte is length terminating '0' wasn't added to length +# 17 - 'ForeignData' +# 18 - Dump it to file as-is +# 25 - 2 bytes LE +# 26 - 4 bytes LE +# 27 - Tabs? [experimental] +# 21 - offset to start of blocks in version 11 +# 28 - extension for image files [experimental] +# 29 - num of parts and type for OLE [experimental] + +# Quick workaround for losing of 1st table +start 10 +end + +start 12 +17 0 ForeignData +end + +start 13 +10 0 OLE_Info +29 0 0 +18 0 0 +end + +start 14 +10 0 Text +12 27 0 +18 0 0 +end + +start 16 +10 0 Data1 +12 0 0 +end + +start 17 +10 0 Data2 +12 0 0 +end + +start 18 +10 0 Data3 +12 0 0 +end + +start 21 +10 0 Stream15 +9 53 Center X +9 61 Center Y +18 0 0 +end + +start 24 +10 0 Stream18 +18 0 0 +end + +start 25 +10 0 FaceName +16 24 0 +end + +start 26 +10 0 Stream1a +18 0 0 +end + +start 31 +17 0 OLEData +end + +start 40 +10 0 Unknown 0x28 +9 39 Unknown1 +9 47 Unknown2 +18 0 0 +end + +start 44 +10 0 Unknown 0x2c +18 0 0 +end + +#seems to be text string +start 45 +10 0 Unknown 0x2d +12 0 0 +end + +start 49 +10 0 Stream31 +18 0 0 +end + +start 66 +10 0 Unknown 0x42 +18 0 0 +end + +start 70 +10 0 PageSheet +18 0 0 +end + +start 71 +10 0 Shape ID Type="Group" +18 0 0 +end + +start 72 +10 0 Shape ID Type="Shape" +26 53 LineStyle +26 61 FillStyle +26 69 TextStyle +18 0 0 +end + +start 74 +10 0 StyleSheet +26 53 LineStyle +26 61 FillStyle +26 69 TextStyle +18 0 0 +end + +start 77 +10 0 Shape ID Type="Guide" +18 0 0 +end + + +start 78 +10 0 Shape ID Type="Foreign" +18 0 0 +end + +start 79 +10 0 DocumentSheet +26 53 LineStyle +26 61 FillStyle +26 69 TextStyle +18 0 0 +end + +start 100 +10 0 Unknown 0x64 +18 0 0 +end + +start 101 +10 0 Unknown 0x65 +18 0 0 +end + +start 102 +10 0 Unknown 0x66 +18 0 0 +end + +start 103 +10 0 Unknown 0x67 +18 0 0 +end + +start 104 +10 0 Unknown 0x68 +18 0 0 +end + +start 105 +10 0 Unknown 0x69 +18 0 0 +end + +start 106 +10 0 Unknown 0x6a +18 0 0 +end + +start 107 +10 0 Unknown 0x6b +18 0 0 +end + +start 108 +10 0 Unknown 0x6c +18 0 0 +end + +start 109 +10 0 Unknown 0x6d +18 0 0 +end + +start 110 +10 0 Unknown 0x6e +18 0 0 +end + +start 111 +10 0 Unknown 0x6f +18 0 0 +end + +start 112 +10 0 Unknown 0x70 +18 0 0 +end + +start 113 +10 0 Unknown 0x71 +18 0 0 +end + +start 114 +10 0 Unknown 0x72 +18 0 0 +end + +start 115 +10 0 Unknown 0x73 +18 0 0 +end + +start 116 +10 0 Unknown 0x74 +18 0 0 +end + +start 117 +10 0 Unknown 0x75 +18 0 0 +end + +start 118 +10 0 Unknown 0x76 +18 0 0 +end + +start 130 +10 0 Unknown 0x82 +18 0 0 +end + +start 131 +10 0 Unknown 0x83 +18 0 0 +end + +start 132 +10 0 Event +8 20 TheText +11 36 BlockStarts +21 36 BlockStarts +18 0 0 +end + +start 133 +10 0 Line +31 19 LineWeight +8 28 LineColor +8 33 LinePattern +9 35 Rounding +8 43 EndArrowSize +8 44 BeginArrow +8 45 EndArrow +8 47 BeginArrowSize +1 50 Color +2 50 Pattern +3 50 RoundingCap +4 50 LineEndEnd +5 50 LineEndBegin +6 50 EndSize +7 50 SqueareCap +0 51 BeginSize +11 54 BlockStarts +21 54 BlockStarts +18 0 0 +end + +start 134 +10 0 Fill +8 19 FillForegnd +30 25 FillBkgnd +8 29 FillPattern +30 31 ShdwForegnd +8 35 ShdwBkgnd +8 40 ShdwPattern +31 42 ShapeShdwOffsetX +31 51 ShapeShdwOffsetY +9 69 ShapeShdwScaleFactor +11 44 BlockStarts +21 80 BlockStarts +18 0 0 +end + +start 135 +10 0 TextBlock +31 19 LeftMargin +31 28 RightMargin +31 37 TopMargin +31 46 BottomMargin +8 55 VerticalAlign +30 56 TextBkgnd +9 62 DefaultTabStop +8 82 TextDirection +11 90 BlockStarts +21 111 BlockStarts +18 0 0 +end + +start 136 +10 0 Tabs +11 26 BlocksStart +21 26 BlocksStart +18 0 0 +end + +start 137 +10 0 Geometry +0 20 NoFill +1 20 NoLine +2 20 NoShow +3 20 NoSnap +21 22 BlocksStart +18 0 0 +end + +start 138 +10 0 MoveTo +9 20 X +9 29 Y +11 39 BlocksStart +21 39 BlocksStart +end + +start 139 +10 0 LineTo +9 20 X +9 29 Y +11 39 BlocksStart +21 39 BlocksStart +end + +start 140 +10 0 ArcTo +9 20 X +9 29 Y +9 38 A +11 48 BlocksStart +18 0 0 +end + +start 141 +10 0 InfiniteLine +9 20 X +9 29 Y +9 37 A +9 45 B +11 57 BlocksStart +18 0 0 +end + +start 143 +10 0 Ellipse +9 20 X +9 29 Y +9 38 A +9 47 B +9 56 C +9 65 D +11 75 BlocksStart +18 0 0 +end + +start 144 +10 0 EllipticalArcTo +31 19 X +31 28 Y +31 37 A +31 46 B +31 55 C +31 64 D +11 75 BlocksStart +18 0 0 +end + +start 146 +10 0 PageProps +9 20 PageWidth +9 29 PageHeight +9 38 ShdwOffsetX +9 47 ShdwOffsetY +9 56 PageScale +9 65 DrawingScale +8 73 DrawingSizeType +8 74 DrawingScaleType +0 93 InhibitSnap +11 150 BlockStarts +18 0 0 +end + +start 147 +10 0 StyleProp +8 19 EnableLineProps +8 20 EnableFillProps +8 21 EnableTextProps +8 22 HideForApply +11 26 BlocksStart +21 26 BlocksStart +18 0 0 +end + +start 148 +10 0 Char +25 23 FontNum +30 26 Color +8 29 Transparency*255/100% +0 30 Bold +1 30 Italic +2 30 Underline +3 30 Smallcaps +0 31 AllCaps +1 31 InitCaps +0 32 Subscript +1 32 Superscipt +25 33 Scale*100 % +8 35 LangCode +31 36 Size +25 46 Spacing pt*200 +25 56 AsianFont +25 58 ComplexScriptFont +8 60 LocalizeFont +25 88 LangID +11 54 BlocksStart +21 107 BlocksStart +18 0 0 +end + +start 149 +10 0 Para +31 23 IndFirst +31 32 IndLeft +31 41 IndRight +31 50 SpLine +31 59 SpBefore +31 68 SpAfter +8 77 HorizAlign +8 78 Bullet +11 92 BlockStarts +21 142 BlockStarts +18 0 0 +end + +start 150 +10 0 Tabs +27 0 TabsID +11 48 BlockStarts +18 0 0 +end + +start 151 +10 0 Tabs +27 0 TabsID +11 139 BlockStarts +18 0 0 +end + +start 181 +10 0 Tabs +27 0 TabsID +11 708 BlockStarts +18 0 0 +end + +start 152 +10 0 Foreign +9 20 IndFirst +9 29 IndLeft +9 38 IndRight +9 47 SpLine +28 68 Ext +18 0 0 +end + +start 153 +10 0 Connection +31 19 Width +31 28 Height +31 37 DirX/A +31 46 DirY/B +8 55 Type/C +11 67 BlockStarts +21 67 BlockStarts +18 0 0 +end + +start 155 +10 0 XForm +9 20 PinX +9 29 PinY +9 38 Width +9 47 Height +9 56 LocPinX +9 65 LocPinY +9 74 Angle +8 82 FlipX +8 83 FlipY +8 84 ResizeMode +11 88 BlockStarts +21 88 BlockStarts +18 0 0 +end + +start 156 +10 0 TextXForm +9 20 TxtPinX +9 29 TxtPinY +31 37 TxtWidth +9 47 TxtHeight +9 56 TxtLocPinX +9 65 TxtLocPinY +9 74 TxtAngle +11 88 BlockStarts +21 88 BlockStarts +18 0 0 +end + +start 157 +10 0 XForm1D +9 20 BeginX +9 29 BeginY +9 38 EndX +9 47 EndY +11 57 BlockStarts +21 57 BlockStarts +end + +start 158 +10 0 Scratch +9 20 X +9 29 Y +9 38 A +9 47 B +9 56 C +9 65 D +11 75 BlockStarts +18 0 0 +end + +start 159 +10 0 Alignment +9 20 AlignLeft +9 29 AlignCenter +9 38 AlignRight +9 47 AlignTop +9 56 AlignMiddle +9 65 AlignBottom +11 75 BlockStarts +21 79 BlockStarts +18 0 0 +end + +start 160 +10 0 Protection +8 19 LockWidth +8 20 LockHeight +8 21 LockMoveX +8 22 LockMoveY +8 23 LockAspect +8 24 LockDelete +8 25 LockBegin +8 26 LockEnd +8 27 LockRotate +8 28 LockCrop +8 29 LockVtxEdit +8 30 LockTextEdit +8 31 LockFormat +8 32 LockGroup +8 33 LockCalcWH +8 34 LockSelect +8 35 LockCustProp +11 43 BlockStarts +21 43 BlockStarts +18 0 0 +end + +start 161 +10 0 TextFields +18 0 0 +end + +start 162 +10 0 Control +9 20 X +9 29 Y +9 38 XDyn +9 47 YDyn +8 55 XCon +8 56 YCon +0 57 CanGlue +11 60 BlockStarts +21 60 BlockStarts +18 0 0 +end + +start 163 +10 0 Help +11 49 BlockStarts +21 49 BlockStarts +18 0 0 +end + +start 164 +10 0 Misc +0 19 NoObjHandles +1 19 NonPrinting +2 19 NoCtlHandles +3 19 NoAlignBox +4 19 UpdateAlignBox +5 19 HideText +8 20 DynFeedback +8 21 GlueType +8 22 WalkPreference +25 25 ObjType +0 35 IsDropSource +1 35 NoLiveDynamics +25 37 LangID +11 42 BlockStarts +21 64 BlockStarts +18 0 0 +end + +start 165 +10 0 SplineStart +9 20 X +9 29 Y +9 37 A +9 45 B +9 53 C +8 61 D +11 65 BlockStarts +18 0 0 +end + +start 166 +10 0 SplineKnot +9 20 X +9 29 Y +9 37 A +11 47 BlockStarts +18 0 0 +end + +start 167 +10 0 LayerMem +11 25 BlockStarts +21 25 BlockStarts +18 0 0 +end + +# Transparency 255 - 100% +start 168 +10 0 Layer +30 27 Color +8 31 Transparency +8 33 Visible +8 34 Print +8 35 Active +8 36 Lock +8 37 Snap +8 38 Glue +11 52 BlockStarts +21 52 BlockStarts +18 0 0 +end + +start 169 +10 0 Act +8 40 Checked +8 41 Disabled +0 42 ReadOnly +1 42 Invisible +2 42 BeginGroup +11 47 BlockStarts +21 76 BlockStarts +18 0 0 +end + +start 170 +10 0 Control +9 20 X +9 29 Y +9 38 XDyn +9 47 YDyn +8 55 XBehavior +8 56 YBehavior +0 57 CanGlue +11 66 BlockStarts +21 66 BlockStarts +18 0 0 +end + +start 180 +10 0 User-defined Cells +9 20 Value +11 34 BlockStarts +21 34 BlockStarts +18 0 0 +end + +start 182 +10 0 CustomProps +9 20 Value +8 44 Type +0 46 Invisible +1 46 Ask +11 55 BlockStarts +18 0 0 +end + +start 183 +10 0 RulerGrid +8 19 XRulerDensity +8 20 XRulerDensity +31 21 Unknown1 +31 30 Unknown2 +31 39 XRulerOrigin +31 48 YRulerOrigin +8 57 XGridDensity +8 58 YGridDensity +31 59 XGridSpacing +31 68 YGridSpacing +31 77 XGridOrigin +31 86 YGridOrigin +11 98 BlockStarts +21 98 BlockStarts +18 0 0 +end + +start 185 +10 0 Connection +31 19 Width +31 28 Height +31 37 DirX/A +31 46 DirY/B +8 55 Type/C +11 67 BlockStarts +21 67 BlockStarts +18 0 0 +end + +start 186 +10 0 ConnectionPoints +9 20 Width +9 29 Height +11 79 BlockStarts +18 0 0 +end + +start 188 +10 0 DocProps +25 24 DocLangID +18 0 0 +end + +start 189 +10 0 Image +9 19 Gamma +25 27 Contrast*100 (%) +25 29 Brightness*100 (%) +25 31 Sharpen*100 (%) +25 33 Blur*100 (%) +25 35 Denoise*100 (%) +25 37 Transparency*100 (%) +11 64 BlockStarts +21 64 BlockStarts +18 0 0 +end + +start 190 +10 0 Group +8 19 SelectMode +8 20 DisplayMode +0 21 IsDropTarget +1 21 IsSnapTarget +2 21 IsTextEditTarget +3 21 DontMoveChildren +11 44 BlocksStart +21 44 BlocksStart +end + +start 191 +10 0 Layout +0 19 ShapePermeableX +1 19 ShapePermeableY +2 19 ShapePermeablePlace +8 20 ShapeFixedCode +8 21 ShapePlowCode +8 22 ShapeRouteStyle +8 24 ConFixedCode +8 25 ConLineJumpCode +8 26 ConLineJumpStyle +8 28 ConLineJumpDirX +8 29 ConLineJumpDirY +11 57 BlockStarts +21 57 BlockStarts +18 0 0 +end + +start 192 +10 0 PageLayout +0 19 ResizePage +1 19 EnableGrid +2 19 DynamicOff +3 19 CtrlAsInput +8 20 PlaceStyle +8 21 RouteStyle +8 22 PlaceDepth +8 23 PlowCode +8 24 LineJumpCode +8 25 LineJumpStyle +8 26 PageLineJumpDirX +8 27 PageLineJumpDirY +9 29 LineToNodeX +9 38 LineToNodeY +9 47 BlockSizeX +9 56 BlockSizeY +9 65 AvenueSizeX +9 74 AvenueSizeY +9 83 LineToLineX +9 92 LineToLineY +9 100 LineJumpFactorX +9 108 LineJumpFactorY +8 116 LineAdjustFrom +8 117 LineAdjustTo +11 163 Blocks start +21 163 Blocks start +end + +start 193 +10 0 Unknown 0xc1 +9 20 Unknown1 +9 29 Unknown2 +18 0 0 +end + + +start 195 +10 0 NURBSTo +9 20 X +9 29 Y +9 37 A +9 45 B +9 53 C +9 61 D +11 80 BlocksStart +21 80 BlocksStart +18 0 0 +end + +start 196 +10 0 Hyperlink +0 39 NewWindow +2 39 Default +11 65 BlocksStart +18 0 0 +end + +start 197 +10 0 Reviewer +8 28 ColorRed +8 29 ColorGreen +8 30 ColorBlue +26 31 ReviewerID +26 35 CurrentIndex +11 57 BlocksStart +21 57 BlocksStart +18 0 0 +end + +start 198 +10 0 Unknown 0xc6 +18 0 0 +end + +start 199 +10 0 Unknown 0xc7 +18 0 0 +end + +start 200 +10 0 PrintProps +31 19 PageLeftMargin +31 28 PageRightMargin +31 37 PageTopMargin +31 46 PageBottomMargin +9 55 ScaleX +9 63 ScaleY +25 71 PagesX +25 73 PagesY +8 76 PrintPageOrientation +25 77 PaperKind +25 79 PaperSource +11 91 BlocksStart +21 91 BlocksStart +18 0 0 +end + +start 201 +10 0 Unknown 0xc9 +18 0 0 +end + +start 209 +10 0 NURBSTo E-cell +9 35 1st fr of NURBSTo +9 43 3 bytes are here, need to map +9 51 2nd fr +9 59 3rd fr +9 67 4th byte +9 75 5th byte +9 83 4th fr +9 91 5th fr +9 99 6th byte +9 107 7th byte +9 115 6th fr +9 123 7th fr +9 131 8th byte +9 139 9th byte +18 0 0 +end diff --git a/src/scratchpad/testcases/org/apache/poi/hdgf/chunks/TestChunks.java b/src/scratchpad/testcases/org/apache/poi/hdgf/chunks/TestChunks.java index b19b1395a..9cf11ce3a 100644 --- a/src/scratchpad/testcases/org/apache/poi/hdgf/chunks/TestChunks.java +++ b/src/scratchpad/testcases/org/apache/poi/hdgf/chunks/TestChunks.java @@ -132,6 +132,56 @@ public static final byte[] data_b = new byte[] { 70, 0, 0, 0, // Should be 19 + length + 8 + 4 big assertEquals(68, chunk.getHeader().getLength()); assertEquals(68+19+8+4, chunk.getOnDiskSize()); + + // Type is 70, or 0x46 + assertEquals(70, chunk.getHeader().getType()); + assertEquals(0x46, chunk.getHeader().getType()); + + // Should have two different chunk commands, a + // 10 (page sheet) and an 18 + assertEquals(2, chunk.commandDefinitions.length); + + assertEquals(10, chunk.commandDefinitions[0].getType()); + assertEquals(0, chunk.commandDefinitions[0].getOffset()); + assertEquals("PageSheet", chunk.commandDefinitions[0].getName()); + + assertEquals(18, chunk.commandDefinitions[1].getType()); + assertEquals(0, chunk.commandDefinitions[1].getOffset()); + assertEquals("0", chunk.commandDefinitions[1].getName()); + } + + public void testAnotherChunk() throws Exception { + ChunkFactory cf = new ChunkFactory(11); + + // Go for the 2nd chunk in the stream + int offset = 0; + Chunk chunk = cf.createChunk(data_b, offset); + offset += chunk.getOnDiskSize(); + chunk = cf.createChunk(data_b, offset); + + assertNotNull(chunk.getHeader()); + assertNotNull(chunk.getTrailer()); + assertNotNull(chunk.getSeparator()); + + // Should be 19 + length + 8 + 4 big + assertEquals(32, chunk.getHeader().getLength()); + assertEquals(32+19+8+4, chunk.getOnDiskSize()); + + // Type is 104, or 0x68 + assertEquals(104, chunk.getHeader().getType()); + assertEquals(0x68, chunk.getHeader().getType()); + + // Should have two different chunk commands, a + // 10 (Unknown) and an 18 + assertEquals(2, chunk.commandDefinitions.length); + + assertEquals(10, chunk.commandDefinitions[0].getType()); + assertEquals(0, chunk.commandDefinitions[0].getOffset()); + assertEquals("Unknown 0x68", chunk.commandDefinitions[0].getName()); + + assertEquals(18, chunk.commandDefinitions[1].getType()); + assertEquals(0, chunk.commandDefinitions[1].getOffset()); + assertEquals("0", chunk.commandDefinitions[1].getName()); } public void testManyChunks() throws Exception {