Reorganized things a bit in preparation for some changes.

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352413 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Glen Stampoultzis 2002-04-14 13:54:00 +00:00
parent ef54430078
commit 9cccf3465b

View File

@ -1,4 +1,3 @@
/* ==================================================================== /* ====================================================================
* The Apache Software License, Version 1.1 * The Apache Software License, Version 1.1
* *
@ -88,13 +87,12 @@ public class BiffViewer
* @param args * @param args
*/ */
public BiffViewer(String [] args) public BiffViewer(String[] args)
{ {
if (args.length > 0) if (args.length > 0)
{ {
filename = args[ 0 ]; filename = args[0];
} } else
else
{ {
System.out.println("BIFFVIEWER REQUIRES A FILENAME***"); System.out.println("BIFFVIEWER REQUIRES A FILENAME***");
} }
@ -115,8 +113,7 @@ public class BiffViewer
InputStream stream = InputStream stream =
fs.createDocumentInputStream("Workbook"); fs.createDocumentInputStream("Workbook");
Record[] records = createRecords(stream, dump); Record[] records = createRecords(stream, dump);
} } catch (Exception e)
catch (Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
@ -135,7 +132,7 @@ public class BiffViewer
* InputStream * InputStream
*/ */
public static Record [] createRecords(InputStream in, boolean dump) public static Record[] createRecords(InputStream in, boolean dump)
throws RecordFormatException throws RecordFormatException
{ {
ArrayList records = new ArrayList(); ArrayList records = new ArrayList();
@ -151,14 +148,14 @@ public class BiffViewer
{ {
rectype = LittleEndian.readShort(in); rectype = LittleEndian.readShort(in);
System.out.println("============================================"); System.out.println("============================================");
System.out.println("you are at offset " + loc); System.out.println("Offset 0x" + Integer.toHexString(loc) + " (" + loc + ")");
loc += 2; loc += 2;
if (rectype != 0) if (rectype != 0)
{ {
short recsize = LittleEndian.readShort(in); short recsize = LittleEndian.readShort(in);
loc += 2; loc += 2;
byte[] data = new byte[ ( int ) recsize ]; byte[] data = new byte[(int) recsize];
in.read(data); in.read(data);
if ((rectype == WSBoolRecord.sid) && (recsize == 0)) if ((rectype == WSBoolRecord.sid) && (recsize == 0))
@ -169,65 +166,42 @@ public class BiffViewer
// offset += 4 + recsize; // offset += 4 + recsize;
if (dump) if (dump)
{ {
// System.out dump(rectype, recsize, data);
// .println("fixing to recordize the following");
System.out.println("rectype = 0x"
+ Integer.toHexString(rectype));
System.out.println("recsize = 0x"
+ Integer.toHexString(recsize));
System.out.println(
"--------------------------------------------");
if (data.length > 0)
{
HexDump.dump(data, 0, System.out, 0);
}
else
{
System.out.print("**NO RECORD DATA**");
}
System.out.println();
System.out.println(
"-END----------------------------------------");
} }
Record[] recs = createRecord(rectype, recsize, Record[] recs = createRecord(rectype, recsize,
data); // handle MulRK records data); // handle MulRK records
if (recs.length > 1) Record record = recs[0];
{
for (int k = 0; k < recs.length; k++)
{
records.add(
recs[ k ]); // these will be number records
last_record =
recs[ k ]; // do to keep the algorythm homogenous...you can't
} // actually continue a number record anyhow.
}
else
{
Record record = recs[ 0 ];
if ((record instanceof UnknownRecord) if ((record instanceof UnknownRecord)
&& !dump) // if we didn't already dump && !dump) // if we didn't already dump
{ // just cause dump was on and we're hit an unknow { // just cause dump was on and we're hit an unknow
dumpUnknownRecord(data);
// record hex dump it!
System.out.println(
"-----UNKNOWN----------------------------------");
if (data.length > 0)
{
HexDump.dump(data, 0, System.out, 0);
}
else
{
System.out.print("**NO RECORD DATA**");
}
System.out.println();
System.out.println(
"-----UNKNOWN----------------------------------");
} }
if (record != null) if (record != null)
{ {
if (rectype == ContinueRecord.sid) if (rectype == ContinueRecord.sid)
{
dumpContinueRecord(last_record, dump, data);
} else
{
last_record = record;
records.add(record);
}
}
}
} while (rectype != 0);
} catch (IOException e)
{
throw new RecordFormatException("Error reading bytes");
}
Record[] retval = new Record[records.size()];
retval = (Record[]) records.toArray(retval);
return retval;
}
private static void dumpContinueRecord(Record last_record, boolean dump, byte[] data) throws IOException
{ {
if (last_record == null) if (last_record == null)
{ {
@ -261,25 +235,44 @@ public class BiffViewer
"-----CONTINUED----------------------------------"); "-----CONTINUED----------------------------------");
} }
} }
else
{
last_record = record;
records.add(record);
}
}
}
}
}
while (rectype != 0);
}
catch (IOException e)
{
throw new RecordFormatException("Error reading bytes");
}
Record[] retval = new Record[ records.size() ];
retval = ( Record [] ) records.toArray(retval); private static void dumpUnknownRecord(byte[] data) throws IOException
return retval; {
// record hex dump it!
System.out.println(
"-----UNKNOWN----------------------------------");
if (data.length > 0)
{
HexDump.dump(data, 0, System.out, 0);
} else
{
System.out.print("**NO RECORD DATA**");
}
System.out.println();
System.out.println(
"-----UNKNOWN----------------------------------");
}
private static void dump(short rectype, short recsize, byte[] data) throws IOException
{
// System.out
// .println("fixing to recordize the following");
System.out.print("rectype = 0x"
+ Integer.toHexString(rectype));
System.out.println(", recsize = 0x"
+ Integer.toHexString(recsize));
System.out.println(
"-BEGIN DUMP---------------------------------");
if (data.length > 0)
{
HexDump.dump(data, 0, System.out, 0);
} else
{
System.out.println("**NO RECORD DATA**");
}
// System.out.println();
System.out.println(
"-END DUMP-----------------------------------");
} }
/** /**
@ -288,8 +281,8 @@ public class BiffViewer
* *
*/ */
private static Record [] createRecord(short rectype, short size, private static Record[] createRecord(short rectype, short size,
byte [] data) byte[] data)
{ {
Record retval = null; Record retval = null;
Record[] realretval = null; Record[] realretval = null;
@ -298,343 +291,343 @@ public class BiffViewer
switch (rectype) switch (rectype)
{ {
case ChartRecord.sid : case ChartRecord.sid:
retval = new ChartRecord(rectype, size, data); retval = new ChartRecord(rectype, size, data);
break; break;
case ChartFormatRecord.sid : case ChartFormatRecord.sid:
retval = new ChartFormatRecord(rectype, size, data); retval = new ChartFormatRecord(rectype, size, data);
break; break;
case SeriesRecord.sid : case SeriesRecord.sid:
retval = new SeriesRecord(rectype, size, data); retval = new SeriesRecord(rectype, size, data);
break; break;
case BeginRecord.sid : case BeginRecord.sid:
retval = new BeginRecord(rectype, size, data); retval = new BeginRecord(rectype, size, data);
break; break;
case EndRecord.sid : case EndRecord.sid:
retval = new EndRecord(rectype, size, data); retval = new EndRecord(rectype, size, data);
break; break;
case BOFRecord.sid : case BOFRecord.sid:
retval = new BOFRecord(rectype, size, data); retval = new BOFRecord(rectype, size, data);
break; break;
case InterfaceHdrRecord.sid : case InterfaceHdrRecord.sid:
retval = new InterfaceHdrRecord(rectype, size, data); retval = new InterfaceHdrRecord(rectype, size, data);
break; break;
case MMSRecord.sid : case MMSRecord.sid:
retval = new MMSRecord(rectype, size, data); retval = new MMSRecord(rectype, size, data);
break; break;
case InterfaceEndRecord.sid : case InterfaceEndRecord.sid:
retval = new InterfaceEndRecord(rectype, size, data); retval = new InterfaceEndRecord(rectype, size, data);
break; break;
case WriteAccessRecord.sid : case WriteAccessRecord.sid:
retval = new WriteAccessRecord(rectype, size, data); retval = new WriteAccessRecord(rectype, size, data);
break; break;
case CodepageRecord.sid : case CodepageRecord.sid:
retval = new CodepageRecord(rectype, size, data); retval = new CodepageRecord(rectype, size, data);
break; break;
case DSFRecord.sid : case DSFRecord.sid:
retval = new DSFRecord(rectype, size, data); retval = new DSFRecord(rectype, size, data);
break; break;
case TabIdRecord.sid : case TabIdRecord.sid:
retval = new TabIdRecord(rectype, size, data); retval = new TabIdRecord(rectype, size, data);
break; break;
case FnGroupCountRecord.sid : case FnGroupCountRecord.sid:
retval = new FnGroupCountRecord(rectype, size, data); retval = new FnGroupCountRecord(rectype, size, data);
break; break;
case WindowProtectRecord.sid : case WindowProtectRecord.sid:
retval = new WindowProtectRecord(rectype, size, data); retval = new WindowProtectRecord(rectype, size, data);
break; break;
case ProtectRecord.sid : case ProtectRecord.sid:
retval = new ProtectRecord(rectype, size, data); retval = new ProtectRecord(rectype, size, data);
break; break;
case PasswordRecord.sid : case PasswordRecord.sid:
retval = new PasswordRecord(rectype, size, data); retval = new PasswordRecord(rectype, size, data);
break; break;
case ProtectionRev4Record.sid : case ProtectionRev4Record.sid:
retval = new ProtectionRev4Record(rectype, size, data); retval = new ProtectionRev4Record(rectype, size, data);
break; break;
case PasswordRev4Record.sid : case PasswordRev4Record.sid:
retval = new PasswordRev4Record(rectype, size, data); retval = new PasswordRev4Record(rectype, size, data);
break; break;
case WindowOneRecord.sid : case WindowOneRecord.sid:
retval = new WindowOneRecord(rectype, size, data); retval = new WindowOneRecord(rectype, size, data);
break; break;
case BackupRecord.sid : case BackupRecord.sid:
retval = new BackupRecord(rectype, size, data); retval = new BackupRecord(rectype, size, data);
break; break;
case HideObjRecord.sid : case HideObjRecord.sid:
retval = new HideObjRecord(rectype, size, data); retval = new HideObjRecord(rectype, size, data);
break; break;
case DateWindow1904Record.sid : case DateWindow1904Record.sid:
retval = new DateWindow1904Record(rectype, size, data); retval = new DateWindow1904Record(rectype, size, data);
break; break;
case PrecisionRecord.sid : case PrecisionRecord.sid:
retval = new PrecisionRecord(rectype, size, data); retval = new PrecisionRecord(rectype, size, data);
break; break;
case RefreshAllRecord.sid : case RefreshAllRecord.sid:
retval = new RefreshAllRecord(rectype, size, data); retval = new RefreshAllRecord(rectype, size, data);
break; break;
case BookBoolRecord.sid : case BookBoolRecord.sid:
retval = new BookBoolRecord(rectype, size, data); retval = new BookBoolRecord(rectype, size, data);
break; break;
case FontRecord.sid : case FontRecord.sid:
retval = new FontRecord(rectype, size, data); retval = new FontRecord(rectype, size, data);
break; break;
case FormatRecord.sid : case FormatRecord.sid:
retval = new FormatRecord(rectype, size, data); retval = new FormatRecord(rectype, size, data);
break; break;
case ExtendedFormatRecord.sid : case ExtendedFormatRecord.sid:
retval = new ExtendedFormatRecord(rectype, size, data); retval = new ExtendedFormatRecord(rectype, size, data);
break; break;
case StyleRecord.sid : case StyleRecord.sid:
retval = new StyleRecord(rectype, size, data); retval = new StyleRecord(rectype, size, data);
break; break;
case UseSelFSRecord.sid : case UseSelFSRecord.sid:
retval = new UseSelFSRecord(rectype, size, data); retval = new UseSelFSRecord(rectype, size, data);
break; break;
case BoundSheetRecord.sid : case BoundSheetRecord.sid:
retval = new BoundSheetRecord(rectype, size, data); retval = new BoundSheetRecord(rectype, size, data);
break; break;
case CountryRecord.sid : case CountryRecord.sid:
retval = new CountryRecord(rectype, size, data); retval = new CountryRecord(rectype, size, data);
break; break;
case SSTRecord.sid : case SSTRecord.sid:
retval = new SSTRecord(rectype, size, data); retval = new SSTRecord(rectype, size, data);
break; break;
case ExtSSTRecord.sid : case ExtSSTRecord.sid:
retval = new ExtSSTRecord(rectype, size, data); retval = new ExtSSTRecord(rectype, size, data);
break; break;
case EOFRecord.sid : case EOFRecord.sid:
retval = new EOFRecord(rectype, size, data); retval = new EOFRecord(rectype, size, data);
break; break;
case IndexRecord.sid : case IndexRecord.sid:
retval = new IndexRecord(rectype, size, data); retval = new IndexRecord(rectype, size, data);
break; break;
case CalcModeRecord.sid : case CalcModeRecord.sid:
retval = new CalcModeRecord(rectype, size, data); retval = new CalcModeRecord(rectype, size, data);
break; break;
case CalcCountRecord.sid : case CalcCountRecord.sid:
retval = new CalcCountRecord(rectype, size, data); retval = new CalcCountRecord(rectype, size, data);
break; break;
case RefModeRecord.sid : case RefModeRecord.sid:
retval = new RefModeRecord(rectype, size, data); retval = new RefModeRecord(rectype, size, data);
break; break;
case IterationRecord.sid : case IterationRecord.sid:
retval = new IterationRecord(rectype, size, data); retval = new IterationRecord(rectype, size, data);
break; break;
case DeltaRecord.sid : case DeltaRecord.sid:
retval = new DeltaRecord(rectype, size, data); retval = new DeltaRecord(rectype, size, data);
break; break;
case SaveRecalcRecord.sid : case SaveRecalcRecord.sid:
retval = new SaveRecalcRecord(rectype, size, data); retval = new SaveRecalcRecord(rectype, size, data);
break; break;
case PrintHeadersRecord.sid : case PrintHeadersRecord.sid:
retval = new PrintHeadersRecord(rectype, size, data); retval = new PrintHeadersRecord(rectype, size, data);
break; break;
case PrintGridlinesRecord.sid : case PrintGridlinesRecord.sid:
retval = new PrintGridlinesRecord(rectype, size, data); retval = new PrintGridlinesRecord(rectype, size, data);
break; break;
case GridsetRecord.sid : case GridsetRecord.sid:
retval = new GridsetRecord(rectype, size, data); retval = new GridsetRecord(rectype, size, data);
break; break;
case GutsRecord.sid : case GutsRecord.sid:
retval = new GutsRecord(rectype, size, data); retval = new GutsRecord(rectype, size, data);
break; break;
case DefaultRowHeightRecord.sid : case DefaultRowHeightRecord.sid:
retval = new DefaultRowHeightRecord(rectype, size, data); retval = new DefaultRowHeightRecord(rectype, size, data);
break; break;
case WSBoolRecord.sid : case WSBoolRecord.sid:
retval = new WSBoolRecord(rectype, size, data); retval = new WSBoolRecord(rectype, size, data);
break; break;
case HeaderRecord.sid : case HeaderRecord.sid:
retval = new HeaderRecord(rectype, size, data); retval = new HeaderRecord(rectype, size, data);
break; break;
case FooterRecord.sid : case FooterRecord.sid:
retval = new FooterRecord(rectype, size, data); retval = new FooterRecord(rectype, size, data);
break; break;
case HCenterRecord.sid : case HCenterRecord.sid:
retval = new HCenterRecord(rectype, size, data); retval = new HCenterRecord(rectype, size, data);
break; break;
case VCenterRecord.sid : case VCenterRecord.sid:
retval = new VCenterRecord(rectype, size, data); retval = new VCenterRecord(rectype, size, data);
break; break;
case PrintSetupRecord.sid : case PrintSetupRecord.sid:
retval = new PrintSetupRecord(rectype, size, data); retval = new PrintSetupRecord(rectype, size, data);
break; break;
case DefaultColWidthRecord.sid : case DefaultColWidthRecord.sid:
retval = new DefaultColWidthRecord(rectype, size, data); retval = new DefaultColWidthRecord(rectype, size, data);
break; break;
case DimensionsRecord.sid : case DimensionsRecord.sid:
retval = new DimensionsRecord(rectype, size, data); retval = new DimensionsRecord(rectype, size, data);
break; break;
case RowRecord.sid : case RowRecord.sid:
retval = new RowRecord(rectype, size, data); retval = new RowRecord(rectype, size, data);
break; break;
case LabelSSTRecord.sid : case LabelSSTRecord.sid:
retval = new LabelSSTRecord(rectype, size, data); retval = new LabelSSTRecord(rectype, size, data);
break; break;
case RKRecord.sid : case RKRecord.sid:
retval = new RKRecord(rectype, size, data); retval = new RKRecord(rectype, size, data);
break; break;
case NumberRecord.sid : case NumberRecord.sid:
retval = new NumberRecord(rectype, size, data); retval = new NumberRecord(rectype, size, data);
break; break;
case DBCellRecord.sid : case DBCellRecord.sid:
retval = new DBCellRecord(rectype, size, data); retval = new DBCellRecord(rectype, size, data);
break; break;
case WindowTwoRecord.sid : case WindowTwoRecord.sid:
retval = new WindowTwoRecord(rectype, size, data); retval = new WindowTwoRecord(rectype, size, data);
break; break;
case SelectionRecord.sid : case SelectionRecord.sid:
retval = new SelectionRecord(rectype, size, data); retval = new SelectionRecord(rectype, size, data);
break; break;
case ContinueRecord.sid : case ContinueRecord.sid:
retval = new ContinueRecord(rectype, size, data); retval = new ContinueRecord(rectype, size, data);
break; break;
case LabelRecord.sid : case LabelRecord.sid:
retval = new LabelRecord(rectype, size, data); retval = new LabelRecord(rectype, size, data);
break; break;
case MulRKRecord.sid : case MulRKRecord.sid:
retval = new MulRKRecord(rectype, size, data); retval = new MulRKRecord(rectype, size, data);
break; break;
case MulBlankRecord.sid : case MulBlankRecord.sid:
retval = new MulBlankRecord(rectype, size, data); retval = new MulBlankRecord(rectype, size, data);
break; break;
case BlankRecord.sid : case BlankRecord.sid:
retval = new BlankRecord(rectype, size, data); retval = new BlankRecord(rectype, size, data);
break; break;
case BoolErrRecord.sid : case BoolErrRecord.sid:
retval = new BoolErrRecord(rectype, size, data); retval = new BoolErrRecord(rectype, size, data);
break; break;
case ColumnInfoRecord.sid : case ColumnInfoRecord.sid:
retval = new ColumnInfoRecord(rectype, size, data); retval = new ColumnInfoRecord(rectype, size, data);
break; break;
case MergeCellsRecord.sid : case MergeCellsRecord.sid:
retval = new MergeCellsRecord(rectype, size, data); retval = new MergeCellsRecord(rectype, size, data);
break; break;
case AreaRecord.sid : case AreaRecord.sid:
retval = new AreaRecord(rectype, size, data); retval = new AreaRecord(rectype, size, data);
break; break;
case DataFormatRecord.sid : case DataFormatRecord.sid:
retval = new DataFormatRecord(rectype, size, data); retval = new DataFormatRecord(rectype, size, data);
break; break;
case BarRecord.sid : case BarRecord.sid:
retval = new BarRecord(rectype, size, data); retval = new BarRecord(rectype, size, data);
break; break;
case DatRecord.sid : case DatRecord.sid:
retval = new DatRecord(rectype, size, data); retval = new DatRecord(rectype, size, data);
break; break;
case PlotGrowthRecord.sid : case PlotGrowthRecord.sid:
retval = new PlotGrowthRecord(rectype, size, data); retval = new PlotGrowthRecord(rectype, size, data);
break; break;
case UnitsRecord.sid : case UnitsRecord.sid:
retval = new UnitsRecord(rectype, size, data); retval = new UnitsRecord(rectype, size, data);
break; break;
case FrameRecord.sid : case FrameRecord.sid:
retval = new FrameRecord(rectype, size, data); retval = new FrameRecord(rectype, size, data);
break; break;
case ValueRangeRecord.sid : case ValueRangeRecord.sid:
retval = new ValueRangeRecord(rectype, size, data); retval = new ValueRangeRecord(rectype, size, data);
break; break;
case SeriesListRecord.sid : case SeriesListRecord.sid:
retval = new SeriesListRecord(rectype, size, data); retval = new SeriesListRecord(rectype, size, data);
break; break;
case FontBasisRecord.sid : case FontBasisRecord.sid:
retval = new FontBasisRecord(rectype, size, data); retval = new FontBasisRecord(rectype, size, data);
break; break;
case FontIndexRecord.sid : case FontIndexRecord.sid:
retval = new FontIndexRecord(rectype, size, data); retval = new FontIndexRecord(rectype, size, data);
break; break;
case LineFormatRecord.sid : case LineFormatRecord.sid:
retval = new LineFormatRecord(rectype, size, data); retval = new LineFormatRecord(rectype, size, data);
break; break;
case AreaFormatRecord.sid : case AreaFormatRecord.sid:
retval = new AreaFormatRecord(rectype, size, data); retval = new AreaFormatRecord(rectype, size, data);
break; break;
case LinkedDataRecord.sid : case LinkedDataRecord.sid:
retval = new LinkedDataRecord(rectype, size, data); retval = new LinkedDataRecord(rectype, size, data);
break; break;
@ -643,10 +636,10 @@ public class BiffViewer
} }
if (realretval == null) if (realretval == null)
{ {
realretval = new Record[ 1 ]; realretval = new Record[1];
realretval[ 0 ] = retval; realretval[0] = retval;
System.out.println("recordid = 0x" + Integer.toHexString(rectype) + ", size =" + size); System.out.println("recordid = 0x" + Integer.toHexString(rectype) + ", size =" + size);
System.out.println(realretval[ 0 ].toString()); System.out.println(realretval[0].toString());
} }
return realretval; return realretval;
} }
@ -678,34 +671,32 @@ public class BiffViewer
* *
*/ */
public static void main(String [] args) public static void main(String[] args)
{ {
try try
{ {
BiffViewer viewer = new BiffViewer(args); BiffViewer viewer = new BiffViewer(args);
if ((args.length > 1) && args[ 1 ].equals("on")) if ((args.length > 1) && args[1].equals("on"))
{ {
viewer.setDump(true); viewer.setDump(true);
} }
if ((args.length > 1) && args[ 1 ].equals("bfd")) if ((args.length > 1) && args[1].equals("bfd"))
{ {
POIFSFileSystem fs = POIFSFileSystem fs =
new POIFSFileSystem(new FileInputStream(args[ 0 ])); new POIFSFileSystem(new FileInputStream(args[0]));
InputStream stream = InputStream stream =
fs.createDocumentInputStream("Workbook"); fs.createDocumentInputStream("Workbook");
int size = stream.available(); int size = stream.available();
byte[] data = new byte[ size ]; byte[] data = new byte[size];
stream.read(data); stream.read(data);
HexDump.dump(data, 0, System.out, 0); HexDump.dump(data, 0, System.out, 0);
} } else
else
{ {
viewer.run(); viewer.run();
} }
} } catch (Exception e)
catch (Exception e)
{ {
e.printStackTrace(); e.printStackTrace();
} }