package org.openedit.entermedia.xmp;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;
public class IndesignFile
{
protected byte[] validGUID = new byte[] {
0x06, 0x06, (byte)0xed, (byte)0xf5,
(byte)0xd8, 0x1d, 0x46, (byte)0xe5,
(byte)0xbd, 0x31, (byte)0xef, (byte)0xe7,
(byte)0xfe, 0x74, (byte)0xb7, 0x1d
};
protected MasterPage[] fieldMasterPages;
protected boolean fieldValid = false;
public IndesignFile(File inFile)
{
fieldMasterPages = new MasterPage[2];
try
{
DataInputStream in = new DataInputStream(new FileInputStream(inFile));
fieldMasterPages[0] = readMasterPage(in);
fieldMasterPages[1] = readMasterPage(in);
in.close();
setValid(Arrays.equals(fieldMasterPages[0].getGUID(), validGUID));
}
catch(Exception e)
{
setValid(false);
}
}
protected MasterPage readMasterPage(DataInputStream inIn) throws Exception
{
MasterPage mp = new MasterPage();
byte[] buf;
buf = new byte[16];
inIn.read(buf, 0, buf.length);
mp.setGUID(buf);
buf = new byte[8];
inIn.read(buf, 0, buf.length);
mp.setMagicBytes(new String(buf));
mp.setObjectStreamEndian(inIn.read());
inIn.skip(239);
mp.setSequenceNumber(inIn.readLong());
inIn.skip(8);
mp.setFilePages(inIn.readInt());
inIn.skip(3812);
return mp;
}
public boolean isValid()
{
return fieldValid;
}
protected void setValid(boolean valid)
{
fieldValid = valid;
}
protected static int byteArrayToInt(byte[] b) {
int value = 0;
for (int i = 0; i < 4; i++) {
int shift = (4 - 1 - i) * 8;
value += (b[i] & 0x000000FF) << shift;
}
return value;
}
public MasterPage getActualMasterPage()
{
if (!isValid())
{
return null;
}
if (fieldMasterPages[0].getSequenceNumber() > fieldMasterPages[1].getSequenceNumber())
{
return fieldMasterPages[0];
}
return fieldMasterPages[1];
}
}
class MasterPage
{
protected byte[] fieldGUID;
protected String fieldMagicBytes;
protected int fieldObjectStreamEndian;
protected long fieldSequenceNumber;
protected int fieldFilePages;
public byte[] getGUID()
{
return fieldGUID;
}
public void setGUID(byte[] guid)
{
fieldGUID = guid;
}
public String getMagicBytes()
{
return fieldMagicBytes;
}
public void setMagicBytes(String magicBytes)
{
fieldMagicBytes = magicBytes;
}
public int getObjectStreamEndian()
{
return fieldObjectStreamEndian;
}
public void setObjectStreamEndian(int objectStreamEndian)
{
fieldObjectStreamEndian = objectStreamEndian;
}
public long getSequenceNumber()
{
return fieldSequenceNumber;
}
public void setSequenceNumber(long sequenceNumber)
{
fieldSequenceNumber = sequenceNumber;
}
public int getFilePages()
{
return fieldFilePages;
}
public void setFilePages(int filePages)
{
fieldFilePages = filePages;
}
}