| /* ==================================================================== |
| 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.hwpf.model; |
| |
| import java.io.IOException; |
| import java.util.LinkedList; |
| import java.util.List; |
| |
| import org.apache.poi.hwpf.model.io.HWPFFileSystem; |
| import org.apache.poi.hwpf.model.io.HWPFOutputStream; |
| import org.apache.poi.hwpf.sprm.SprmBuffer; |
| import org.apache.poi.util.Internal; |
| import org.apache.poi.util.LittleEndian; |
| |
| @Internal |
| public final class ComplexFileTable { |
| private static final byte GRPPRL_TYPE = 1; |
| private static final byte TEXT_PIECE_TABLE_TYPE = 2; |
| |
| protected TextPieceTable _tpt; |
| |
| private SprmBuffer[] _grpprls; |
| |
| public ComplexFileTable() { |
| _tpt = new TextPieceTable(); |
| } |
| |
| public ComplexFileTable(byte[] documentStream, byte[] tableStream, int offset, int fcMin) throws IOException { |
| //skips through the prms before we reach the piece table. These contain data |
| //for actual fast saved files |
| List<SprmBuffer> sprmBuffers = new LinkedList<SprmBuffer>(); |
| while (tableStream[offset] == GRPPRL_TYPE) { |
| offset++; |
| int size = LittleEndian.getShort(tableStream, offset); |
| offset += LittleEndian.SHORT_SIZE; |
| byte[] bs = LittleEndian.getByteArray(tableStream, offset, size); |
| offset += size; |
| |
| SprmBuffer sprmBuffer = new SprmBuffer(bs, false, 0); |
| sprmBuffers.add(sprmBuffer); |
| } |
| this._grpprls = sprmBuffers.toArray(new SprmBuffer[sprmBuffers.size()]); |
| |
| if (tableStream[offset] != TEXT_PIECE_TABLE_TYPE) { |
| throw new IOException("The text piece table is corrupted"); |
| } |
| int pieceTableSize = LittleEndian.getInt(tableStream, ++offset); |
| offset += LittleEndian.INT_SIZE; |
| _tpt = new TextPieceTable(documentStream, tableStream, offset, pieceTableSize, fcMin); |
| } |
| |
| public TextPieceTable getTextPieceTable() { |
| return _tpt; |
| } |
| |
| public SprmBuffer[] getGrpprls() { |
| return _grpprls; |
| } |
| |
| @Deprecated |
| public void writeTo(HWPFFileSystem sys) throws IOException { |
| HWPFOutputStream docStream = sys.getStream("WordDocument"); |
| HWPFOutputStream tableStream = sys.getStream("1Table"); |
| |
| writeTo(docStream, tableStream); |
| } |
| |
| public void writeTo(HWPFOutputStream wordDocumentStream, |
| HWPFOutputStream tableStream) throws IOException { |
| tableStream.write(TEXT_PIECE_TABLE_TYPE); |
| |
| byte[] table = _tpt.writeTo(wordDocumentStream); |
| |
| byte[] numHolder = new byte[LittleEndian.INT_SIZE]; |
| LittleEndian.putInt(numHolder, 0, table.length); |
| tableStream.write(numHolder); |
| tableStream.write(table); |
| } |
| |
| } |