diff --git a/tools/launcher-generator/src/com/pme/exe/Bin.java b/tools/launcher-generator/src/com/pme/exe/Bin.java index 855e51f2372b..ad11eb92c876 100644 --- a/tools/launcher-generator/src/com/pme/exe/Bin.java +++ b/tools/launcher-generator/src/com/pme/exe/Bin.java @@ -367,21 +367,26 @@ public abstract class Bin { @Override public long sizeInBytes() { - throw new UnsupportedOperationException(); + return bytesToSkip(getOffset()); } @Override public void read(DataInput stream) throws IOException { if (stream instanceof OffsetTrackingInputStream) { long offset = ((OffsetTrackingInputStream) stream).getOffset(); - int offsetMask = myBytes-1; - long offsetBits = offset & offsetMask; - if (offsetBits > 0) { - stream.skipBytes((int) (myBytes - offsetBits)); + int skip = bytesToSkip(offset); + if (skip > 0) { + stream.skipBytes(skip); } } } + private int bytesToSkip(long offset) { + int offsetMask = myBytes-1; + long offsetBits = offset & offsetMask; + return offsetBits == 0 ? 0 : (int) (myBytes - offsetBits); + } + @Override public void write(DataOutput stream) throws IOException { } @@ -468,7 +473,7 @@ public abstract class Bin { @Override public long sizeInBytes() { - throw new UnsupportedOperationException(); + return myValue.length() * 2 + 2; } @Override @@ -484,7 +489,10 @@ public abstract class Bin { @Override public void write(DataOutput stream) throws IOException { - throw new UnsupportedOperationException(); + for (int i = 0; i < myValue.length(); i++) { + stream.writeShort(BitsUtil.revertBytesOfShort((short) myValue.charAt(i))); + } + stream.writeShort(0); } @Override @@ -580,23 +588,6 @@ public abstract class Bin { writer.write(myBuffer.toString()); } } - - public String getAsWChar() { - StringBuilder result = new StringBuilder(myBytes.length/2); - ByteArrayInputStream bis = new ByteArrayInputStream(myBytes); - DataInputStream dis = new DataInputStream(bis); - try { - for (int i = 0; i < myBytes.length / 2 - 1; i++) { - result.append(BitsUtil.readChar(dis)); - } - char terminator = BitsUtil.readChar(dis); - assert terminator == '\0'; - } catch (IOException e) { - throw new RuntimeException(e); - } - - return result.toString(); - } } public static class ArrayOfBins extends Bin { diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/StringFileInfo.java b/tools/launcher-generator/src/com/pme/exe/res/vi/StringFileInfo.java index 1b37330f72da..e7ed49184692 100644 --- a/tools/launcher-generator/src/com/pme/exe/res/vi/StringFileInfo.java +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/StringFileInfo.java @@ -17,34 +17,13 @@ package com.pme.exe.res.vi; -import com.pme.exe.Bin; -import com.pme.util.OffsetTrackingInputStream; - -import java.io.DataInput; -import java.io.IOException; - -public class StringFileInfo extends Bin.Structure { +public class StringFileInfo extends VersionInfoBin { public StringFileInfo() { - super("StringFileInfo"); - addMember(new Word("wLength")); - addMember(new Word("wValueLength")); - addMember(new Word("wType")); - addMember(new Bytes("szKey", 30)); - addMember(new Padding(4)); - } - - @Override - public void read(DataInput stream) throws IOException { - OffsetTrackingInputStream inputStream = (OffsetTrackingInputStream) stream; - long startOffset = inputStream.getOffset(); - super.read(stream); - assert ((Bytes) getMember("szKey")).getAsWChar().equals("StringFileInfo"); - long length = getValue("wLength"); - int i = 0; - while(inputStream.getOffset() < startOffset + length) { - StringTable stringTableReader = new StringTable("StringTable" + (i++)); - stringTableReader.read(inputStream); - addMember(stringTableReader); - } + super("StringFileInfo", "StringFileInfo", new VersionInfoFactory() { + @Override + public VersionInfoBin createChild(int index) { + return new StringTable("StringTable" + index); + } + }); } } diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/StringTable.java b/tools/launcher-generator/src/com/pme/exe/res/vi/StringTable.java index 956cc6f475d7..c31657c6f348 100644 --- a/tools/launcher-generator/src/com/pme/exe/res/vi/StringTable.java +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/StringTable.java @@ -17,33 +17,14 @@ package com.pme.exe.res.vi; -import com.pme.exe.Bin; -import com.pme.util.OffsetTrackingInputStream; - -import java.io.DataInput; -import java.io.IOException; - -public class StringTable extends Bin.Structure { +public class StringTable extends VersionInfoBin { public StringTable(String name) { - super(name); - addMember(new Word("wLength")); - addMember(new Word("wValueLength")); - addMember(new Word("wType")); - addMember(new WChar("szKey")); - addMember(new Padding(4)); - } - - public void read(DataInput stream) throws IOException { - OffsetTrackingInputStream inputStream = (OffsetTrackingInputStream) stream; - long startOffset = inputStream.getOffset(); - super.read(stream); - long length = getValue("wLength"); - int i = 0; - while(inputStream.getOffset() < startOffset + length) { - StringTableEntry stringTableEntry = new StringTableEntry(); - stringTableEntry.read(inputStream); - addMember(stringTableEntry); - } + super(name, null, new VersionInfoFactory() { + @Override + public VersionInfoBin createChild(int index) { + return new StringTableEntry(); + } + }); } } diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/StringTableEntry.java b/tools/launcher-generator/src/com/pme/exe/res/vi/StringTableEntry.java index 8a3193a2ac73..78914cb41b14 100644 --- a/tools/launcher-generator/src/com/pme/exe/res/vi/StringTableEntry.java +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/StringTableEntry.java @@ -17,20 +17,12 @@ package com.pme.exe.res.vi; -import com.pme.exe.Bin; -import com.pme.util.OffsetTrackingInputStream; +import java.io.DataInput; +import java.io.IOException; -import java.io.*; -import java.util.ArrayList; - -public class StringTableEntry extends Bin.Structure { +public class StringTableEntry extends VersionInfoBin { public StringTableEntry() { super(""); - addMember(new Word("wLength")); - addMember(new Word("wValueLength")); - addMember(new Word("wType")); - addMember(new WChar("szKey")); - addMember(new Padding(4)); addMember(new WChar("Value")); addMember(new Padding(4)); } diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/Var.java b/tools/launcher-generator/src/com/pme/exe/res/vi/Var.java index 7b1a910bc6f5..9c7d8889e4fa 100644 --- a/tools/launcher-generator/src/com/pme/exe/res/vi/Var.java +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/Var.java @@ -1,32 +1,11 @@ package com.pme.exe.res.vi; -import com.pme.exe.Bin; -import com.pme.util.OffsetTrackingInputStream; - -import java.io.DataInput; -import java.io.IOException; - /** * @author yole */ -public class Var extends Bin.Structure { +public class Var extends VersionInfoBin { public Var(String name) { - super(name); - addMember(new Word("wLength")); - addMember(new Word("wValueLength")); - addMember(new Word("wType")); - addMember(new Bytes("szKey", 24)); - addMember(new Padding(4)); + super(name, "Translation"); addMember(new DWord("Translation")); } - - @Override - public void read(DataInput stream) throws IOException { - OffsetTrackingInputStream inputStream = (OffsetTrackingInputStream) stream; - long startOffset = inputStream.getOffset(); - assert startOffset % 4 == 0; - super.read(stream); - String varKey = ((Bytes) getMember("szKey")).getAsWChar(); - assert varKey.equals("Translation"): "Expected key name Translation, found " + varKey; - } } diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/VarFileInfo.java b/tools/launcher-generator/src/com/pme/exe/res/vi/VarFileInfo.java index 97f5ca8d2c8f..f9f8cc584c44 100644 --- a/tools/launcher-generator/src/com/pme/exe/res/vi/VarFileInfo.java +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/VarFileInfo.java @@ -1,36 +1,15 @@ package com.pme.exe.res.vi; -import com.pme.exe.Bin; -import com.pme.util.OffsetTrackingInputStream; - -import java.io.DataInput; -import java.io.IOException; - /** * @author yole */ -public class VarFileInfo extends Bin.Structure { +public class VarFileInfo extends VersionInfoBin { public VarFileInfo() { - super("VarFileInfo"); - addMember(new Word("wLength")); - addMember(new Word("wValueLength")); - addMember(new Word("wType")); - addMember(new Bytes("szKey", 24)); - addMember(new Padding(4)); - } - - @Override - public void read(DataInput stream) throws IOException { - OffsetTrackingInputStream inputStream = (OffsetTrackingInputStream) stream; - long startOffset = inputStream.getOffset(); - super.read(stream); - assert ((Bytes) getMember("szKey")).getAsWChar().equals("VarFileInfo"); - long length = getValue("wLength"); - int i = 0; - while(inputStream.getOffset() < startOffset + length) { - Var varReader = new Var("Var" + (i++)); - varReader.read(inputStream); - addMember(varReader); - } + super("VarFileInfo", "VarFileInfo", new VersionInfoFactory() { + @Override + public VersionInfoBin createChild(int index) { + return new Var("Var" + index); + } + }); } } diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfo.java b/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfo.java index b57c1f7dbe4f..8924578e8532 100644 --- a/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfo.java +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfo.java @@ -17,20 +17,14 @@ package com.pme.exe.res.vi; -import com.pme.exe.Bin; import com.pme.util.OffsetTrackingInputStream; import java.io.DataInput; import java.io.IOException; -public class VersionInfo extends Bin.Structure { +public class VersionInfo extends VersionInfoBin { public VersionInfo() { - super("VersionInfo"); - addMember(new Word("wLength")); - addMember(new Word("wValueLength")); - addMember(new Word("wType")); - addMember(new Bytes("szKey", 32)); - addMember(new Padding(4)); + super("VersionInfo", "VS_VERSION_INFO"); addMember(new FixedFileInfo()); addMember(new Padding(4)); addMember(new StringFileInfo()); @@ -44,8 +38,6 @@ public class VersionInfo extends Bin.Structure { startOffset = ((OffsetTrackingInputStream) stream).getOffset(); } super.read(stream); - String signature = ((Bytes) getMember("szKey")).getAsWChar(); - assert signature.equals("VS_VERSION_INFO"): "Expected signature VS_VERSION_INFO, found '" + signature + "'"; if (stream instanceof OffsetTrackingInputStream) { long offset = ((OffsetTrackingInputStream) stream).getOffset(); long length = getValue("wLength"); diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfoBin.java b/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfoBin.java new file mode 100644 index 000000000000..6c2d491a7a8d --- /dev/null +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfoBin.java @@ -0,0 +1,57 @@ +package com.pme.exe.res.vi; + +import com.pme.exe.Bin; +import com.pme.util.OffsetTrackingInputStream; + +import java.io.DataInput; +import java.io.IOException; + +/** + * @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); + } + } + } +} diff --git a/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfoFactory.java b/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfoFactory.java new file mode 100644 index 000000000000..6253b2760c33 --- /dev/null +++ b/tools/launcher-generator/src/com/pme/exe/res/vi/VersionInfoFactory.java @@ -0,0 +1,8 @@ +package com.pme.exe.res.vi; + +/** + * @author yole + */ +public interface VersionInfoFactory { + VersionInfoBin createChild(int index); +} diff --git a/tools/launcher-generator/src/com/pme/launcher/LauncherGenerator.java b/tools/launcher-generator/src/com/pme/launcher/LauncherGenerator.java index 0b76f89f927f..185abd6b1e02 100644 --- a/tools/launcher-generator/src/com/pme/launcher/LauncherGenerator.java +++ b/tools/launcher-generator/src/com/pme/launcher/LauncherGenerator.java @@ -79,6 +79,10 @@ public class LauncherGenerator { RandomAccessFile exeStream = new RandomAccessFile(myExePath, "rw"); myReader.write(exeStream); exeStream.close(); + + RandomAccessFile versionInfoStream = new RandomAccessFile(myExePath + ".version", "rw"); + myVersionInfo.resetOffsets(0); + myVersionInfo.write(versionInfoStream); } public void setResourceString(int id, String value) {