Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-658321,658323-658335,658337-658348,658351,658353-658832,658834-658983,658985,658987-659066,659068-659402,659404-659428,659430-659451,659453-659454,659456-659461,659463-659477,659479-659524,659526-659571,659574,659576-660255,660257-660262,660264-660279,660281-660343,660345-660473,660475-660827,660829-660833,660835-660888,660890-663321,663323-663435,663437-663764,663766-663854,663856-664219,664221-664489,664494-664514,664516-668013,668015-668142,668144-668152,668154,668156-668256,668258,668260-669139,669141-669455,669457-669657,669659-669808,669810-670189,670191-671321,671323-672229,672231-672549,672551-672552,672554-672561,672563-672566,672568,672571-673049,673051-673852,673854-673862,673864-673986,673988-673996,673998-674348 via svnmerge from
https://svn.apache.org/repos/asf/poi/trunk
........
r674348 | nick | 2008-07-06 22:16:05 +0100 (Sun, 06 Jul 2008) | 1 line
Shuffle the HDGF chunks_parse_cmds.tbl off into resources where it more properly belongs, and correctly update the legal notice file to match
........
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@674349 13f79535-47bb-0310-9956-ffa450edef68
16 years ago Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-658321,658323-658335,658337-658348,658351,658353-658832,658834-658983,658985,658987-659066,659068-659402,659404-659428,659430-659451,659453-659454,659456-659461,659463-659477,659479-659524,659526-659571,659574,659576-660255,660257-660262,660264-660279,660281-660343,660345-660473,660475-660827,660829-660833,660835-660888,660890-663321,663323-663435,663437-663764,663766-663854,663856-664219,664221-664489,664494-664514,664516-668013,668015-668142,668144-668152,668154,668156-668256,668258,668260-669139,669141-669455,669457-669657,669659-669808,669810-670189,670191-671321,671323-672229,672231-672549,672551-672552,672554-672561,672563-672566,672568,672571-673049,673051-673852,673854-673862,673864-673986,673988-673996,673998-674348 via svnmerge from
https://svn.apache.org/repos/asf/poi/trunk
........
r674348 | nick | 2008-07-06 22:16:05 +0100 (Sun, 06 Jul 2008) | 1 line
Shuffle the HDGF chunks_parse_cmds.tbl off into resources where it more properly belongs, and correctly update the legal notice file to match
........
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@674349 13f79535-47bb-0310-9956-ffa450edef68
16 years ago |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ==================================================================== */
-
- 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.HashMap;
- import java.util.Map;
- import java.util.StringTokenizer;
-
- import org.apache.poi.util.IOUtils;
- import org.apache.poi.util.LocaleUtil;
- import org.apache.poi.util.POILogFactory;
- import org.apache.poi.util.POILogger;
-
- /**
- * 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 process the chunk value area
- */
- public final class ChunkFactory {
-
- //arbitrarily selected; may need to increase
- private static final int MAX_RECORD_LENGTH = 1_000_000;
-
-
- /** The version of the currently open document */
- private int version;
- /**
- * Key is a Chunk's type, value is an array of its CommandDefinitions
- */
- private final Map<Integer, CommandDefinition[]> chunkCommandDefinitions =
- new HashMap<>();
- /**
- * What the name is of the chunk table definitions file?
- * This file comes from the scratchpad resources directory.
- */
- private static final String chunkTableName =
- "/org/apache/poi/hdgf/chunks_parse_cmds.tbl";
-
- /** For logging problems we spot with the file */
- private static final POILogger logger = POILogFactory.getLogger(ChunkFactory.class);
-
- 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 = null;
- BufferedReader inp = null;
- try {
- cpd = ChunkFactory.class.getResourceAsStream(chunkTableName);
- if(cpd == null) {
- throw new IllegalStateException("Unable to find HDGF chunk definition on the classpath - " + chunkTableName);
- }
-
- inp = new BufferedReader(new InputStreamReader(cpd, LocaleUtil.CHARSET_1252));
-
- while( (line = inp.readLine()) != null ) {
- if (line.isEmpty() || "# \t".contains(line.substring(0,1))) {
- continue;
- }
-
- // Start xxx
- if(!line.matches("^start [0-9]+$")) {
- throw new IllegalStateException("Expecting start xxx, found " + line);
- }
- int chunkType = Integer.parseInt(line.substring(6));
- ArrayList<CommandDefinition> defsL = new ArrayList<>();
-
- // Data entries
- while( (line = inp.readLine()) != null ) {
- if (line.startsWith("end")) {
- break;
- }
- 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 = defsL.toArray(new CommandDefinition[0]);
-
- // Add to the map
- chunkCommandDefinitions.put(chunkType, defs);
- }
- } finally {
- if (inp != null) {
- inp.close();
- }
- if (cpd != null) {
- cpd.close();
- }
- }
- }
-
- public int getVersion() { return version; }
-
- /**
- * Creates the appropriate chunk at the given location.
- *
- * @param data the chunk bytes
- * @param offset the offset into the chunk bytes array to start reading from
- *
- * @return the new Chunk
- */
- public Chunk createChunk(byte[] data, int offset) {
- // Create the header
- ChunkHeader header =
- ChunkHeader.createChunkHeader(version, data, offset);
- // Sanity check
- if(header.getLength() < 0) {
- throw new IllegalArgumentException("Found a chunk with a negative length, which isn't allowed");
- }
-
- // How far up to look
- int endOfDataPos = offset + header.getLength() + header.getSizeInBytes();
-
- // Check we have enough data, and tweak the header size
- // as required
- if(endOfDataPos > data.length) {
- logger.log(POILogger.WARN,
- "Header called for " + header.getLength() +" bytes, but that would take us past the end of the data!");
-
- endOfDataPos = data.length;
- header.setLength(data.length - offset - header.getSizeInBytes());
-
- if(header.hasTrailer()) {
- header.setLength(header.getLength() - 8);
- endOfDataPos -= 8;
- }
- if(header.hasSeparator()) {
- header.setLength(header.getLength() - 4);
- endOfDataPos -= 4;
- }
- }
-
-
- // Create the trailer and separator, if required
- ChunkTrailer trailer = null;
- ChunkSeparator separator = null;
- if(header.hasTrailer()) {
- if(endOfDataPos <= data.length-8) {
- trailer = new ChunkTrailer(
- data, endOfDataPos);
- endOfDataPos += 8;
- } else {
- logger.log(POILogger.ERROR, "Header claims a length to " + endOfDataPos + " there's then no space for the trailer in the data (" + data.length + ")");
- }
- }
- if(header.hasSeparator()) {
- if(endOfDataPos <= data.length-4) {
- separator = new ChunkSeparator(
- data, endOfDataPos);
- } else {
- logger.log(POILogger.ERROR, "Header claims a length to " + endOfDataPos + " there's then no space for the separator in the data (" + data.length + ")");
- }
- }
-
- // Now, create the chunk
- byte[] contents = IOUtils.safelyAllocate(header.getLength(), MAX_RECORD_LENGTH);
- System.arraycopy(data, offset+header.getSizeInBytes(), contents, 0, contents.length);
- Chunk chunk = new Chunk(header, trailer, separator, contents);
-
- // Feed in the stuff from chunks_parse_cmds.tbl
- CommandDefinition[] defs = chunkCommandDefinitions.get(header.getType());
- if (defs == null) {
- defs = new CommandDefinition[0];
- }
- chunk.setCommandDefinitions(defs);
-
- // Now get the chunk to process its commands
- chunk.processCommands();
-
- // All done
- return chunk;
- }
-
- /**
- * The definition of a Command, which a chunk may hold.
- * The Command holds the value, this describes it.
- */
- public static 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;
- }
- }
- }
|