latest work
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353152 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
04e0debf06
commit
20f8792b72
@ -51,7 +51,10 @@
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
@ -73,7 +76,15 @@ import org.apache.poi.util.LittleEndian;
|
||||
*/
|
||||
public class CHPFormattedDiskPage extends FormattedDiskPage
|
||||
{
|
||||
private static final int FC_SIZE = 4;
|
||||
|
||||
private ArrayList _chpxList = new ArrayList();
|
||||
private ArrayList _overFlow;
|
||||
|
||||
|
||||
public CHPFormattedDiskPage()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* This constructs a CHPFormattedDiskPage from a raw fkp (512 byte array
|
||||
@ -81,9 +92,29 @@ public class CHPFormattedDiskPage extends FormattedDiskPage
|
||||
*
|
||||
* @param fkp The 512 byte array to read data from
|
||||
*/
|
||||
public CHPFormattedDiskPage(byte[] fkp)
|
||||
public CHPFormattedDiskPage(byte[] documentStream, int offset, int fcMin)
|
||||
{
|
||||
super(fkp);
|
||||
super(documentStream, offset);
|
||||
|
||||
for (int x = 0; x < _crun; x++)
|
||||
{
|
||||
_chpxList.add(new CHPX(getStart(x) - fcMin, getEnd(x) - fcMin, getGrpprl(x)));
|
||||
}
|
||||
}
|
||||
|
||||
public CHPX getCHPX(int index)
|
||||
{
|
||||
return (CHPX)_chpxList.get(index);
|
||||
}
|
||||
|
||||
public void fill(List filler)
|
||||
{
|
||||
_chpxList.addAll(filler);
|
||||
}
|
||||
|
||||
public ArrayList getOverflow()
|
||||
{
|
||||
return _overFlow;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -92,22 +123,87 @@ public class CHPFormattedDiskPage extends FormattedDiskPage
|
||||
* @param index The index of the chpx to get.
|
||||
* @return a chpx grpprl.
|
||||
*/
|
||||
public byte[] getGrpprl(int index)
|
||||
protected byte[] getGrpprl(int index)
|
||||
{
|
||||
int chpxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, ((_crun + 1) * 4) + index);
|
||||
int chpxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + (((_crun + 1) * 4) + index));
|
||||
|
||||
//optimization if offset == 0 use "Normal" style
|
||||
if(chpxOffset == 0)
|
||||
{
|
||||
return new byte[0];
|
||||
|
||||
}
|
||||
|
||||
int size = LittleEndian.getUnsignedByte(_fkp, chpxOffset);
|
||||
int size = LittleEndian.getUnsignedByte(_fkp, _offset + chpxOffset);
|
||||
|
||||
byte[] chpx = new byte[size];
|
||||
|
||||
System.arraycopy(_fkp, ++chpxOffset, chpx, 0, size);
|
||||
System.arraycopy(_fkp, _offset + ++chpxOffset, chpx, 0, size);
|
||||
return chpx;
|
||||
}
|
||||
}
|
||||
|
||||
protected byte[] toByteArray(int fcMin)
|
||||
{
|
||||
byte[] buf = new byte[512];
|
||||
int size = _chpxList.size();
|
||||
int grpprlOffset = 0;
|
||||
int offsetOffset = 0;
|
||||
int fcOffset = 0;
|
||||
|
||||
// total size is currently the size of one FC
|
||||
int totalSize = FC_SIZE;
|
||||
|
||||
int index = 0;
|
||||
for (; index < size; index++)
|
||||
{
|
||||
int grpprlLength = ((CHPX)_chpxList.get(index)).getGrpprl().length;
|
||||
|
||||
// check to see if we have enough room for an FC, a byte, and the grpprl.
|
||||
totalSize += (FC_SIZE + 1 + grpprlLength);
|
||||
// if size is uneven we will have to add one so the first grpprl falls
|
||||
// on a word boundary
|
||||
if (totalSize > 511 + (index % 2))
|
||||
{
|
||||
totalSize -= (FC_SIZE + 1 + grpprlLength);
|
||||
break;
|
||||
}
|
||||
|
||||
// grpprls must fall on word boundaries
|
||||
if (grpprlLength % 2 > 0)
|
||||
{
|
||||
totalSize += 1;
|
||||
}
|
||||
}
|
||||
|
||||
// see if we couldn't fit some
|
||||
if (index != size)
|
||||
{
|
||||
_overFlow = new ArrayList();
|
||||
_overFlow.addAll(index, _chpxList);
|
||||
}
|
||||
|
||||
// index should equal number of CHPXs that will be in this fkp now.
|
||||
buf[511] = (byte)index;
|
||||
|
||||
offsetOffset = (FC_SIZE * index) + FC_SIZE;
|
||||
grpprlOffset = offsetOffset + index + (grpprlOffset % 2);
|
||||
|
||||
CHPX chpx = null;
|
||||
for (int x = 0; x < index; x++)
|
||||
{
|
||||
chpx = (CHPX)_chpxList.get(x);
|
||||
byte[] grpprl = chpx.getGrpprl();
|
||||
|
||||
LittleEndian.putInt(buf, fcOffset, chpx.getStart() + fcMin);
|
||||
buf[offsetOffset] = (byte)(grpprlOffset/2);
|
||||
System.arraycopy(grpprl, 0, buf, grpprlOffset, grpprl.length);
|
||||
|
||||
grpprlOffset += grpprl.length + (grpprl.length % 2);
|
||||
offsetOffset += 1;
|
||||
fcOffset += FC_SIZE;
|
||||
}
|
||||
// put the last chpx's end in
|
||||
LittleEndian.putInt(buf, fcOffset, chpx.getEnd() + fcMin);
|
||||
return buf;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -55,38 +55,23 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
import org.apache.poi.hwpf.model.hdftypes.definitions.DOPAbstractType;
|
||||
|
||||
/**
|
||||
* Comment me
|
||||
*
|
||||
* @author Ryan Ackley
|
||||
*/
|
||||
|
||||
public class DocumentProperties implements HDFType
|
||||
public class DocumentProperties extends DOPAbstractType
|
||||
{
|
||||
|
||||
public boolean _fFacingPages;
|
||||
public int _fpc;
|
||||
public int _epc;
|
||||
public int _rncFtn;
|
||||
public int _nFtn;
|
||||
public int _rncEdn;
|
||||
public int _nEdn;
|
||||
|
||||
public DocumentProperties(byte[] dopArray)
|
||||
public DocumentProperties(byte[] tableStream, int offset)
|
||||
{
|
||||
_fFacingPages = (dopArray[0] & 0x1) > 0;
|
||||
_fpc = (dopArray[0] & 0x60) >> 5;
|
||||
|
||||
short num = LittleEndian.getShort(dopArray, 2);
|
||||
_rncFtn = (num & 0x3);
|
||||
_nFtn = (short)(num & 0xfffc) >> 2;
|
||||
num = LittleEndian.getShort(dopArray, 52);
|
||||
_rncEdn = num & 0x3;
|
||||
_nEdn = (short)(num & 0xfffc) >> 2;
|
||||
num = LittleEndian.getShort(dopArray, 54);
|
||||
_epc = num & 0x3;
|
||||
super.fillFields(tableStream, (short)0, offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,65 @@
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
/*
|
||||
* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2003 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache POI" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache POI", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
import org.apache.poi.util.BitField;
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
|
||||
import org.apache.poi.hdf.model.hdftypes.definitions.FIBAbstractType;
|
||||
import org.apache.poi.hwpf.model.hdftypes.definitions.FIBAbstractType;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -102,7 +157,7 @@ public class FileInformationBlock extends FIBAbstractType
|
||||
|
||||
private int field_51_unknown;
|
||||
private int field_52_unknown; */
|
||||
//not sure about this array.
|
||||
//not sure about this array.
|
||||
/*
|
||||
private short field_53_fc_lcb_array_size;
|
||||
private int field_54_original_stylesheet_offset;
|
||||
@ -183,7 +238,7 @@ public class FileInformationBlock extends FIBAbstractType
|
||||
|
||||
|
||||
^/
|
||||
/** Creates a new instance of FileInformationBlock */
|
||||
/** Creates a new instance of FileInformationBlock */
|
||||
public FileInformationBlock(byte[] mainDocument)
|
||||
{
|
||||
fillFields(mainDocument, (short)0, (short)0);
|
||||
|
@ -52,7 +52,7 @@
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
@ -80,32 +80,40 @@ public abstract class FormattedDiskPage
|
||||
{
|
||||
protected byte[] _fkp;
|
||||
protected int _crun;
|
||||
protected int _offset;
|
||||
|
||||
|
||||
public FormattedDiskPage()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses a 512-byte array to create a FKP
|
||||
*/
|
||||
public FormattedDiskPage(byte[] fkp)
|
||||
public FormattedDiskPage(byte[] documentStream, int offset)
|
||||
{
|
||||
_crun = LittleEndian.getUnsignedByte(fkp, 511);
|
||||
_fkp = fkp;
|
||||
_crun = LittleEndian.getUnsignedByte(documentStream, offset + 511);
|
||||
_fkp = documentStream;
|
||||
_offset = offset;
|
||||
}
|
||||
/**
|
||||
* Used to get a text offset corresponding to a grpprl in this fkp.
|
||||
* @param index The index of the property in this FKP
|
||||
* @return an int representing an offset in the "WordDocument" stream
|
||||
*/
|
||||
public int getStart(int index)
|
||||
protected int getStart(int index)
|
||||
{
|
||||
return LittleEndian.getInt(_fkp, (index * 4));
|
||||
return LittleEndian.getInt(_fkp, _offset + (index * 4));
|
||||
}
|
||||
/**
|
||||
* Used to get the end of the text corresponding to a grpprl in this fkp.
|
||||
* @param index The index of the property in this fkp.
|
||||
* @return an int representing an offset in the "WordDocument" stream
|
||||
*/
|
||||
public int getEnd(int index)
|
||||
protected int getEnd(int index)
|
||||
{
|
||||
return LittleEndian.getInt(_fkp, ((index + 1) * 4));
|
||||
return LittleEndian.getInt(_fkp, _offset + ((index + 1) * 4));
|
||||
}
|
||||
/**
|
||||
* Used to get the total number of grrprl's stored int this FKP
|
||||
@ -116,5 +124,5 @@ public abstract class FormattedDiskPage
|
||||
return _crun;
|
||||
}
|
||||
|
||||
public abstract byte[] getGrpprl(int index);
|
||||
}
|
||||
protected abstract byte[] getGrpprl(int index);
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
* Created on February 24, 2002, 2:37 PM
|
||||
*/
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -51,10 +51,14 @@
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
import org.apache.poi.poifs.common.POIFSConstants;
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Represents a PAP FKP. The style properties for paragraph and character runs
|
||||
* are stored in fkps. There are PAP fkps for paragraph properties and CHP fkps
|
||||
@ -74,29 +78,62 @@ import org.apache.poi.util.LittleEndian;
|
||||
public class PAPFormattedDiskPage extends FormattedDiskPage
|
||||
{
|
||||
|
||||
private static final int BX_SIZE = 13;
|
||||
private static final int FC_SIZE = 4;
|
||||
|
||||
private ArrayList _papxList = new ArrayList();
|
||||
private ArrayList _overFlow;
|
||||
|
||||
|
||||
public PAPFormattedDiskPage()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a PAPFormattedDiskPage from a 512 byte array
|
||||
*
|
||||
* @param fkp a 512 byte array.
|
||||
*/
|
||||
public PAPFormattedDiskPage(byte[] fkp)
|
||||
public PAPFormattedDiskPage(byte[] documentStream, int offset, int fcMin)
|
||||
{
|
||||
super(fkp);
|
||||
super(documentStream, offset);
|
||||
|
||||
for (int x = 0; x < _crun; x++)
|
||||
{
|
||||
_papxList.add(new PAPX(getStart(x) - fcMin, getEnd(x) - fcMin, getGrpprl(x), getParagraphHeight(x)));
|
||||
}
|
||||
_fkp = null;
|
||||
}
|
||||
|
||||
public void fill(List filler)
|
||||
{
|
||||
_papxList.addAll(filler);
|
||||
}
|
||||
|
||||
public ArrayList getOverflow()
|
||||
{
|
||||
return _overFlow;
|
||||
}
|
||||
|
||||
public PAPX getPAPX(int index)
|
||||
{
|
||||
return (PAPX)_papxList.get(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the papx for the pagraph at index in this fkp.
|
||||
* Gets the papx for the paragraph at index in this fkp.
|
||||
*
|
||||
* @param index The index of the papx to get.
|
||||
* @return a papx grpprl.
|
||||
*/
|
||||
public byte[] getGrpprl(int index)
|
||||
protected byte[] getGrpprl(int index)
|
||||
{
|
||||
int papxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, ((_crun + 1) * 4) + (index * 13));
|
||||
int size = 2 * LittleEndian.getUnsignedByte(_fkp, papxOffset);
|
||||
int papxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + (((_crun + 1) * FC_SIZE) + (index * BX_SIZE)));
|
||||
int size = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + papxOffset);
|
||||
if(size == 0)
|
||||
{
|
||||
size = 2 * LittleEndian.getUnsignedByte(_fkp, ++papxOffset);
|
||||
size = 2 * LittleEndian.getUnsignedByte(_fkp, _offset + ++papxOffset);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -104,7 +141,100 @@ public class PAPFormattedDiskPage extends FormattedDiskPage
|
||||
}
|
||||
|
||||
byte[] papx = new byte[size];
|
||||
System.arraycopy(_fkp, ++papxOffset, papx, 0, size);
|
||||
System.arraycopy(_fkp, _offset + ++papxOffset, papx, 0, size);
|
||||
return papx;
|
||||
}
|
||||
}
|
||||
|
||||
protected byte[] toByteArray(int fcMin)
|
||||
{
|
||||
byte[] buf = new byte[512];
|
||||
int size = _papxList.size();
|
||||
int grpprlOffset = 0;
|
||||
int bxOffset = 0;
|
||||
int fcOffset = 0;
|
||||
|
||||
// total size is currently the size of one FC
|
||||
int totalSize = FC_SIZE;
|
||||
|
||||
int index = 0;
|
||||
for (; index < size; index++)
|
||||
{
|
||||
int grpprlLength = ((PAPX)_papxList.get(index)).getGrpprl().length;
|
||||
|
||||
// check to see if we have enough room for an FC, a BX, and the grpprl
|
||||
// and the 1 byte size of the grpprl.
|
||||
totalSize += (FC_SIZE + BX_SIZE + grpprlLength + 1);
|
||||
// if size is uneven we will have to add one so the first grpprl falls
|
||||
// on a word boundary
|
||||
if (totalSize > 511 + (index % 2))
|
||||
{
|
||||
totalSize -= (FC_SIZE + BX_SIZE + grpprlLength);
|
||||
break;
|
||||
}
|
||||
|
||||
// grpprls must fall on word boundaries
|
||||
if (grpprlLength % 2 > 0)
|
||||
{
|
||||
totalSize += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
totalSize += 2;
|
||||
}
|
||||
}
|
||||
|
||||
// see if we couldn't fit some
|
||||
if (index != size)
|
||||
{
|
||||
_overFlow = new ArrayList();
|
||||
_overFlow.addAll(index, _papxList);
|
||||
}
|
||||
|
||||
// index should equal number of papxs that will be in this fkp now.
|
||||
buf[511] = (byte)index;
|
||||
|
||||
bxOffset = (FC_SIZE * index) + FC_SIZE;
|
||||
grpprlOffset = bxOffset + (BX_SIZE * index) + (grpprlOffset % 2);
|
||||
|
||||
PAPX papx = null;
|
||||
for (int x = 0; x < index; x++)
|
||||
{
|
||||
papx = (PAPX)_papxList.get(x);
|
||||
byte[] phe = papx.getParagraphHeight().toByteArray();
|
||||
byte[] grpprl = papx.getGrpprl();
|
||||
|
||||
LittleEndian.putInt(buf, fcOffset, papx.getStart() + fcMin);
|
||||
buf[bxOffset] = (byte)(grpprlOffset/2);
|
||||
System.arraycopy(phe, 0, buf, bxOffset + 1, phe.length);
|
||||
|
||||
// refer to the section on PAPX in the spec. Places a size on the front
|
||||
// of the PAPX. Has to do with how the grpprl stays on word
|
||||
// boundaries.
|
||||
if ((grpprl.length % 2) > 0)
|
||||
{
|
||||
buf[grpprlOffset++] = (byte)((grpprl.length + 1)/2);
|
||||
}
|
||||
else
|
||||
{
|
||||
buf[++grpprlOffset] = (byte)((grpprl.length)/2);
|
||||
grpprlOffset++;
|
||||
}
|
||||
System.arraycopy(grpprl, 0, buf, grpprlOffset, grpprl.length);
|
||||
|
||||
bxOffset += BX_SIZE;
|
||||
fcOffset += FC_SIZE;
|
||||
}
|
||||
// put the last papx's end in
|
||||
LittleEndian.putInt(buf, fcOffset, papx.getEnd() + fcMin);
|
||||
return buf;
|
||||
}
|
||||
|
||||
private ParagraphHeight getParagraphHeight(int index)
|
||||
{
|
||||
int pheOffset = 1 + (2 * LittleEndian.getUnsignedByte(_fkp, _offset + (((_crun + 1) * 4) + (index * 13))));
|
||||
|
||||
ParagraphHeight phe = new ParagraphHeight(_fkp, pheOffset);
|
||||
|
||||
return phe;
|
||||
}
|
||||
}
|
||||
|
@ -51,62 +51,129 @@
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* common data structure in a Word file. Contains an array of 4 byte ints in
|
||||
* the front that relate to an array of abitrary data structures in the back.
|
||||
*
|
||||
* This class acts more like a pointer. In the sense that it doesn't store any
|
||||
* data. It only provides convenience methods for accessing a particular
|
||||
* PlexOfCps
|
||||
*
|
||||
* @author Ryan Ackley
|
||||
*/
|
||||
public class PlexOfCps
|
||||
{
|
||||
private int _count;
|
||||
private int _offset;
|
||||
private int _sizeOfStruct;
|
||||
private int _count;
|
||||
private int _offset;
|
||||
private int _sizeOfStruct;
|
||||
private ArrayList _props;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param size The size in bytes of this PlexOfCps
|
||||
* @param sizeOfStruct The size of the data structure type stored in
|
||||
* this PlexOfCps.
|
||||
*/
|
||||
public PlexOfCps(int size, int sizeOfStruct)
|
||||
public PlexOfCps(int sizeOfStruct)
|
||||
{
|
||||
_props = new ArrayList();
|
||||
_sizeOfStruct = sizeOfStruct;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param size The size in bytes of this PlexOfCps
|
||||
* @param sizeOfStruct The size of the data structure type stored in
|
||||
* this PlexOfCps.
|
||||
*/
|
||||
public PlexOfCps(byte[] buf, int start, int size, int sizeOfStruct)
|
||||
{
|
||||
_count = (size - 4)/(4 + sizeOfStruct);
|
||||
_sizeOfStruct = sizeOfStruct;
|
||||
_props = new ArrayList(_count);
|
||||
|
||||
for (int x = 0; x < _count; x++)
|
||||
{
|
||||
_count = (size - 4)/(4 + sizeOfStruct);
|
||||
_sizeOfStruct = sizeOfStruct;
|
||||
_props.add(getProperty(x, buf, start));
|
||||
}
|
||||
public int getIntOffset(int index)
|
||||
}
|
||||
|
||||
public PropertyNode getProperty(int index)
|
||||
{
|
||||
return (PropertyNode)_props.get(index);
|
||||
}
|
||||
|
||||
public void addProperty(PropertyNode node)
|
||||
{
|
||||
_props.add(node);
|
||||
}
|
||||
|
||||
public byte[] toByteArray()
|
||||
{
|
||||
int size = _props.size();
|
||||
int cpBufSize = ((size + 1) * LittleEndian.INT_SIZE);
|
||||
int structBufSize = + (_sizeOfStruct * size);
|
||||
int bufSize = cpBufSize + structBufSize;
|
||||
|
||||
byte[] buf = new byte[bufSize];
|
||||
|
||||
PropertyNode node = null;
|
||||
for (int x = 0; x < size; x++)
|
||||
{
|
||||
return index * 4;
|
||||
node = (PropertyNode)_props.get(x);
|
||||
|
||||
// put the starting offset of the property into the plcf.
|
||||
LittleEndian.putInt(buf, (LittleEndian.INT_SIZE * x), node.getStart());
|
||||
|
||||
// put the struct into the plcf
|
||||
System.arraycopy(node.getBuf(), 0, buf, cpBufSize + (x * _sizeOfStruct),
|
||||
_sizeOfStruct);
|
||||
}
|
||||
/**
|
||||
* returns the number of data structures in this PlexOfCps.
|
||||
*
|
||||
* @return The number of data structures in this PlexOfCps
|
||||
*/
|
||||
public int length()
|
||||
{
|
||||
return _count;
|
||||
}
|
||||
/**
|
||||
* Returns the offset, in bytes, from the beginning if this PlexOfCps to
|
||||
* the data structure at index.
|
||||
*
|
||||
* @param index The index of the data structure.
|
||||
*
|
||||
* @return The offset, in bytes, from the beginning if this PlexOfCps to
|
||||
* the data structure at index.
|
||||
*/
|
||||
public int getStructOffset(int index)
|
||||
{
|
||||
return (4 * (_count + 1)) + (_sizeOfStruct * index);
|
||||
}
|
||||
}
|
||||
// put the ending offset of the last property into the plcf.
|
||||
LittleEndian.putInt(buf, LittleEndian.INT_SIZE * size, node.getEnd());
|
||||
|
||||
return buf;
|
||||
|
||||
}
|
||||
|
||||
private PropertyNode getProperty(int index, byte[] buf, int offset)
|
||||
{
|
||||
int start = LittleEndian.getInt(buf, offset + getIntOffset(index));
|
||||
int end = LittleEndian.getInt(buf, offset + getIntOffset(index+1));
|
||||
|
||||
byte[] struct = new byte[_sizeOfStruct];
|
||||
System.arraycopy(buf, offset + getStructOffset(index), struct, 0, _sizeOfStruct);
|
||||
|
||||
return new PropertyNode(start, end, struct);
|
||||
}
|
||||
|
||||
private int getIntOffset(int index)
|
||||
{
|
||||
return index * 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the number of data structures in this PlexOfCps.
|
||||
*
|
||||
* @return The number of data structures in this PlexOfCps
|
||||
*/
|
||||
public int length()
|
||||
{
|
||||
return _count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the offset, in bytes, from the beginning if this PlexOfCps to
|
||||
* the data structure at index.
|
||||
*
|
||||
* @param index The index of the data structure.
|
||||
*
|
||||
* @return The offset, in bytes, from the beginning if this PlexOfCps to
|
||||
* the data structure at index.
|
||||
*/
|
||||
private int getStructOffset(int index)
|
||||
{
|
||||
return (4 * (_count + 1)) + (_sizeOfStruct * index);
|
||||
}
|
||||
}
|
||||
|
@ -51,64 +51,65 @@
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Represents a lightweight node in the Trees used to store formatting
|
||||
* Represents a lightweight node in the Trees used to store content
|
||||
* properties.
|
||||
*
|
||||
* @author Ryan Ackley
|
||||
*/
|
||||
public class PropertyNode implements Comparable
|
||||
{
|
||||
private byte[] _grpprl;
|
||||
private int _fcStart;
|
||||
private int _fcEnd;
|
||||
private byte[] _buf;
|
||||
private int _cpStart;
|
||||
private int _cpEnd;
|
||||
|
||||
/**
|
||||
* @param fcStart The start of the text for this property.
|
||||
* @param fcEnd The end of the text for this property.
|
||||
* @param grpprl The property description in compressed form.
|
||||
*/
|
||||
public PropertyNode(int fcStart, int fcEnd, byte[] grpprl)
|
||||
public PropertyNode(int fcStart, int fcEnd, byte[] buf)
|
||||
{
|
||||
_fcStart = fcStart;
|
||||
_fcEnd = fcEnd;
|
||||
_grpprl = grpprl;
|
||||
_cpStart = fcStart;
|
||||
_cpEnd = fcEnd;
|
||||
_buf = buf;
|
||||
}
|
||||
/**
|
||||
* @return The offset of this property's text.
|
||||
*/
|
||||
public int getStart()
|
||||
{
|
||||
return _fcStart;
|
||||
return _cpStart;
|
||||
}
|
||||
/**
|
||||
* @retrun The offset of the end of this property's text.
|
||||
*/
|
||||
public int getEnd()
|
||||
{
|
||||
return _fcEnd;
|
||||
return _cpEnd;
|
||||
}
|
||||
/**
|
||||
* @return This property's property in copmpressed form.
|
||||
*/
|
||||
protected byte[] getGrpprl()
|
||||
public byte[] getBuf()
|
||||
{
|
||||
return _grpprl;
|
||||
return _buf;
|
||||
}
|
||||
/**
|
||||
* Used for sorting in collections.
|
||||
*/
|
||||
public int compareTo(Object o)
|
||||
{
|
||||
int fcEnd = ((PropertyNode)o).getEnd();
|
||||
if(_fcEnd == fcEnd)
|
||||
int cpEnd = ((PropertyNode)o).getEnd();
|
||||
if(_cpEnd == cpEnd)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else if(_fcEnd < fcEnd)
|
||||
else if(_cpEnd < cpEnd)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
@ -117,4 +118,4 @@ public class PropertyNode implements Comparable
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -54,9 +54,12 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
import org.apache.poi.util.BitField;
|
||||
/**
|
||||
* Comment me
|
||||
*
|
||||
@ -69,27 +72,44 @@ public class StyleDescription implements HDFType
|
||||
private static int PARAGRAPH_STYLE = 1;
|
||||
private static int CHARACTER_STYLE = 2;
|
||||
|
||||
int _baseStyleIndex;
|
||||
int _styleTypeCode;
|
||||
int _numUPX;
|
||||
private short _infoShort;
|
||||
private static BitField _sti = new BitField(0xfff);
|
||||
private static BitField _fScratch = new BitField(0x1000);
|
||||
private static BitField _fInvalHeight = new BitField(0x2000);
|
||||
private static BitField _fHasUpe = new BitField(0x4000);
|
||||
private static BitField _fMassCopy = new BitField(0x8000);
|
||||
private short _infoShort2;
|
||||
private static BitField _styleTypeCode = new BitField(0xf);
|
||||
private static BitField _baseStyle = new BitField(0xfff0);
|
||||
private static BitField _numUPX = new BitField(0xf);
|
||||
private static BitField _nextStyle = new BitField(0xfff0);
|
||||
private short _bchUpe;
|
||||
private short _infoShort3;
|
||||
private static BitField _fAutoRedef = new BitField(0x1);
|
||||
private static BitField _fHidden = new BitField(0x2);
|
||||
|
||||
byte[] _papx;
|
||||
byte[] _chpx;
|
||||
ParagraphProperties _pap;
|
||||
CharacterProperties _chp;
|
||||
String _name;
|
||||
// ParagraphProperties _pap;
|
||||
// CharacterProperties _chp;
|
||||
|
||||
public StyleDescription()
|
||||
{
|
||||
_pap = new ParagraphProperties();
|
||||
_chp = new CharacterProperties();
|
||||
// _pap = new ParagraphProperties();
|
||||
// _chp = new CharacterProperties();
|
||||
}
|
||||
public StyleDescription(byte[] std, int baseLength, boolean word9)
|
||||
public StyleDescription(byte[] std, int baseLength, int offset, boolean word9)
|
||||
{
|
||||
int infoShort = LittleEndian.getShort(std, 2);
|
||||
_styleTypeCode = (infoShort & 0xf);
|
||||
_baseStyleIndex = (infoShort & 0xfff0) >> 4;
|
||||
|
||||
infoShort = LittleEndian.getShort(std, 4);
|
||||
_numUPX = infoShort & 0xf;
|
||||
int nameStart = offset + baseLength;
|
||||
_infoShort = LittleEndian.getShort(std, offset);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
_infoShort2 = LittleEndian.getShort(std, offset);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
_bchUpe = LittleEndian.getShort(std, offset);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
_infoShort3 = LittleEndian.getShort(std, offset);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
|
||||
//first byte(s) of variable length section of std is the length of the
|
||||
//style name and aliases string
|
||||
@ -97,52 +117,66 @@ public class StyleDescription implements HDFType
|
||||
int multiplier = 1;
|
||||
if(word9)
|
||||
{
|
||||
nameLength = LittleEndian.getShort(std, baseLength);
|
||||
nameLength = LittleEndian.getShort(std, nameStart);
|
||||
multiplier = 2;
|
||||
nameStart += LittleEndian.SHORT_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
nameLength = std[baseLength];
|
||||
nameLength = std[nameStart];
|
||||
}
|
||||
//2 bytes for length, length then null terminator.
|
||||
int grupxStart = multiplier + ((nameLength + 1) * multiplier) + baseLength;
|
||||
|
||||
int offset = 0;
|
||||
for(int x = 0; x < _numUPX; x++)
|
||||
try
|
||||
{
|
||||
int upxSize = LittleEndian.getShort(std, grupxStart + offset);
|
||||
if(_styleTypeCode == PARAGRAPH_STYLE)
|
||||
_name = new String(std, nameStart, nameLength * multiplier, "UTF-16LE");
|
||||
}
|
||||
catch (UnsupportedEncodingException ignore)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
|
||||
//2 bytes for length, length then null terminator.
|
||||
int grupxStart = multiplier + ((nameLength + 1) * multiplier) + nameStart;
|
||||
|
||||
// the spec only refers to two possible upxs but it mentions
|
||||
// that more may be added in the future
|
||||
int add = 0;
|
||||
int numUPX = _numUPX.getValue(_infoShort2);
|
||||
for(int x = 0; x < numUPX; x++)
|
||||
{
|
||||
int upxSize = LittleEndian.getShort(std, grupxStart + add);
|
||||
if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE)
|
||||
{
|
||||
if(x == 0)
|
||||
{
|
||||
_papx = new byte[upxSize];
|
||||
System.arraycopy(std, grupxStart + offset + 2, _papx, 0, upxSize);
|
||||
System.arraycopy(std, grupxStart + add + 2, _papx, 0, upxSize);
|
||||
}
|
||||
else if(x == 1)
|
||||
{
|
||||
_chpx = new byte[upxSize];
|
||||
System.arraycopy(std, grupxStart + offset + 2, _chpx, 0, upxSize);
|
||||
System.arraycopy(std, grupxStart + add + 2, _chpx, 0, upxSize);
|
||||
}
|
||||
}
|
||||
else if(_styleTypeCode == CHARACTER_STYLE && x == 0)
|
||||
else if(_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE && x == 0)
|
||||
{
|
||||
_chpx = new byte[upxSize];
|
||||
System.arraycopy(std, grupxStart + offset + 2, _chpx, 0, upxSize);
|
||||
System.arraycopy(std, grupxStart + add + 2, _chpx, 0, upxSize);
|
||||
}
|
||||
|
||||
// the upx will always start on a word boundary.
|
||||
if(upxSize % 2 == 1)
|
||||
{
|
||||
++upxSize;
|
||||
}
|
||||
offset += 2 + upxSize;
|
||||
add += 2 + upxSize;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
public int getBaseStyle()
|
||||
{
|
||||
return _baseStyleIndex;
|
||||
return _baseStyle.getValue(_infoShort2);
|
||||
}
|
||||
public byte[] getCHPX()
|
||||
{
|
||||
@ -152,20 +186,83 @@ public class StyleDescription implements HDFType
|
||||
{
|
||||
return _papx;
|
||||
}
|
||||
public ParagraphProperties getPAP()
|
||||
// public ParagraphProperties getPAP()
|
||||
// {
|
||||
// return _pap;
|
||||
// }
|
||||
// public CharacterProperties getCHP()
|
||||
// {
|
||||
// return _chp;
|
||||
// }
|
||||
// public void setPAP(ParagraphProperties pap)
|
||||
// {
|
||||
// _pap = pap;
|
||||
// }
|
||||
// public void setCHP(CharacterProperties chp)
|
||||
// {
|
||||
// _chp = chp;
|
||||
// }
|
||||
public byte[] toByteArray()
|
||||
{
|
||||
return _pap;
|
||||
// size equals 8 bytes for known variables plus 2 bytes for name length plus
|
||||
// name length * 2 plus 2 bytes for null plus upx's preceded by length
|
||||
int size = 8 + 2 + ((_name.length() + 1) * 2);
|
||||
|
||||
//only worry about papx and chpx for upxs
|
||||
if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE)
|
||||
{
|
||||
size += _papx.length + 2 + (_papx.length % 2);
|
||||
size += _chpx.length + 2;
|
||||
}
|
||||
else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE)
|
||||
{
|
||||
size += _chpx.length + 2;
|
||||
}
|
||||
|
||||
byte[] buf = new byte[size];
|
||||
|
||||
int offset = 0;
|
||||
LittleEndian.putShort(buf, offset, _infoShort);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
LittleEndian.putShort(buf, offset, _infoShort2);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
LittleEndian.putShort(buf, offset, _bchUpe);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
LittleEndian.putShort(buf, offset, _infoShort3);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
|
||||
char[] letters = _name.toCharArray();
|
||||
LittleEndian.putShort(buf, offset, (short)letters.length);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
for (int x = 0; x < letters.length; x++)
|
||||
{
|
||||
LittleEndian.putShort(buf, offset, (short)letters[x]);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
}
|
||||
// get past the null delimiter for the name.
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
|
||||
//only worry about papx and chpx for upxs
|
||||
if(_styleTypeCode.getValue(_infoShort2) == PARAGRAPH_STYLE)
|
||||
{
|
||||
LittleEndian.putShort(buf, offset, (short)_papx.length);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
System.arraycopy(_papx, 0, buf, offset, _papx.length);
|
||||
offset += _papx.length + (_papx.length % 2);
|
||||
|
||||
LittleEndian.putShort(buf, offset, (short)_chpx.length);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
System.arraycopy(_chpx, 0, buf, offset, _chpx.length);
|
||||
offset += _chpx.length;
|
||||
}
|
||||
else if (_styleTypeCode.getValue(_infoShort2) == CHARACTER_STYLE)
|
||||
{
|
||||
LittleEndian.putShort(buf, offset, (short)_chpx.length);
|
||||
offset += LittleEndian.SHORT_SIZE;
|
||||
System.arraycopy(_chpx, 0, buf, offset, _chpx.length);
|
||||
offset += _chpx.length;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
public CharacterProperties getCHP()
|
||||
{
|
||||
return _chp;
|
||||
}
|
||||
public void setPAP(ParagraphProperties pap)
|
||||
{
|
||||
_pap = pap;
|
||||
}
|
||||
public void setCHP(CharacterProperties chp)
|
||||
{
|
||||
_chp = chp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -52,7 +52,7 @@
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes;
|
||||
package org.apache.poi.hwpf.model.hdftypes;
|
||||
|
||||
|
||||
|
||||
@ -66,6 +66,7 @@ public class TextPiece extends PropertyNode implements Comparable
|
||||
{
|
||||
private boolean _usesUnicode;
|
||||
private int _length;
|
||||
private PieceDescriptor _pd;
|
||||
|
||||
/**
|
||||
* @param start Offset in main document stream.
|
||||
@ -73,12 +74,11 @@ public class TextPiece extends PropertyNode implements Comparable
|
||||
* does not necessarily refer to 1 byte.
|
||||
* @param unicode true if this text is unicode.
|
||||
*/
|
||||
public TextPiece(int start, int length, boolean unicode)
|
||||
public TextPiece(int start, int end, byte[] text, PieceDescriptor pd)
|
||||
{
|
||||
super(start, start + length, null);
|
||||
_usesUnicode = unicode;
|
||||
_length = length;
|
||||
|
||||
super(start, end, text);
|
||||
_usesUnicode = pd.isUnicode();
|
||||
_length = end - start;
|
||||
}
|
||||
/**
|
||||
* @return If this text piece uses unicode
|
||||
@ -87,4 +87,9 @@ public class TextPiece extends PropertyNode implements Comparable
|
||||
{
|
||||
return _usesUnicode;
|
||||
}
|
||||
|
||||
public PieceDescriptor getPieceDescriptor()
|
||||
{
|
||||
return _pd;
|
||||
}
|
||||
}
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes.definitions;
|
||||
package org.apache.poi.hwpf.model.hdftypes.definitions;
|
||||
|
||||
|
||||
|
||||
@ -77,27 +77,27 @@ public abstract class CHPAbstractType
|
||||
|
||||
private short field_1_chse;
|
||||
private int field_2_format_flags;
|
||||
private BitField fBold = new BitField(0x0001);
|
||||
private BitField fItalic = new BitField(0x0002);
|
||||
private BitField fRMarkDel = new BitField(0x0004);
|
||||
private BitField fOutline = new BitField(0x0008);
|
||||
private BitField fFldVanish = new BitField(0x0010);
|
||||
private BitField fSmallCaps = new BitField(0x0020);
|
||||
private BitField fCaps = new BitField(0x0040);
|
||||
private BitField fVanish = new BitField(0x0080);
|
||||
private BitField fRMark = new BitField(0x0100);
|
||||
private BitField fSpec = new BitField(0x0200);
|
||||
private BitField fStrike = new BitField(0x0400);
|
||||
private BitField fObj = new BitField(0x0800);
|
||||
private BitField fShadow = new BitField(0x1000);
|
||||
private BitField fLowerCase = new BitField(0x2000);
|
||||
private BitField fData = new BitField(0x4000);
|
||||
private BitField fOle2 = new BitField(0x8000);
|
||||
private static BitField fBold = new BitField(0x0001);
|
||||
private static BitField fItalic = new BitField(0x0002);
|
||||
private static BitField fRMarkDel = new BitField(0x0004);
|
||||
private static BitField fOutline = new BitField(0x0008);
|
||||
private static BitField fFldVanish = new BitField(0x0010);
|
||||
private static BitField fSmallCaps = new BitField(0x0020);
|
||||
private static BitField fCaps = new BitField(0x0040);
|
||||
private static BitField fVanish = new BitField(0x0080);
|
||||
private static BitField fRMark = new BitField(0x0100);
|
||||
private static BitField fSpec = new BitField(0x0200);
|
||||
private static BitField fStrike = new BitField(0x0400);
|
||||
private static BitField fObj = new BitField(0x0800);
|
||||
private static BitField fShadow = new BitField(0x1000);
|
||||
private static BitField fLowerCase = new BitField(0x2000);
|
||||
private static BitField fData = new BitField(0x4000);
|
||||
private static BitField fOle2 = new BitField(0x8000);
|
||||
private int field_3_format_flags1;
|
||||
private BitField fEmboss = new BitField(0x0001);
|
||||
private BitField fImprint = new BitField(0x0002);
|
||||
private BitField fDStrike = new BitField(0x0004);
|
||||
private BitField fUsePgsuSettings = new BitField(0x0008);
|
||||
private static BitField fEmboss = new BitField(0x0001);
|
||||
private static BitField fImprint = new BitField(0x0002);
|
||||
private static BitField fDStrike = new BitField(0x0004);
|
||||
private static BitField fUsePgsuSettings = new BitField(0x0008);
|
||||
private int field_4_ftcAscii;
|
||||
private int field_5_ftcFE;
|
||||
private int field_6_ftcOther;
|
||||
@ -128,13 +128,13 @@ public abstract class CHPAbstractType
|
||||
private byte field_31_chYsr;
|
||||
private int field_32_hpsKern;
|
||||
private short field_33_Highlight;
|
||||
private BitField icoHighlight = new BitField(0x001f);
|
||||
private BitField fHighlight = new BitField(0x0020);
|
||||
private BitField kcd = new BitField(0x01c0);
|
||||
private BitField fNavHighlight = new BitField(0x0200);
|
||||
private BitField fChsDiff = new BitField(0x0400);
|
||||
private BitField fMacChs = new BitField(0x0800);
|
||||
private BitField fFtcAsciSym = new BitField(0x1000);
|
||||
private static BitField icoHighlight = new BitField(0x001f);
|
||||
private static BitField fHighlight = new BitField(0x0020);
|
||||
private static BitField kcd = new BitField(0x01c0);
|
||||
private static BitField fNavHighlight = new BitField(0x0200);
|
||||
private static BitField fChsDiff = new BitField(0x0400);
|
||||
private static BitField fMacChs = new BitField(0x0800);
|
||||
private static BitField fFtcAsciSym = new BitField(0x1000);
|
||||
private short field_34_fPropMark;
|
||||
private int field_35_ibstPropRMark;
|
||||
private int field_36_dttmPropRMark;
|
||||
@ -157,7 +157,7 @@ public abstract class CHPAbstractType
|
||||
*/
|
||||
public int getSize()
|
||||
{
|
||||
return 4 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 4 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 2 + 4 + 4 + 4 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 1 + 2 + 2 + 2 + 2 + 4 + 1 + 1 + 2 + 4 + 32 + 2 + 4;
|
||||
return 4 + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 4 + 1 + 1 + 1 + 2 + 2 + 2 + 1 + 2 + 4 + 4 + 4 + 2 + 2 + 4 + 4 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 1 + 2 + 2 + 2 + 2 + 4 + 1 + 1 + 2 + 4 + 32 + 2 + 4;
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes.definitions;
|
||||
package org.apache.poi.hwpf.model.hdftypes.definitions;
|
||||
|
||||
|
||||
|
||||
@ -76,58 +76,58 @@ public abstract class DOPAbstractType
|
||||
{
|
||||
|
||||
private byte field_1_formatFlags;
|
||||
private BitField fFacingPages = new BitField(0x01);
|
||||
private BitField fWidowControl = new BitField(0x02);
|
||||
private BitField fPMHMainDoc = new BitField(0x04);
|
||||
private BitField grfSupression = new BitField(0x18);
|
||||
private BitField fpc = new BitField(0x60);
|
||||
private BitField unused1 = new BitField(0x80);
|
||||
private short field_2_unused2;
|
||||
private static BitField fFacingPages = new BitField(0x01);
|
||||
private static BitField fWidowControl = new BitField(0x02);
|
||||
private static BitField fPMHMainDoc = new BitField(0x04);
|
||||
private static BitField grfSupression = new BitField(0x18);
|
||||
private static BitField fpc = new BitField(0x60);
|
||||
private static BitField unused1 = new BitField(0x80);
|
||||
private byte field_2_unused2;
|
||||
private short field_3_footnoteInfo;
|
||||
private BitField rncFtn = new BitField(0x0003);
|
||||
private BitField nFtn = new BitField(0xfffc);
|
||||
private static BitField rncFtn = new BitField(0x0003);
|
||||
private static BitField nFtn = new BitField(0xfffc);
|
||||
private byte field_4_fOutlineDirtySave;
|
||||
private byte field_5_docinfo;
|
||||
private BitField fOnlyMacPics = new BitField(0x01);
|
||||
private BitField fOnlyWinPics = new BitField(0x02);
|
||||
private BitField fLabelDoc = new BitField(0x04);
|
||||
private BitField fHyphCapitals = new BitField(0x08);
|
||||
private BitField fAutoHyphen = new BitField(0x10);
|
||||
private BitField fFormNoFields = new BitField(0x20);
|
||||
private BitField fLinkStyles = new BitField(0x40);
|
||||
private BitField fRevMarking = new BitField(0x80);
|
||||
private static BitField fOnlyMacPics = new BitField(0x01);
|
||||
private static BitField fOnlyWinPics = new BitField(0x02);
|
||||
private static BitField fLabelDoc = new BitField(0x04);
|
||||
private static BitField fHyphCapitals = new BitField(0x08);
|
||||
private static BitField fAutoHyphen = new BitField(0x10);
|
||||
private static BitField fFormNoFields = new BitField(0x20);
|
||||
private static BitField fLinkStyles = new BitField(0x40);
|
||||
private static BitField fRevMarking = new BitField(0x80);
|
||||
private byte field_6_docinfo1;
|
||||
private BitField fBackup = new BitField(0x01);
|
||||
private BitField fExactCWords = new BitField(0x02);
|
||||
private BitField fPagHidden = new BitField(0x04);
|
||||
private BitField fPagResults = new BitField(0x08);
|
||||
private BitField fLockAtn = new BitField(0x10);
|
||||
private BitField fMirrorMargins = new BitField(0x20);
|
||||
private BitField unused3 = new BitField(0x40);
|
||||
private BitField fDfltTrueType = new BitField(0x80);
|
||||
private static BitField fBackup = new BitField(0x01);
|
||||
private static BitField fExactCWords = new BitField(0x02);
|
||||
private static BitField fPagHidden = new BitField(0x04);
|
||||
private static BitField fPagResults = new BitField(0x08);
|
||||
private static BitField fLockAtn = new BitField(0x10);
|
||||
private static BitField fMirrorMargins = new BitField(0x20);
|
||||
private static BitField unused3 = new BitField(0x40);
|
||||
private static BitField fDfltTrueType = new BitField(0x80);
|
||||
private byte field_7_docinfo2;
|
||||
private BitField fPagSupressTopSpacing = new BitField(0x01);
|
||||
private BitField fProtEnabled = new BitField(0x02);
|
||||
private BitField fDispFormFldSel = new BitField(0x04);
|
||||
private BitField fRMView = new BitField(0x08);
|
||||
private BitField fRMPrint = new BitField(0x10);
|
||||
private BitField unused4 = new BitField(0x20);
|
||||
private BitField fLockRev = new BitField(0x40);
|
||||
private BitField fEmbedFonts = new BitField(0x80);
|
||||
private static BitField fPagSupressTopSpacing = new BitField(0x01);
|
||||
private static BitField fProtEnabled = new BitField(0x02);
|
||||
private static BitField fDispFormFldSel = new BitField(0x04);
|
||||
private static BitField fRMView = new BitField(0x08);
|
||||
private static BitField fRMPrint = new BitField(0x10);
|
||||
private static BitField unused4 = new BitField(0x20);
|
||||
private static BitField fLockRev = new BitField(0x40);
|
||||
private static BitField fEmbedFonts = new BitField(0x80);
|
||||
private short field_8_docinfo3;
|
||||
private BitField oldfNoTabForInd = new BitField(0x0001);
|
||||
private BitField oldfNoSpaceRaiseLower = new BitField(0x0002);
|
||||
private BitField oldfSuppressSpbfAfterPageBreak = new BitField(0x0004);
|
||||
private BitField oldfWrapTrailSpaces = new BitField(0x0008);
|
||||
private BitField oldfMapPrintTextColor = new BitField(0x0010);
|
||||
private BitField oldfNoColumnBalance = new BitField(0x0020);
|
||||
private BitField oldfConvMailMergeEsc = new BitField(0x0040);
|
||||
private BitField oldfSupressTopSpacing = new BitField(0x0080);
|
||||
private BitField oldfOrigWordTableRules = new BitField(0x0100);
|
||||
private BitField oldfTransparentMetafiles = new BitField(0x0200);
|
||||
private BitField oldfShowBreaksInFrames = new BitField(0x0400);
|
||||
private BitField oldfSwapBordersFacingPgs = new BitField(0x0800);
|
||||
private BitField unused5 = new BitField(0xf000);
|
||||
private static BitField oldfNoTabForInd = new BitField(0x0001);
|
||||
private static BitField oldfNoSpaceRaiseLower = new BitField(0x0002);
|
||||
private static BitField oldfSuppressSpbfAfterPageBreak = new BitField(0x0004);
|
||||
private static BitField oldfWrapTrailSpaces = new BitField(0x0008);
|
||||
private static BitField oldfMapPrintTextColor = new BitField(0x0010);
|
||||
private static BitField oldfNoColumnBalance = new BitField(0x0020);
|
||||
private static BitField oldfConvMailMergeEsc = new BitField(0x0040);
|
||||
private static BitField oldfSupressTopSpacing = new BitField(0x0080);
|
||||
private static BitField oldfOrigWordTableRules = new BitField(0x0100);
|
||||
private static BitField oldfTransparentMetafiles = new BitField(0x0200);
|
||||
private static BitField oldfShowBreaksInFrames = new BitField(0x0400);
|
||||
private static BitField oldfSwapBordersFacingPgs = new BitField(0x0800);
|
||||
private static BitField unused5 = new BitField(0xf000);
|
||||
private int field_9_dxaTab;
|
||||
private int field_10_wSpare;
|
||||
private int field_11_dxaHotz;
|
||||
@ -143,16 +143,16 @@ public abstract class DOPAbstractType
|
||||
private int field_21_cPg;
|
||||
private int field_22_cParas;
|
||||
private short field_23_Edn;
|
||||
private BitField rncEdn = new BitField(0x0003);
|
||||
private BitField nEdn = new BitField(0xfffc);
|
||||
private static BitField rncEdn = new BitField(0x0003);
|
||||
private static BitField nEdn = new BitField(0xfffc);
|
||||
private short field_24_Edn1;
|
||||
private BitField epc = new BitField(0x0003);
|
||||
private BitField nfcFtnRef1 = new BitField(0x003c);
|
||||
private BitField nfcEdnRef1 = new BitField(0x03c0);
|
||||
private BitField fPrintFormData = new BitField(0x0400);
|
||||
private BitField fSaveFormData = new BitField(0x0800);
|
||||
private BitField fShadeFormData = new BitField(0x1000);
|
||||
private BitField fWCFtnEdn = new BitField(0x8000);
|
||||
private static BitField epc = new BitField(0x0003);
|
||||
private static BitField nfcFtnRef1 = new BitField(0x003c);
|
||||
private static BitField nfcEdnRef1 = new BitField(0x03c0);
|
||||
private static BitField fPrintFormData = new BitField(0x0400);
|
||||
private static BitField fSaveFormData = new BitField(0x0800);
|
||||
private static BitField fShadeFormData = new BitField(0x1000);
|
||||
private static BitField fWCFtnEdn = new BitField(0x8000);
|
||||
private int field_25_cLines;
|
||||
private int field_26_cWordsFtnEnd;
|
||||
private int field_27_cChFtnEdn;
|
||||
@ -161,55 +161,55 @@ public abstract class DOPAbstractType
|
||||
private int field_30_cLinesFtnEdn;
|
||||
private int field_31_lKeyProtDoc;
|
||||
private short field_32_view;
|
||||
private BitField wvkSaved = new BitField(0x0007);
|
||||
private BitField wScaleSaved = new BitField(0x0ff8);
|
||||
private BitField zkSaved = new BitField(0x3000);
|
||||
private BitField fRotateFontW6 = new BitField(0x4000);
|
||||
private BitField iGutterPos = new BitField(0x8000);
|
||||
private static BitField wvkSaved = new BitField(0x0007);
|
||||
private static BitField wScaleSaved = new BitField(0x0ff8);
|
||||
private static BitField zkSaved = new BitField(0x3000);
|
||||
private static BitField fRotateFontW6 = new BitField(0x4000);
|
||||
private static BitField iGutterPos = new BitField(0x8000);
|
||||
private int field_33_docinfo4;
|
||||
private BitField fNoTabForInd = new BitField(0x00000001);
|
||||
private BitField fNoSpaceRaiseLower = new BitField(0x00000002);
|
||||
private BitField fSupressSpdfAfterPageBreak = new BitField(0x00000004);
|
||||
private BitField fWrapTrailSpaces = new BitField(0x00000008);
|
||||
private BitField fMapPrintTextColor = new BitField(0x00000010);
|
||||
private BitField fNoColumnBalance = new BitField(0x00000020);
|
||||
private BitField fConvMailMergeEsc = new BitField(0x00000040);
|
||||
private BitField fSupressTopSpacing = new BitField(0x00000080);
|
||||
private BitField fOrigWordTableRules = new BitField(0x00000100);
|
||||
private BitField fTransparentMetafiles = new BitField(0x00000200);
|
||||
private BitField fShowBreaksInFrames = new BitField(0x00000400);
|
||||
private BitField fSwapBordersFacingPgs = new BitField(0x00000800);
|
||||
private BitField fSuppressTopSPacingMac5 = new BitField(0x00010000);
|
||||
private BitField fTruncDxaExpand = new BitField(0x00020000);
|
||||
private BitField fPrintBodyBeforeHdr = new BitField(0x00040000);
|
||||
private BitField fNoLeading = new BitField(0x00080000);
|
||||
private BitField fMWSmallCaps = new BitField(0x00200000);
|
||||
private static BitField fNoTabForInd = new BitField(0x00000001);
|
||||
private static BitField fNoSpaceRaiseLower = new BitField(0x00000002);
|
||||
private static BitField fSupressSpdfAfterPageBreak = new BitField(0x00000004);
|
||||
private static BitField fWrapTrailSpaces = new BitField(0x00000008);
|
||||
private static BitField fMapPrintTextColor = new BitField(0x00000010);
|
||||
private static BitField fNoColumnBalance = new BitField(0x00000020);
|
||||
private static BitField fConvMailMergeEsc = new BitField(0x00000040);
|
||||
private static BitField fSupressTopSpacing = new BitField(0x00000080);
|
||||
private static BitField fOrigWordTableRules = new BitField(0x00000100);
|
||||
private static BitField fTransparentMetafiles = new BitField(0x00000200);
|
||||
private static BitField fShowBreaksInFrames = new BitField(0x00000400);
|
||||
private static BitField fSwapBordersFacingPgs = new BitField(0x00000800);
|
||||
private static BitField fSuppressTopSPacingMac5 = new BitField(0x00010000);
|
||||
private static BitField fTruncDxaExpand = new BitField(0x00020000);
|
||||
private static BitField fPrintBodyBeforeHdr = new BitField(0x00040000);
|
||||
private static BitField fNoLeading = new BitField(0x00080000);
|
||||
private static BitField fMWSmallCaps = new BitField(0x00200000);
|
||||
private short field_34_adt;
|
||||
private byte[] field_35_doptypography;
|
||||
private byte[] field_36_dogrid;
|
||||
private short field_37_docinfo5;
|
||||
private BitField lvl = new BitField(0x001e);
|
||||
private BitField fGramAllDone = new BitField(0x0020);
|
||||
private BitField fGramAllClean = new BitField(0x0040);
|
||||
private BitField fSubsetFonts = new BitField(0x0080);
|
||||
private BitField fHideLastVersion = new BitField(0x0100);
|
||||
private BitField fHtmlDoc = new BitField(0x0200);
|
||||
private BitField fSnapBorder = new BitField(0x0800);
|
||||
private BitField fIncludeHeader = new BitField(0x1000);
|
||||
private BitField fIncludeFooter = new BitField(0x2000);
|
||||
private BitField fForcePageSizePag = new BitField(0x4000);
|
||||
private BitField fMinFontSizePag = new BitField(0x8000);
|
||||
private static BitField lvl = new BitField(0x001e);
|
||||
private static BitField fGramAllDone = new BitField(0x0020);
|
||||
private static BitField fGramAllClean = new BitField(0x0040);
|
||||
private static BitField fSubsetFonts = new BitField(0x0080);
|
||||
private static BitField fHideLastVersion = new BitField(0x0100);
|
||||
private static BitField fHtmlDoc = new BitField(0x0200);
|
||||
private static BitField fSnapBorder = new BitField(0x0800);
|
||||
private static BitField fIncludeHeader = new BitField(0x1000);
|
||||
private static BitField fIncludeFooter = new BitField(0x2000);
|
||||
private static BitField fForcePageSizePag = new BitField(0x4000);
|
||||
private static BitField fMinFontSizePag = new BitField(0x8000);
|
||||
private short field_38_docinfo6;
|
||||
private BitField fHaveVersions = new BitField(0x0001);
|
||||
private BitField fAutoVersions = new BitField(0x0002);
|
||||
private static BitField fHaveVersions = new BitField(0x0001);
|
||||
private static BitField fAutoVersions = new BitField(0x0002);
|
||||
private byte[] field_39_asumyi;
|
||||
private int field_40_cChWS;
|
||||
private int field_41_cChWSFtnEdn;
|
||||
private int field_42_grfDocEvents;
|
||||
private int field_43_virusinfo;
|
||||
private BitField fVirusPrompted = new BitField(0x0001);
|
||||
private BitField fVirusLoadSafe = new BitField(0x0002);
|
||||
private BitField KeyVirusSession30 = new BitField(0xfffffffc);
|
||||
private static BitField fVirusPrompted = new BitField(0x0001);
|
||||
private static BitField fVirusLoadSafe = new BitField(0x0002);
|
||||
private static BitField KeyVirusSession30 = new BitField(0xfffffffc);
|
||||
private byte[] field_44_Spare;
|
||||
private int field_45_reserved1;
|
||||
private int field_46_reserved2;
|
||||
@ -230,58 +230,116 @@ public abstract class DOPAbstractType
|
||||
protected void fillFields(byte [] data, short size, int offset)
|
||||
{
|
||||
field_1_formatFlags = data[ 0x0 + offset ];
|
||||
field_2_unused2 = LittleEndian.getShort(data, 0x1 + offset);
|
||||
field_3_footnoteInfo = LittleEndian.getShort(data, 0x3 + offset);
|
||||
field_4_fOutlineDirtySave = data[ 0x5 + offset ];
|
||||
field_5_docinfo = data[ 0x6 + offset ];
|
||||
field_6_docinfo1 = data[ 0x7 + offset ];
|
||||
field_7_docinfo2 = data[ 0x8 + offset ];
|
||||
field_8_docinfo3 = LittleEndian.getShort(data, 0x9 + offset);
|
||||
field_9_dxaTab = LittleEndian.getShort(data, 0xb + offset);
|
||||
field_10_wSpare = LittleEndian.getShort(data, 0xd + offset);
|
||||
field_11_dxaHotz = LittleEndian.getShort(data, 0xf + offset);
|
||||
field_12_cConsexHypLim = LittleEndian.getShort(data, 0x11 + offset);
|
||||
field_13_wSpare2 = LittleEndian.getShort(data, 0x13 + offset);
|
||||
field_14_dttmCreated = LittleEndian.getInt(data, 0x15 + offset);
|
||||
field_15_dttmRevised = LittleEndian.getInt(data, 0x19 + offset);
|
||||
field_16_dttmLastPrint = LittleEndian.getInt(data, 0x1d + offset);
|
||||
field_17_nRevision = LittleEndian.getShort(data, 0x21 + offset);
|
||||
field_18_tmEdited = LittleEndian.getInt(data, 0x23 + offset);
|
||||
field_19_cWords = LittleEndian.getInt(data, 0x27 + offset);
|
||||
field_20_cCh = LittleEndian.getInt(data, 0x2b + offset);
|
||||
field_21_cPg = LittleEndian.getShort(data, 0x2f + offset);
|
||||
field_22_cParas = LittleEndian.getInt(data, 0x31 + offset);
|
||||
field_23_Edn = LittleEndian.getShort(data, 0x35 + offset);
|
||||
field_24_Edn1 = LittleEndian.getShort(data, 0x37 + offset);
|
||||
field_25_cLines = LittleEndian.getInt(data, 0x39 + offset);
|
||||
field_26_cWordsFtnEnd = LittleEndian.getInt(data, 0x3d + offset);
|
||||
field_27_cChFtnEdn = LittleEndian.getInt(data, 0x41 + offset);
|
||||
field_28_cPgFtnEdn = LittleEndian.getShort(data, 0x45 + offset);
|
||||
field_29_cParasFtnEdn = LittleEndian.getInt(data, 0x47 + offset);
|
||||
field_30_cLinesFtnEdn = LittleEndian.getInt(data, 0x4b + offset);
|
||||
field_31_lKeyProtDoc = LittleEndian.getInt(data, 0x4f + offset);
|
||||
field_32_view = LittleEndian.getShort(data, 0x53 + offset);
|
||||
field_33_docinfo4 = LittleEndian.getInt(data, 0x55 + offset);
|
||||
field_34_adt = LittleEndian.getShort(data, 0x59 + offset);
|
||||
field_35_doptypography = LittleEndian.getByteArray(data, 0x5b + offset, size);
|
||||
field_36_dogrid = LittleEndian.getByteArray(data, 0x191 + offset, size);
|
||||
field_37_docinfo5 = LittleEndian.getShort(data, 0x19b + offset);
|
||||
field_38_docinfo6 = LittleEndian.getShort(data, 0x19d + offset);
|
||||
field_39_asumyi = LittleEndian.getByteArray(data, 0x19f + offset, size);
|
||||
field_40_cChWS = LittleEndian.getInt(data, 0x1ab + offset);
|
||||
field_41_cChWSFtnEdn = LittleEndian.getInt(data, 0x1af + offset);
|
||||
field_42_grfDocEvents = LittleEndian.getInt(data, 0x1b3 + offset);
|
||||
field_43_virusinfo = LittleEndian.getInt(data, 0x1b7 + offset);
|
||||
field_44_Spare = LittleEndian.getByteArray(data, 0x1bb + offset, size);
|
||||
field_45_reserved1 = LittleEndian.getInt(data, 0x1d9 + offset);
|
||||
field_46_reserved2 = LittleEndian.getInt(data, 0x1dd + offset);
|
||||
field_47_cDBC = LittleEndian.getInt(data, 0x1e1 + offset);
|
||||
field_48_cDBCFtnEdn = LittleEndian.getInt(data, 0x1e5 + offset);
|
||||
field_49_reserved = LittleEndian.getInt(data, 0x1e9 + offset);
|
||||
field_50_nfcFtnRef = LittleEndian.getShort(data, 0x1ed + offset);
|
||||
field_51_nfcEdnRef = LittleEndian.getShort(data, 0x1ef + offset);
|
||||
field_52_hpsZoonFontPag = LittleEndian.getShort(data, 0x1f1 + offset);
|
||||
field_53_dywDispPag = LittleEndian.getShort(data, 0x1f3 + offset);
|
||||
field_2_unused2 = data[ 0x1 + offset ];
|
||||
field_3_footnoteInfo = LittleEndian.getShort(data, 0x2 + offset);
|
||||
field_4_fOutlineDirtySave = data[ 0x4 + offset ];
|
||||
field_5_docinfo = data[ 0x5 + offset ];
|
||||
field_6_docinfo1 = data[ 0x6 + offset ];
|
||||
field_7_docinfo2 = data[ 0x7 + offset ];
|
||||
field_8_docinfo3 = LittleEndian.getShort(data, 0x8 + offset);
|
||||
field_9_dxaTab = LittleEndian.getShort(data, 0xa + offset);
|
||||
field_10_wSpare = LittleEndian.getShort(data, 0xc + offset);
|
||||
field_11_dxaHotz = LittleEndian.getShort(data, 0xe + offset);
|
||||
field_12_cConsexHypLim = LittleEndian.getShort(data, 0x10 + offset);
|
||||
field_13_wSpare2 = LittleEndian.getShort(data, 0x12 + offset);
|
||||
field_14_dttmCreated = LittleEndian.getInt(data, 0x14 + offset);
|
||||
field_15_dttmRevised = LittleEndian.getInt(data, 0x18 + offset);
|
||||
field_16_dttmLastPrint = LittleEndian.getInt(data, 0x1c + offset);
|
||||
field_17_nRevision = LittleEndian.getShort(data, 0x20 + offset);
|
||||
field_18_tmEdited = LittleEndian.getInt(data, 0x22 + offset);
|
||||
field_19_cWords = LittleEndian.getInt(data, 0x26 + offset);
|
||||
field_20_cCh = LittleEndian.getInt(data, 0x2a + offset);
|
||||
field_21_cPg = LittleEndian.getShort(data, 0x2e + offset);
|
||||
field_22_cParas = LittleEndian.getInt(data, 0x30 + offset);
|
||||
field_23_Edn = LittleEndian.getShort(data, 0x34 + offset);
|
||||
field_24_Edn1 = LittleEndian.getShort(data, 0x36 + offset);
|
||||
field_25_cLines = LittleEndian.getInt(data, 0x38 + offset);
|
||||
field_26_cWordsFtnEnd = LittleEndian.getInt(data, 0x3c + offset);
|
||||
field_27_cChFtnEdn = LittleEndian.getInt(data, 0x40 + offset);
|
||||
field_28_cPgFtnEdn = LittleEndian.getShort(data, 0x44 + offset);
|
||||
field_29_cParasFtnEdn = LittleEndian.getInt(data, 0x46 + offset);
|
||||
field_30_cLinesFtnEdn = LittleEndian.getInt(data, 0x4a + offset);
|
||||
field_31_lKeyProtDoc = LittleEndian.getInt(data, 0x4e + offset);
|
||||
field_32_view = LittleEndian.getShort(data, 0x52 + offset);
|
||||
field_33_docinfo4 = LittleEndian.getInt(data, 0x54 + offset);
|
||||
field_34_adt = LittleEndian.getShort(data, 0x58 + offset);
|
||||
field_35_doptypography = LittleEndian.getByteArray(data, 0x5a + offset,310);
|
||||
field_36_dogrid = LittleEndian.getByteArray(data, 0x190 + offset,10);
|
||||
field_37_docinfo5 = LittleEndian.getShort(data, 0x19a + offset);
|
||||
field_38_docinfo6 = LittleEndian.getShort(data, 0x19c + offset);
|
||||
field_39_asumyi = LittleEndian.getByteArray(data, 0x19e + offset,12);
|
||||
field_40_cChWS = LittleEndian.getInt(data, 0x1aa + offset);
|
||||
field_41_cChWSFtnEdn = LittleEndian.getInt(data, 0x1ae + offset);
|
||||
field_42_grfDocEvents = LittleEndian.getInt(data, 0x1b2 + offset);
|
||||
field_43_virusinfo = LittleEndian.getInt(data, 0x1b6 + offset);
|
||||
field_44_Spare = LittleEndian.getByteArray(data, 0x1ba + offset,30);
|
||||
field_45_reserved1 = LittleEndian.getInt(data, 0x1d8 + offset);
|
||||
field_46_reserved2 = LittleEndian.getInt(data, 0x1dc + offset);
|
||||
field_47_cDBC = LittleEndian.getInt(data, 0x1e0 + offset);
|
||||
field_48_cDBCFtnEdn = LittleEndian.getInt(data, 0x1e4 + offset);
|
||||
field_49_reserved = LittleEndian.getInt(data, 0x1e8 + offset);
|
||||
field_50_nfcFtnRef = LittleEndian.getShort(data, 0x1ec + offset);
|
||||
field_51_nfcEdnRef = LittleEndian.getShort(data, 0x1ee + offset);
|
||||
field_52_hpsZoonFontPag = LittleEndian.getShort(data, 0x1f0 + offset);
|
||||
field_53_dywDispPag = LittleEndian.getShort(data, 0x1f2 + offset);
|
||||
|
||||
}
|
||||
|
||||
public void serialize(byte[] data, int offset)
|
||||
{
|
||||
data[ 0x0 + offset] = field_1_formatFlags;;
|
||||
data[ 0x1 + offset] = field_2_unused2;;
|
||||
LittleEndian.putShort(data, 0x2 + offset, (short)field_3_footnoteInfo);;
|
||||
data[ 0x4 + offset] = field_4_fOutlineDirtySave;;
|
||||
data[ 0x5 + offset] = field_5_docinfo;;
|
||||
data[ 0x6 + offset] = field_6_docinfo1;;
|
||||
data[ 0x7 + offset] = field_7_docinfo2;;
|
||||
LittleEndian.putShort(data, 0x8 + offset, (short)field_8_docinfo3);;
|
||||
LittleEndian.putShort(data, 0xa + offset, (short)field_9_dxaTab);;
|
||||
LittleEndian.putShort(data, 0xc + offset, (short)field_10_wSpare);;
|
||||
LittleEndian.putShort(data, 0xe + offset, (short)field_11_dxaHotz);;
|
||||
LittleEndian.putShort(data, 0x10 + offset, (short)field_12_cConsexHypLim);;
|
||||
LittleEndian.putShort(data, 0x12 + offset, (short)field_13_wSpare2);;
|
||||
LittleEndian.putInt(data, 0x14 + offset, field_14_dttmCreated);;
|
||||
LittleEndian.putInt(data, 0x18 + offset, field_15_dttmRevised);;
|
||||
LittleEndian.putInt(data, 0x1c + offset, field_16_dttmLastPrint);;
|
||||
LittleEndian.putShort(data, 0x20 + offset, (short)field_17_nRevision);;
|
||||
LittleEndian.putInt(data, 0x22 + offset, field_18_tmEdited);;
|
||||
LittleEndian.putInt(data, 0x26 + offset, field_19_cWords);;
|
||||
LittleEndian.putInt(data, 0x2a + offset, field_20_cCh);;
|
||||
LittleEndian.putShort(data, 0x2e + offset, (short)field_21_cPg);;
|
||||
LittleEndian.putInt(data, 0x30 + offset, field_22_cParas);;
|
||||
LittleEndian.putShort(data, 0x34 + offset, (short)field_23_Edn);;
|
||||
LittleEndian.putShort(data, 0x36 + offset, (short)field_24_Edn1);;
|
||||
LittleEndian.putInt(data, 0x38 + offset, field_25_cLines);;
|
||||
LittleEndian.putInt(data, 0x3c + offset, field_26_cWordsFtnEnd);;
|
||||
LittleEndian.putInt(data, 0x40 + offset, field_27_cChFtnEdn);;
|
||||
LittleEndian.putShort(data, 0x44 + offset, (short)field_28_cPgFtnEdn);;
|
||||
LittleEndian.putInt(data, 0x46 + offset, field_29_cParasFtnEdn);;
|
||||
LittleEndian.putInt(data, 0x4a + offset, field_30_cLinesFtnEdn);;
|
||||
LittleEndian.putInt(data, 0x4e + offset, field_31_lKeyProtDoc);;
|
||||
LittleEndian.putShort(data, 0x52 + offset, (short)field_32_view);;
|
||||
LittleEndian.putInt(data, 0x54 + offset, field_33_docinfo4);;
|
||||
LittleEndian.putShort(data, 0x58 + offset, (short)field_34_adt);;
|
||||
;
|
||||
;
|
||||
LittleEndian.putShort(data, 0x19a + offset, (short)field_37_docinfo5);;
|
||||
LittleEndian.putShort(data, 0x19c + offset, (short)field_38_docinfo6);;
|
||||
;
|
||||
LittleEndian.putInt(data, 0x1aa + offset, field_40_cChWS);;
|
||||
LittleEndian.putInt(data, 0x1ae + offset, field_41_cChWSFtnEdn);;
|
||||
LittleEndian.putInt(data, 0x1b2 + offset, field_42_grfDocEvents);;
|
||||
LittleEndian.putInt(data, 0x1b6 + offset, field_43_virusinfo);;
|
||||
;
|
||||
LittleEndian.putInt(data, 0x1d8 + offset, field_45_reserved1);;
|
||||
LittleEndian.putInt(data, 0x1dc + offset, field_46_reserved2);;
|
||||
LittleEndian.putInt(data, 0x1e0 + offset, field_47_cDBC);;
|
||||
LittleEndian.putInt(data, 0x1e4 + offset, field_48_cDBCFtnEdn);;
|
||||
LittleEndian.putInt(data, 0x1e8 + offset, field_49_reserved);;
|
||||
LittleEndian.putShort(data, 0x1ec + offset, (short)field_50_nfcFtnRef);;
|
||||
LittleEndian.putShort(data, 0x1ee + offset, (short)field_51_nfcEdnRef);;
|
||||
LittleEndian.putShort(data, 0x1f0 + offset, (short)field_52_hpsZoonFontPag);;
|
||||
LittleEndian.putShort(data, 0x1f2 + offset, (short)field_53_dywDispPag);;
|
||||
|
||||
}
|
||||
|
||||
@ -304,7 +362,7 @@ public abstract class DOPAbstractType
|
||||
|
||||
buffer.append(" .unused2 = ");
|
||||
buffer.append("0x");
|
||||
buffer.append(HexDump.toHex((short)getUnused2()));
|
||||
buffer.append(HexDump.toHex((byte)getUnused2()));
|
||||
buffer.append(" (").append(getUnused2()).append(" )\n");
|
||||
|
||||
buffer.append(" .footnoteInfo = ");
|
||||
@ -657,7 +715,7 @@ public abstract class DOPAbstractType
|
||||
*/
|
||||
public int getSize()
|
||||
{
|
||||
return 4 + 1 + 2 + 2 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 2 + 2 + 2 + 4 + 4 + 4 + 2 + 4 + 4 + 4 + 2 + 4 + 2 + 2 + 4 + 4 + 4 + 2 + 4 + 4 + 4 + 2 + 4 + 2 + 310 + 10 + 2 + 2 + 12 + 4 + 4 + 4 + 4 + 30 + 4 + 4 + 4 + 4 + 4 + 2 + 2 + 2 + 2;
|
||||
return 4 + + 1 + 1 + 2 + 1 + 1 + 1 + 1 + 2 + 2 + 2 + 2 + 2 + 2 + 4 + 4 + 4 + 2 + 4 + 4 + 4 + 2 + 4 + 2 + 2 + 4 + 4 + 4 + 2 + 4 + 4 + 4 + 2 + 4 + 2 + 310 + 10 + 2 + 2 + 12 + 4 + 4 + 4 + 4 + 30 + 4 + 4 + 4 + 4 + 4 + 2 + 2 + 2 + 2;
|
||||
}
|
||||
|
||||
|
||||
@ -681,7 +739,7 @@ public abstract class DOPAbstractType
|
||||
/**
|
||||
* Get the unused2 field for the DOP record.
|
||||
*/
|
||||
public short getUnused2()
|
||||
public byte getUnused2()
|
||||
{
|
||||
return field_2_unused2;
|
||||
}
|
||||
@ -689,7 +747,7 @@ public abstract class DOPAbstractType
|
||||
/**
|
||||
* Set the unused2 field for the DOP record.
|
||||
*/
|
||||
public void setUnused2(short field_2_unused2)
|
||||
public void setUnused2(byte field_2_unused2)
|
||||
{
|
||||
this.field_2_unused2 = field_2_unused2;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes.definitions;
|
||||
package org.apache.poi.hwpf.model.hdftypes.definitions;
|
||||
|
||||
|
||||
|
||||
@ -81,29 +81,29 @@ public abstract class FIBAbstractType
|
||||
private int field_4_lid;
|
||||
private int field_5_pnNext;
|
||||
private short field_6_options;
|
||||
private BitField fDot = new BitField(0x0001);
|
||||
private BitField fGlsy = new BitField(0x0002);
|
||||
private BitField fComplex = new BitField(0x0004);
|
||||
private BitField fHasPic = new BitField(0x0008);
|
||||
private BitField cQuickSaves = new BitField(0x00F0);
|
||||
private BitField fEncrypted = new BitField(0x0100);
|
||||
private BitField fWhichTblStm = new BitField(0x0200);
|
||||
private BitField fReadOnlyRecommended = new BitField(0x0400);
|
||||
private BitField fWriteReservation = new BitField(0x0800);
|
||||
private BitField fExtChar = new BitField(0x1000);
|
||||
private BitField fLoadOverride = new BitField(0x2000);
|
||||
private BitField fFarEast = new BitField(0x4000);
|
||||
private BitField fCrypto = new BitField(0x8000);
|
||||
private static BitField fDot = new BitField(0x0001);
|
||||
private static BitField fGlsy = new BitField(0x0002);
|
||||
private static BitField fComplex = new BitField(0x0004);
|
||||
private static BitField fHasPic = new BitField(0x0008);
|
||||
private static BitField cQuickSaves = new BitField(0x00F0);
|
||||
private static BitField fEncrypted = new BitField(0x0100);
|
||||
private static BitField fWhichTblStm = new BitField(0x0200);
|
||||
private static BitField fReadOnlyRecommended = new BitField(0x0400);
|
||||
private static BitField fWriteReservation = new BitField(0x0800);
|
||||
private static BitField fExtChar = new BitField(0x1000);
|
||||
private static BitField fLoadOverride = new BitField(0x2000);
|
||||
private static BitField fFarEast = new BitField(0x4000);
|
||||
private static BitField fCrypto = new BitField(0x8000);
|
||||
private int field_7_nFibBack;
|
||||
private int field_8_lKey;
|
||||
private int field_9_envr;
|
||||
private short field_10_history;
|
||||
private BitField fMac = new BitField(0x0001);
|
||||
private BitField fEmptySpecial = new BitField(0x0002);
|
||||
private BitField fLoadOverridePage = new BitField(0x0004);
|
||||
private BitField fFutureSavedUndo = new BitField(0x0008);
|
||||
private BitField fWord97Saved = new BitField(0x0010);
|
||||
private BitField fSpare0 = new BitField(0x00FE);
|
||||
private static BitField fMac = new BitField(0x0001);
|
||||
private static BitField fEmptySpecial = new BitField(0x0002);
|
||||
private static BitField fLoadOverridePage = new BitField(0x0004);
|
||||
private static BitField fFutureSavedUndo = new BitField(0x0008);
|
||||
private static BitField fWord97Saved = new BitField(0x0010);
|
||||
private static BitField fSpare0 = new BitField(0x00FE);
|
||||
private int field_11_chs;
|
||||
private int field_12_chsTables;
|
||||
private int field_13_fcMin;
|
||||
@ -584,6 +584,250 @@ public abstract class FIBAbstractType
|
||||
|
||||
}
|
||||
|
||||
public void serialize(byte[] data, int offset)
|
||||
{
|
||||
LittleEndian.putShort(data, 0x0 + offset, (short)field_1_wIdent);;
|
||||
LittleEndian.putShort(data, 0x2 + offset, (short)field_2_nFib);;
|
||||
LittleEndian.putShort(data, 0x4 + offset, (short)field_3_nProduct);;
|
||||
LittleEndian.putShort(data, 0x6 + offset, (short)field_4_lid);;
|
||||
LittleEndian.putShort(data, 0x8 + offset, (short)field_5_pnNext);;
|
||||
LittleEndian.putShort(data, 0xa + offset, (short)field_6_options);;
|
||||
LittleEndian.putShort(data, 0xc + offset, (short)field_7_nFibBack);;
|
||||
LittleEndian.putShort(data, 0xe + offset, (short)field_8_lKey);;
|
||||
LittleEndian.putShort(data, 0x10 + offset, (short)field_9_envr);;
|
||||
LittleEndian.putShort(data, 0x12 + offset, (short)field_10_history);;
|
||||
LittleEndian.putShort(data, 0x14 + offset, (short)field_11_chs);;
|
||||
LittleEndian.putShort(data, 0x16 + offset, (short)field_12_chsTables);;
|
||||
LittleEndian.putInt(data, 0x18 + offset, field_13_fcMin);;
|
||||
LittleEndian.putInt(data, 0x1c + offset, field_14_fcMac);;
|
||||
LittleEndian.putShort(data, 0x20 + offset, (short)field_15_csw);;
|
||||
LittleEndian.putShort(data, 0x22 + offset, (short)field_16_wMagicCreated);;
|
||||
LittleEndian.putShort(data, 0x24 + offset, (short)field_17_wMagicRevised);;
|
||||
LittleEndian.putShort(data, 0x26 + offset, (short)field_18_wMagicCreatedPrivate);;
|
||||
LittleEndian.putShort(data, 0x28 + offset, (short)field_19_wMagicRevisedPrivate);;
|
||||
LittleEndian.putShort(data, 0x2a + offset, (short)field_20_pnFbpChpFirst_W6);;
|
||||
LittleEndian.putShort(data, 0x2c + offset, (short)field_21_pnChpFirst_W6);;
|
||||
LittleEndian.putShort(data, 0x2e + offset, (short)field_22_cpnBteChp_W6);;
|
||||
LittleEndian.putShort(data, 0x30 + offset, (short)field_23_pnFbpPapFirst_W6);;
|
||||
LittleEndian.putShort(data, 0x32 + offset, (short)field_24_pnPapFirst_W6);;
|
||||
LittleEndian.putShort(data, 0x34 + offset, (short)field_25_cpnBtePap_W6);;
|
||||
LittleEndian.putShort(data, 0x36 + offset, (short)field_26_pnFbpLvcFirst_W6);;
|
||||
LittleEndian.putShort(data, 0x38 + offset, (short)field_27_pnLvcFirst_W6);;
|
||||
LittleEndian.putShort(data, 0x3a + offset, (short)field_28_cpnBteLvc_W6);;
|
||||
LittleEndian.putShort(data, 0x3c + offset, (short)field_29_lidFE);;
|
||||
LittleEndian.putShort(data, 0x3e + offset, (short)field_30_clw);;
|
||||
LittleEndian.putInt(data, 0x40 + offset, field_31_cbMac);;
|
||||
LittleEndian.putInt(data, 0x44 + offset, field_32_lProductCreated);;
|
||||
LittleEndian.putInt(data, 0x48 + offset, field_33_lProductRevised);;
|
||||
LittleEndian.putInt(data, 0x4c + offset, field_34_ccpText);;
|
||||
LittleEndian.putInt(data, 0x50 + offset, field_35_ccpFtn);;
|
||||
LittleEndian.putInt(data, 0x54 + offset, field_36_ccpHdd);;
|
||||
LittleEndian.putInt(data, 0x58 + offset, field_37_ccpMcr);;
|
||||
LittleEndian.putInt(data, 0x5c + offset, field_38_ccpAtn);;
|
||||
LittleEndian.putInt(data, 0x60 + offset, field_39_ccpEdn);;
|
||||
LittleEndian.putInt(data, 0x64 + offset, field_40_ccpTxbx);;
|
||||
LittleEndian.putInt(data, 0x68 + offset, field_41_ccpHdrTxbx);;
|
||||
LittleEndian.putInt(data, 0x6c + offset, field_42_pnFbpChpFirst);;
|
||||
LittleEndian.putInt(data, 0x70 + offset, field_43_pnChpFirst);;
|
||||
LittleEndian.putInt(data, 0x74 + offset, field_44_cpnBteChp);;
|
||||
LittleEndian.putInt(data, 0x78 + offset, field_45_pnFbpPapFirst);;
|
||||
LittleEndian.putInt(data, 0x7c + offset, field_46_pnPapFirst);;
|
||||
LittleEndian.putInt(data, 0x80 + offset, field_47_cpnBtePap);;
|
||||
LittleEndian.putInt(data, 0x84 + offset, field_48_pnFbpLvcFirst);;
|
||||
LittleEndian.putInt(data, 0x88 + offset, field_49_pnLvcFirst);;
|
||||
LittleEndian.putInt(data, 0x8c + offset, field_50_cpnBteLvc);;
|
||||
LittleEndian.putInt(data, 0x90 + offset, field_51_fcIslandFirst);;
|
||||
LittleEndian.putInt(data, 0x94 + offset, field_52_fcIslandLim);;
|
||||
LittleEndian.putShort(data, 0x98 + offset, (short)field_53_cfclcb);;
|
||||
LittleEndian.putInt(data, 0x9a + offset, field_54_fcStshfOrig);;
|
||||
LittleEndian.putInt(data, 0x9e + offset, field_55_lcbStshfOrig);;
|
||||
LittleEndian.putInt(data, 0xa2 + offset, field_56_fcStshf);;
|
||||
LittleEndian.putInt(data, 0xa6 + offset, field_57_lcbStshf);;
|
||||
LittleEndian.putInt(data, 0xaa + offset, field_58_fcPlcffndRef);;
|
||||
LittleEndian.putInt(data, 0xae + offset, field_59_lcbPlcffndRef);;
|
||||
LittleEndian.putInt(data, 0xb2 + offset, field_60_fcPlcffndTxt);;
|
||||
LittleEndian.putInt(data, 0xb6 + offset, field_61_lcbPlcffndTxt);;
|
||||
LittleEndian.putInt(data, 0xba + offset, field_62_fcPlcfandRef);;
|
||||
LittleEndian.putInt(data, 0xbe + offset, field_63_lcbPlcfandRef);;
|
||||
LittleEndian.putInt(data, 0xc2 + offset, field_64_fcPlcfandTxt);;
|
||||
LittleEndian.putInt(data, 0xc6 + offset, field_65_lcbPlcfandTxt);;
|
||||
LittleEndian.putInt(data, 0xca + offset, field_66_fcPlcfsed);;
|
||||
LittleEndian.putInt(data, 0xce + offset, field_67_lcbPlcfsed);;
|
||||
LittleEndian.putInt(data, 0xd2 + offset, field_68_fcPlcpad);;
|
||||
LittleEndian.putInt(data, 0xd6 + offset, field_69_lcbPlcpad);;
|
||||
LittleEndian.putInt(data, 0xda + offset, field_70_fcPlcfphe);;
|
||||
LittleEndian.putInt(data, 0xde + offset, field_71_lcbPlcfphe);;
|
||||
LittleEndian.putInt(data, 0xe2 + offset, field_72_fcSttbfglsy);;
|
||||
LittleEndian.putInt(data, 0xe6 + offset, field_73_lcbSttbfglsy);;
|
||||
LittleEndian.putInt(data, 0xea + offset, field_74_fcPlcfglsy);;
|
||||
LittleEndian.putInt(data, 0xee + offset, field_75_lcbPlcfglsy);;
|
||||
LittleEndian.putInt(data, 0xf2 + offset, field_76_fcPlcfhdd);;
|
||||
LittleEndian.putInt(data, 0xf6 + offset, field_77_lcbPlcfhdd);;
|
||||
LittleEndian.putInt(data, 0xfa + offset, field_78_fcPlcfbteChpx);;
|
||||
LittleEndian.putInt(data, 0xfe + offset, field_79_lcbPlcfbteChpx);;
|
||||
LittleEndian.putInt(data, 0x102 + offset, field_80_fcPlcfbtePapx);;
|
||||
LittleEndian.putInt(data, 0x106 + offset, field_81_lcbPlcfbtePapx);;
|
||||
LittleEndian.putInt(data, 0x10a + offset, field_82_fcPlcfsea);;
|
||||
LittleEndian.putInt(data, 0x10e + offset, field_83_lcbPlcfsea);;
|
||||
LittleEndian.putInt(data, 0x112 + offset, field_84_fcSttbfffn);;
|
||||
LittleEndian.putInt(data, 0x116 + offset, field_85_lcbSttbfffn);;
|
||||
LittleEndian.putInt(data, 0x11a + offset, field_86_fcPlcffldMom);;
|
||||
LittleEndian.putInt(data, 0x11e + offset, field_87_lcbPlcffldMom);;
|
||||
LittleEndian.putInt(data, 0x122 + offset, field_88_fcPlcffldHdr);;
|
||||
LittleEndian.putInt(data, 0x126 + offset, field_89_lcbPlcffldHdr);;
|
||||
LittleEndian.putInt(data, 0x12a + offset, field_90_fcPlcffldFtn);;
|
||||
LittleEndian.putInt(data, 0x12e + offset, field_91_lcbPlcffldFtn);;
|
||||
LittleEndian.putInt(data, 0x132 + offset, field_92_fcPlcffldAtn);;
|
||||
LittleEndian.putInt(data, 0x136 + offset, field_93_lcbPlcffldAtn);;
|
||||
LittleEndian.putInt(data, 0x13a + offset, field_94_fcPlcffldMcr);;
|
||||
LittleEndian.putInt(data, 0x13e + offset, field_95_lcbPlcffldMcr);;
|
||||
LittleEndian.putInt(data, 0x142 + offset, field_96_fcSttbfbkmk);;
|
||||
LittleEndian.putInt(data, 0x146 + offset, field_97_lcbSttbfbkmk);;
|
||||
LittleEndian.putInt(data, 0x14a + offset, field_98_fcPlcfbkf);;
|
||||
LittleEndian.putInt(data, 0x14e + offset, field_99_lcbPlcfbkf);;
|
||||
LittleEndian.putInt(data, 0x152 + offset, field_100_fcPlcfbkl);;
|
||||
LittleEndian.putInt(data, 0x156 + offset, field_101_lcbPlcfbkl);;
|
||||
LittleEndian.putInt(data, 0x15a + offset, field_102_fcCmds);;
|
||||
LittleEndian.putInt(data, 0x15e + offset, field_103_lcbCmds);;
|
||||
LittleEndian.putInt(data, 0x162 + offset, field_104_fcPlcmcr);;
|
||||
LittleEndian.putInt(data, 0x166 + offset, field_105_lcbPlcmcr);;
|
||||
LittleEndian.putInt(data, 0x16a + offset, field_106_fcSttbfmcr);;
|
||||
LittleEndian.putInt(data, 0x16e + offset, field_107_lcbSttbfmcr);;
|
||||
LittleEndian.putInt(data, 0x172 + offset, field_108_fcPrDrvr);;
|
||||
LittleEndian.putInt(data, 0x176 + offset, field_109_lcbPrDrvr);;
|
||||
LittleEndian.putInt(data, 0x17a + offset, field_110_fcPrEnvPort);;
|
||||
LittleEndian.putInt(data, 0x17e + offset, field_111_lcbPrEnvPort);;
|
||||
LittleEndian.putInt(data, 0x182 + offset, field_112_fcPrEnvLand);;
|
||||
LittleEndian.putInt(data, 0x186 + offset, field_113_lcbPrEnvLand);;
|
||||
LittleEndian.putInt(data, 0x18a + offset, field_114_fcWss);;
|
||||
LittleEndian.putInt(data, 0x18e + offset, field_115_lcbWss);;
|
||||
LittleEndian.putInt(data, 0x192 + offset, field_116_fcDop);;
|
||||
LittleEndian.putInt(data, 0x196 + offset, field_117_lcbDop);;
|
||||
LittleEndian.putInt(data, 0x19a + offset, field_118_fcSttbfAssoc);;
|
||||
LittleEndian.putInt(data, 0x19e + offset, field_119_lcbSttbfAssoc);;
|
||||
LittleEndian.putInt(data, 0x1a2 + offset, field_120_fcClx);;
|
||||
LittleEndian.putInt(data, 0x1a6 + offset, field_121_lcbClx);;
|
||||
LittleEndian.putInt(data, 0x1aa + offset, field_122_fcPlcfpgdFtn);;
|
||||
LittleEndian.putInt(data, 0x1ae + offset, field_123_lcbPlcfpgdFtn);;
|
||||
LittleEndian.putInt(data, 0x1b2 + offset, field_124_fcAutosaveSource);;
|
||||
LittleEndian.putInt(data, 0x1b6 + offset, field_125_lcbAutosaveSource);;
|
||||
LittleEndian.putInt(data, 0x1ba + offset, field_126_fcGrpXstAtnOwners);;
|
||||
LittleEndian.putInt(data, 0x1be + offset, field_127_lcbGrpXstAtnOwners);;
|
||||
LittleEndian.putInt(data, 0x1c2 + offset, field_128_fcSttbfAtnbkmk);;
|
||||
LittleEndian.putInt(data, 0x1c6 + offset, field_129_lcbSttbfAtnbkmk);;
|
||||
LittleEndian.putInt(data, 0x1ca + offset, field_130_fcPlcdoaMom);;
|
||||
LittleEndian.putInt(data, 0x1ce + offset, field_131_lcbPlcdoaMom);;
|
||||
LittleEndian.putInt(data, 0x1d2 + offset, field_132_fcPlcdoaHdr);;
|
||||
LittleEndian.putInt(data, 0x1d6 + offset, field_133_lcbPlcdoaHdr);;
|
||||
LittleEndian.putInt(data, 0x1da + offset, field_134_fcPlcspaMom);;
|
||||
LittleEndian.putInt(data, 0x1de + offset, field_135_lcbPlcspaMom);;
|
||||
LittleEndian.putInt(data, 0x1e2 + offset, field_136_fcPlcspaHdr);;
|
||||
LittleEndian.putInt(data, 0x1e6 + offset, field_137_lcbPlcspaHdr);;
|
||||
LittleEndian.putInt(data, 0x1ea + offset, field_138_fcPlcfAtnbkf);;
|
||||
LittleEndian.putInt(data, 0x1ee + offset, field_139_lcbPlcfAtnbkf);;
|
||||
LittleEndian.putInt(data, 0x1f2 + offset, field_140_fcPlcfAtnbkl);;
|
||||
LittleEndian.putInt(data, 0x1f6 + offset, field_141_lcbPlcfAtnbkl);;
|
||||
LittleEndian.putInt(data, 0x1fa + offset, field_142_fcPms);;
|
||||
LittleEndian.putInt(data, 0x1fe + offset, field_143_lcbPms);;
|
||||
LittleEndian.putInt(data, 0x202 + offset, field_144_fcFormFldSttbs);;
|
||||
LittleEndian.putInt(data, 0x206 + offset, field_145_lcbFormFldSttbs);;
|
||||
LittleEndian.putInt(data, 0x20a + offset, field_146_fcPlcfendRef);;
|
||||
LittleEndian.putInt(data, 0x20e + offset, field_147_lcbPlcfendRef);;
|
||||
LittleEndian.putInt(data, 0x212 + offset, field_148_fcPlcfendTxt);;
|
||||
LittleEndian.putInt(data, 0x216 + offset, field_149_lcbPlcfendTxt);;
|
||||
LittleEndian.putInt(data, 0x21a + offset, field_150_fcPlcffldEdn);;
|
||||
LittleEndian.putInt(data, 0x21e + offset, field_151_lcbPlcffldEdn);;
|
||||
LittleEndian.putInt(data, 0x222 + offset, field_152_fcPlcfpgdEdn);;
|
||||
LittleEndian.putInt(data, 0x226 + offset, field_153_lcbPlcfpgdEdn);;
|
||||
LittleEndian.putInt(data, 0x22a + offset, field_154_fcDggInfo);;
|
||||
LittleEndian.putInt(data, 0x22e + offset, field_155_lcbDggInfo);;
|
||||
LittleEndian.putInt(data, 0x232 + offset, field_156_fcSttbfRMark);;
|
||||
LittleEndian.putInt(data, 0x236 + offset, field_157_lcbSttbfRMark);;
|
||||
LittleEndian.putInt(data, 0x23a + offset, field_158_fcSttbCaption);;
|
||||
LittleEndian.putInt(data, 0x23e + offset, field_159_lcbSttbCaption);;
|
||||
LittleEndian.putInt(data, 0x242 + offset, field_160_fcSttbAutoCaption);;
|
||||
LittleEndian.putInt(data, 0x246 + offset, field_161_lcbSttbAutoCaption);;
|
||||
LittleEndian.putInt(data, 0x24a + offset, field_162_fcPlcfwkb);;
|
||||
LittleEndian.putInt(data, 0x24e + offset, field_163_lcbPlcfwkb);;
|
||||
LittleEndian.putInt(data, 0x252 + offset, field_164_fcPlcfspl);;
|
||||
LittleEndian.putInt(data, 0x256 + offset, field_165_lcbPlcfspl);;
|
||||
LittleEndian.putInt(data, 0x25a + offset, field_166_fcPlcftxbxTxt);;
|
||||
LittleEndian.putInt(data, 0x25e + offset, field_167_lcbPlcftxbxTxt);;
|
||||
LittleEndian.putInt(data, 0x262 + offset, field_168_fcPlcffldTxbx);;
|
||||
LittleEndian.putInt(data, 0x266 + offset, field_169_lcbPlcffldTxbx);;
|
||||
LittleEndian.putInt(data, 0x26a + offset, field_170_fcPlcfhdrtxbxTxt);;
|
||||
LittleEndian.putInt(data, 0x26e + offset, field_171_lcbPlcfhdrtxbxTxt);;
|
||||
LittleEndian.putInt(data, 0x272 + offset, field_172_fcPlcffldHdrTxbx);;
|
||||
LittleEndian.putInt(data, 0x276 + offset, field_173_lcbPlcffldHdrTxbx);;
|
||||
LittleEndian.putInt(data, 0x27a + offset, field_174_fcStwUser);;
|
||||
LittleEndian.putInt(data, 0x27e + offset, field_175_lcbStwUser);;
|
||||
LittleEndian.putInt(data, 0x282 + offset, field_176_fcSttbttmbd);;
|
||||
LittleEndian.putInt(data, 0x286 + offset, field_177_cbSttbttmbd);;
|
||||
LittleEndian.putInt(data, 0x28a + offset, field_178_fcUnused);;
|
||||
LittleEndian.putInt(data, 0x28e + offset, field_179_lcbUnused);;
|
||||
LittleEndian.putInt(data, 0x292 + offset, field_180_fcPgdMother);;
|
||||
LittleEndian.putInt(data, 0x296 + offset, field_181_lcbPgdMother);;
|
||||
LittleEndian.putInt(data, 0x29a + offset, field_182_fcBkdMother);;
|
||||
LittleEndian.putInt(data, 0x29e + offset, field_183_lcbBkdMother);;
|
||||
LittleEndian.putInt(data, 0x2a2 + offset, field_184_fcPgdFtn);;
|
||||
LittleEndian.putInt(data, 0x2a6 + offset, field_185_lcbPgdFtn);;
|
||||
LittleEndian.putInt(data, 0x2aa + offset, field_186_fcBkdFtn);;
|
||||
LittleEndian.putInt(data, 0x2ae + offset, field_187_lcbBkdFtn);;
|
||||
LittleEndian.putInt(data, 0x2b2 + offset, field_188_fcPgdEdn);;
|
||||
LittleEndian.putInt(data, 0x2b6 + offset, field_189_lcbPgdEdn);;
|
||||
LittleEndian.putInt(data, 0x2ba + offset, field_190_fcBkdEdn);;
|
||||
LittleEndian.putInt(data, 0x2be + offset, field_191_lcbBkdEdn);;
|
||||
LittleEndian.putInt(data, 0x2c2 + offset, field_192_fcSttbfIntlFld);;
|
||||
LittleEndian.putInt(data, 0x2c6 + offset, field_193_lcbSttbfIntlFld);;
|
||||
LittleEndian.putInt(data, 0x2ca + offset, field_194_fcRouteSlip);;
|
||||
LittleEndian.putInt(data, 0x2ce + offset, field_195_lcbRouteSlip);;
|
||||
LittleEndian.putInt(data, 0x2d2 + offset, field_196_fcSttbSavedBy);;
|
||||
LittleEndian.putInt(data, 0x2d6 + offset, field_197_lcbSttbSavedBy);;
|
||||
LittleEndian.putInt(data, 0x2da + offset, field_198_fcSttbFnm);;
|
||||
LittleEndian.putInt(data, 0x2de + offset, field_199_lcbSttbFnm);;
|
||||
LittleEndian.putInt(data, 0x2e2 + offset, field_200_fcPlcfLst);;
|
||||
LittleEndian.putInt(data, 0x2e6 + offset, field_201_lcbPlcfLst);;
|
||||
LittleEndian.putInt(data, 0x2ea + offset, field_202_fcPlfLfo);;
|
||||
LittleEndian.putInt(data, 0x2ee + offset, field_203_lcbPlfLfo);;
|
||||
LittleEndian.putInt(data, 0x2f2 + offset, field_204_fcPlcftxbxBkd);;
|
||||
LittleEndian.putInt(data, 0x2f6 + offset, field_205_lcbPlcftxbxBkd);;
|
||||
LittleEndian.putInt(data, 0x2fa + offset, field_206_fcPlcftxbxHdrBkd);;
|
||||
LittleEndian.putInt(data, 0x2fe + offset, field_207_lcbPlcftxbxHdrBkd);;
|
||||
LittleEndian.putInt(data, 0x302 + offset, field_208_fcDocUndo);;
|
||||
LittleEndian.putInt(data, 0x306 + offset, field_209_lcbDocUndo);;
|
||||
LittleEndian.putInt(data, 0x30a + offset, field_210_fcRgbuse);;
|
||||
LittleEndian.putInt(data, 0x30e + offset, field_211_lcbRgbuse);;
|
||||
LittleEndian.putInt(data, 0x312 + offset, field_212_fcUsp);;
|
||||
LittleEndian.putInt(data, 0x316 + offset, field_213_lcbUsp);;
|
||||
LittleEndian.putInt(data, 0x31a + offset, field_214_fcUskf);;
|
||||
LittleEndian.putInt(data, 0x31e + offset, field_215_lcbUskf);;
|
||||
LittleEndian.putInt(data, 0x322 + offset, field_216_fcPlcupcRgbuse);;
|
||||
LittleEndian.putInt(data, 0x326 + offset, field_217_lcbPlcupcRgbuse);;
|
||||
LittleEndian.putInt(data, 0x32a + offset, field_218_fcPlcupcUsp);;
|
||||
LittleEndian.putInt(data, 0x32e + offset, field_219_lcbPlcupcUsp);;
|
||||
LittleEndian.putInt(data, 0x332 + offset, field_220_fcSttbGlsyStyle);;
|
||||
LittleEndian.putInt(data, 0x336 + offset, field_221_lcbSttbGlsyStyle);;
|
||||
LittleEndian.putInt(data, 0x33a + offset, field_222_fcPlgosl);;
|
||||
LittleEndian.putInt(data, 0x33e + offset, field_223_lcbPlgosl);;
|
||||
LittleEndian.putInt(data, 0x342 + offset, field_224_fcPlcocx);;
|
||||
LittleEndian.putInt(data, 0x346 + offset, field_225_lcbPlcocx);;
|
||||
LittleEndian.putInt(data, 0x34a + offset, field_226_fcPlcfbteLvc);;
|
||||
LittleEndian.putInt(data, 0x34e + offset, field_227_lcbPlcfbteLvc);;
|
||||
LittleEndian.putInt(data, 0x352 + offset, field_228_dwLowDateTime);;
|
||||
LittleEndian.putInt(data, 0x356 + offset, field_229_dwHighDateTime);;
|
||||
LittleEndian.putInt(data, 0x35a + offset, field_230_fcPlcflvc);;
|
||||
LittleEndian.putInt(data, 0x35e + offset, field_231_lcbPlcflvc);;
|
||||
LittleEndian.putInt(data, 0x362 + offset, field_232_fcPlcasumy);;
|
||||
LittleEndian.putInt(data, 0x366 + offset, field_233_lcbPlcasumy);;
|
||||
LittleEndian.putInt(data, 0x36a + offset, field_234_fcPlcfgram);;
|
||||
LittleEndian.putInt(data, 0x36e + offset, field_235_lcbPlcfgram);;
|
||||
LittleEndian.putInt(data, 0x372 + offset, field_236_fcSttbListNames);;
|
||||
LittleEndian.putInt(data, 0x376 + offset, field_237_lcbSttbListNames);;
|
||||
LittleEndian.putInt(data, 0x37a + offset, field_238_fcSttbfUssr);;
|
||||
LittleEndian.putInt(data, 0x37e + offset, field_239_lcbSttbfUssr);;
|
||||
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes.definitions;
|
||||
package org.apache.poi.hwpf.model.hdftypes.definitions;
|
||||
|
||||
|
||||
|
||||
@ -110,9 +110,9 @@ public abstract class PAPAbstractType
|
||||
private byte field_33_fAutoSpaceDN;
|
||||
private int field_34_wAlignFont;
|
||||
private short field_35_fontAlign;
|
||||
private BitField fVertical = new BitField(0x0001);
|
||||
private BitField fBackward = new BitField(0x0002);
|
||||
private BitField fRotateFont = new BitField(0x0004);
|
||||
private static BitField fVertical = new BitField(0x0001);
|
||||
private static BitField fBackward = new BitField(0x0002);
|
||||
private static BitField fRotateFont = new BitField(0x0004);
|
||||
private byte field_36_fBackward;
|
||||
private byte field_37_fRotateFont;
|
||||
private byte field_38_fInTable;
|
||||
@ -157,7 +157,7 @@ public abstract class PAPAbstractType
|
||||
*/
|
||||
public int getSize()
|
||||
{
|
||||
return 4 + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 12 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 2 + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 2 + 1 + 2 + 2 + 1 + 1 + 84 + 1 + 2 + 4 + 128 + 2 + 128 + 128;
|
||||
return 4 + + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 12 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 2 + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 2 + 1 + 2 + 2 + 1 + 1 + 84 + 1 + 2 + 4 + 128 + 2 + 128 + 128;
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes.definitions;
|
||||
package org.apache.poi.hwpf.model.hdftypes.definitions;
|
||||
|
||||
|
||||
|
||||
@ -146,7 +146,7 @@ public abstract class SEPAbstractType
|
||||
*/
|
||||
public int getSize()
|
||||
{
|
||||
return 4 + 1 + 0 + 0 + 1 + 0 + 1 + 0 + 0 + 1 + 1 + 2 + 4 + 2 + 2 + 0 + 1 + 2 + 2 + 2 + 4 + 4 + 4 + 4 + 0 + 2 + 4 + 4 + 4 + 2 + 2 + 1 + 1 + 2 + 2 + 2 + 2 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 2 + 0 + 1 + 4 + 356 + 4 + 1 + 1 + 2 + 212;
|
||||
return 4 + + 1 + 0 + 0 + 1 + 0 + 1 + 0 + 0 + 1 + 1 + 2 + 4 + 2 + 2 + 0 + 1 + 2 + 2 + 2 + 4 + 4 + 4 + 4 + 0 + 2 + 4 + 4 + 4 + 2 + 2 + 1 + 1 + 2 + 2 + 2 + 2 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 2 + 0 + 1 + 4 + 356 + 4 + 1 + 1 + 2 + 212;
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes.definitions;
|
||||
package org.apache.poi.hwpf.model.hdftypes.definitions;
|
||||
|
||||
|
||||
|
||||
@ -103,7 +103,7 @@ public abstract class TAPAbstractType
|
||||
*/
|
||||
public int getSize()
|
||||
{
|
||||
return 4 + 2 + 4 + 4 + 0 + 0 + 4 + 2 + 130 + 0 + 0 + 4 + 4 + 4 + 4 + 4 + 4;
|
||||
return 4 + + 2 + 4 + 4 + 0 + 0 + 4 + 2 + 130 + 0 + 0 + 4 + 4 + 4 + 4 + 4 + 4;
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@
|
||||
*/
|
||||
|
||||
|
||||
package org.apache.poi.hdf.model.hdftypes.definitions;
|
||||
package org.apache.poi.hwpf.model.hdftypes.definitions;
|
||||
|
||||
|
||||
|
||||
@ -76,14 +76,14 @@ public abstract class TCAbstractType
|
||||
{
|
||||
|
||||
private short field_1_rgf;
|
||||
private BitField fFirstMerged = new BitField(0x0001);
|
||||
private BitField fMerged = new BitField(0x0002);
|
||||
private BitField fVertical = new BitField(0x0004);
|
||||
private BitField fBackward = new BitField(0x0008);
|
||||
private BitField fRotateFont = new BitField(0x0010);
|
||||
private BitField fVertMerge = new BitField(0x0020);
|
||||
private BitField fVertRestart = new BitField(0x0040);
|
||||
private BitField vertAlign = new BitField(0x0180);
|
||||
private static BitField fFirstMerged = new BitField(0x0001);
|
||||
private static BitField fMerged = new BitField(0x0002);
|
||||
private static BitField fVertical = new BitField(0x0004);
|
||||
private static BitField fBackward = new BitField(0x0008);
|
||||
private static BitField fRotateFont = new BitField(0x0010);
|
||||
private static BitField fVertMerge = new BitField(0x0020);
|
||||
private static BitField fVertRestart = new BitField(0x0040);
|
||||
private static BitField vertAlign = new BitField(0x0180);
|
||||
private short field_2_unused;
|
||||
private short[] field_3_brcTop;
|
||||
private short[] field_4_brcLeft;
|
||||
@ -101,7 +101,7 @@ public abstract class TCAbstractType
|
||||
*/
|
||||
public int getSize()
|
||||
{
|
||||
return 4 + 2 + 2 + 4 + 4 + 4 + 4;
|
||||
return 4 + + 2 + 2 + 4 + 4 + 4 + 4;
|
||||
}
|
||||
|
||||
|
||||
|
@ -55,6 +55,7 @@
|
||||
package org.apache.poi.hwpf;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
@ -75,23 +76,61 @@ public class HWPFDocument
|
||||
private FileInformationBlock _fib;
|
||||
|
||||
/** main document stream buffer*/
|
||||
byte[] _mainDocument;
|
||||
byte[] _mainStream;
|
||||
|
||||
/** table stream buffer*/
|
||||
byte[] _tableBuffer;
|
||||
byte[] _tableStream;
|
||||
|
||||
public HWPFDocument(InputStream istream) throws IOException
|
||||
{
|
||||
//do Ole stuff
|
||||
_filesystem = new POIFSFileSystem(istream);
|
||||
|
||||
DocumentEntry headerProps =
|
||||
// read in the main stream.
|
||||
DocumentEntry documentProps =
|
||||
(DocumentEntry)_filesystem.getRoot().getEntry("WordDocument");
|
||||
_mainStream = new byte[documentProps.getSize()];
|
||||
_filesystem.createDocumentInputStream("WordDocument").read(_mainStream);
|
||||
|
||||
_mainDocument = new byte[headerProps.getSize()];
|
||||
_filesystem.createDocumentInputStream("WordDocument").read(_mainDocument);
|
||||
// use the fib to determine the name of the table stream.
|
||||
_fib = new FileInformationBlock(_mainStream);
|
||||
|
||||
String name = "0Table";
|
||||
if (_fib.isFWhichTblStm())
|
||||
{
|
||||
name = "1Table";
|
||||
}
|
||||
|
||||
// read in the table stream.
|
||||
DocumentEntry tableProps =
|
||||
(DocumentEntry)_filesystem.getRoot().getEntry(name);
|
||||
_tableStream = new byte[tableProps.getSize()];
|
||||
_filesystem.createDocumentInputStream(name).read(_tableStream);
|
||||
|
||||
// get the start of text in the main stream
|
||||
int fcMin = _fib.getFcMin();
|
||||
|
||||
DocumentProperties dop = new DocumentProperties(_tableStream, _fib.getFcDop());
|
||||
ComplexFileTable cft = new ComplexFileTable(_mainStream, _tableStream, _fib.getFcClx(), fcMin);
|
||||
CHPBinTable cbt = new CHPBinTable(_mainStream, _tableStream, _fib.getFcPlcfbteChpx(), _fib.getLcbPlcfbteChpx(), fcMin);
|
||||
PAPBinTable pbt = new PAPBinTable(_mainStream, _tableStream, _fib.getFcPlcfbtePapx(), _fib.getLcbPlcfbtePapx(), fcMin);
|
||||
SectionTable st = new SectionTable(_mainStream, _tableStream, _fib.getFcPlcfsed(), _fib.getLcbPlcfsed(), fcMin);
|
||||
StyleSheet ss = new StyleSheet(_tableStream, _fib.getFcStshf());
|
||||
|
||||
int x = 0;
|
||||
|
||||
_fib = new FileInformationBlock(_mainDocument);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
HWPFDocument doc = new HWPFDocument(new FileInputStream(args[0]));
|
||||
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user