/*
Launch4j (http://launch4j.sourceforge.net/)
Cross-platform Java application wrapper for creating Windows native executables.
Copyright (C) 2004, 2006 Grzegorz Kowal
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* Created on 2005-04-24
*/
package net.sf.launch4j;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import net.sf.launch4j.config.Config;
import net.sf.launch4j.config.ConfigPersister;
import net.sf.launch4j.config.Jre;
import net.sf.launch4j.config.Splash;
import net.sf.launch4j.config.VersionInfo;
/**
* @author Copyright (C) 2005 Grzegorz Kowal
*/
public class RcBuilder {
// winnt.h
public static final int LANG_NEUTRAL = 0;
public static final int SUBLANG_NEUTRAL = 0;
public static final int SUBLANG_DEFAULT = 1;
public static final int SUBLANG_SYS_DEFAULT = 2;
// ICON
public static final int APP_ICON = 1;
// BITMAP
public static final int SPLASH_BITMAP = 1;
// RCDATA
public static final int JRE_PATH = 1;
public static final int JAVA_MIN_VER = 2;
public static final int JAVA_MAX_VER = 3;
public static final int SHOW_SPLASH = 4;
public static final int SPLASH_WAITS_FOR_WINDOW = 5;
public static final int SPLASH_TIMEOUT = 6;
public static final int SPLASH_TIMEOUT_ERR = 7;
public static final int CHDIR = 8;
public static final int SET_PROC_NAME = 9;
public static final int ERR_TITLE = 10;
public static final int GUI_HEADER_STAYS_ALIVE = 11;
public static final int JVM_ARGS = 12;
public static final int JAR_ARGS = 13;
public static final int JAR = 14;
private final StringBuffer _sb = new StringBuffer();
public String getContent() {
return _sb.toString();
}
public File build(Config c) throws IOException {
_sb.append("LANGUAGE ");
_sb.append(LANG_NEUTRAL);
_sb.append(", ");
_sb.append(SUBLANG_DEFAULT);
_sb.append('\n');
addVersionInfo(c.getVersionInfo());
addJre(c.getJre());
addIcon(APP_ICON, c.getIcon());
addText(ERR_TITLE, c.getErrTitle());
addText(JAR_ARGS, c.getJarArgs());
addWindowsPath(CHDIR, c.getChdir());
addTrue(SET_PROC_NAME, c.isCustomProcName());
addTrue(GUI_HEADER_STAYS_ALIVE, c.isStayAlive());
addSplash(c.getSplash());
if (c.isDontWrapJar()) {
addWindowsPath(JAR, c.getJar().getPath());
}
File f = Util.createTempFile("rc");
BufferedWriter w = new BufferedWriter(new FileWriter(f));
w.write(_sb.toString());
w.close();
return f;
}
private void addVersionInfo(VersionInfo v) {
if (v == null) {
return;
}
_sb.append("1 VERSIONINFO\n");
_sb.append("FILEVERSION ");
_sb.append(v.getFileVersion().replaceAll("\\.", ", "));
_sb.append("\nPRODUCTVERSION ");
_sb.append(v.getProductVersion().replaceAll("\\.", ", "));
_sb.append("\nFILEFLAGSMASK 0\n" +
"FILEOS 0x40000\n" +
"FILETYPE 1\n" +
"{\n" +
" BLOCK \"StringFileInfo\"\n" +
" {\n" +
" BLOCK \"040904E4\"\n" + // English
" {\n");
addVerBlockValue("CompanyName", v.getCompanyName());
addVerBlockValue("FileDescription", v.getFileDescription());
addVerBlockValue("FileVersion", v.getTxtFileVersion());
addVerBlockValue("InternalName", v.getInternalName());
addVerBlockValue("LegalCopyright", v.getCopyright());
addVerBlockValue("OriginalFilename", v.getOriginalFilename());
addVerBlockValue("ProductName", v.getProductName());
addVerBlockValue("ProductVersion", v.getTxtProductVersion());
_sb.append(" }\n }\n}\n");
}
private void addJre(Jre jre) {
addWindowsPath(JRE_PATH, jre.getPath());
addText(JAVA_MIN_VER, jre.getMinVersion());
addText(JAVA_MAX_VER, jre.getMaxVersion());
StringBuffer jvmArgs = new StringBuffer();
if (jre.getInitialHeapSize() > 0) {
jvmArgs.append("-Xms");
jvmArgs.append(jre.getInitialHeapSize());
jvmArgs.append('m');
}
if (jre.getMaxHeapSize() > 0) {
addSpace(jvmArgs);
jvmArgs.append("-Xmx");
jvmArgs.append(jre.getMaxHeapSize());
jvmArgs.append('m');
}
if (jre.getArgs() != null && jre.getArgs().length() > 0) {
addSpace(jvmArgs);
jvmArgs.append(jre.getArgs().replaceAll("\n", " "));
}
addText(JVM_ARGS, jvmArgs.toString());
}
private void addSplash(Splash splash) {
if (splash == null) {
return;
}
addTrue(SHOW_SPLASH, true);
addTrue(SPLASH_WAITS_FOR_WINDOW, splash.getWaitForWindow());
addText(SPLASH_TIMEOUT, String.valueOf(splash.getTimeout()));
addTrue(SPLASH_TIMEOUT_ERR, splash.isTimeoutErr());
addBitmap(SPLASH_BITMAP, splash.getFile());
}
private void addText(int id, String text) {
if (text == null || text.length() == 0) {
return;
}
_sb.append(id);
_sb.append(" RCDATA BEGIN \"");
_sb.append(text.replaceAll("\"", "\"\""));
_sb.append("\\0\" END\n");
}
/**
* Stores path in Windows format with '\' separators.
*/
private void addWindowsPath(int id, String path) {
if (path == null || path.equals("")) {
return;
}
_sb.append(id);
_sb.append(" RCDATA BEGIN \"");
_sb.append(path.replaceAll("\\\\", "\\\\\\\\")
.replaceAll("/", "\\\\\\\\"));
_sb.append("\\0\" END\n");
}
private void addTrue(int id, boolean value) {
if (value) {
addText(id, "true");
}
}
private void addIcon(int id, File icon) {
if (icon == null || icon.getPath().equals("")) {
return;
}
_sb.append(id);
_sb.append(" ICON DISCARDABLE \"");
_sb.append(getPath(Util.getAbsoluteFile(
ConfigPersister.getInstance().getConfigPath(), icon)));
_sb.append("\"\n");
}
private void addBitmap(int id, File bitmap) {
if (bitmap == null) {
return;
}
_sb.append(id);
_sb.append(" BITMAP \"");
_sb.append(getPath(Util.getAbsoluteFile(
ConfigPersister.getInstance().getConfigPath(), bitmap)));
_sb.append("\"\n");
}
private String getPath(File f) {
return f.getPath().replaceAll("\\\\", "\\\\\\\\");
}
private void addSpace(StringBuffer sb) {
int len = sb.length();
if (len-- > 0 && sb.charAt(len) != ' ') {
sb.append(' ');
}
}
private void addVerBlockValue(String key, String value) {
_sb.append(" VALUE \"");
_sb.append(key);
_sb.append("\", \"");
if (value != null) {
_sb.append(value);
}
_sb.append("\"\n");
}
}