blob: c78fb134cc1fcce7dab9fec89665250c80271dca [file] [log] [blame]
package com.pme.exe.res.vi;
import com.pme.exe.Bin;
import com.pme.util.OffsetTrackingInputStream;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* @author yole
*/
public class VersionInfoBin extends Bin.Structure {
private String myExpectedName;
private VersionInfoFactory myChildFactory;
public VersionInfoBin(String name) {
super(name);
Word length = new Word("wLength");
addMember(length);
addSizeHolder(length);
addMember(new Word("wValueLength"));
addMember(new Word("wType"));
addMember(new WChar("szKey"));
addMember(new Padding(4));
}
public VersionInfoBin(String versionInfo, String expectedName) {
this(versionInfo);
myExpectedName = expectedName;
}
public VersionInfoBin(String versionInfo, String expectedName, VersionInfoFactory childFactory) {
this(versionInfo, expectedName);
myChildFactory = childFactory;
}
@Override
public void read(DataInput stream) throws IOException {
OffsetTrackingInputStream inputStream = (OffsetTrackingInputStream) stream;
long startOffset = inputStream.getOffset();
assert startOffset % 4 == 0;
super.read(stream);
if (myExpectedName != null) {
String signature = ((WChar) getMember("szKey")).getValue();
assert signature.equals(myExpectedName): "Expected signature " + myExpectedName + ", found '" + signature + "'";
}
if (myChildFactory != null) {
long length = getValue("wLength");
int i = 0;
while(inputStream.getOffset() < startOffset + length) {
VersionInfoBin child = myChildFactory.createChild(i++);
child.read(inputStream);
addMember(child);
}
}
}
@Override
public void write(DataOutput stream) throws IOException {
long startOffset = -1;
if (stream instanceof RandomAccessFile) {
startOffset = ((RandomAccessFile) stream).getFilePointer();
assert startOffset % 4 == 0;
}
super.write(stream);
if (stream instanceof RandomAccessFile) {
long offset = ((RandomAccessFile) stream).getFilePointer();
long realLength = offset - startOffset;
long expectedLength = getValue("wLength");
assert realLength == expectedLength: "Actual length does not match calculated length for " + getName() +
": expected " + expectedLength + ", actual " + realLength + ", sizeInBytes() " + sizeInBytes();
}
}
}