1 21 22 25 package net.sf.launch4j; 26 27 import java.io.BufferedWriter ; 28 import java.io.File ; 29 import java.io.FileWriter ; 30 import java.io.IOException ; 31 import java.util.List ; 32 33 import net.sf.launch4j.config.Config; 34 import net.sf.launch4j.config.ConfigPersister; 35 import net.sf.launch4j.config.Jre; 36 import net.sf.launch4j.config.Msg; 37 import net.sf.launch4j.config.Splash; 38 import net.sf.launch4j.config.VersionInfo; 39 40 43 public class RcBuilder { 44 45 public static final int LANG_NEUTRAL = 0; 47 public static final int SUBLANG_NEUTRAL = 0; 48 public static final int SUBLANG_DEFAULT = 1; 49 public static final int SUBLANG_SYS_DEFAULT = 2; 50 51 public static final int APP_ICON = 1; 53 54 public static final int SPLASH_BITMAP = 1; 56 57 public static final int JRE_PATH = 1; 59 public static final int JAVA_MIN_VER = 2; 60 public static final int JAVA_MAX_VER = 3; 61 public static final int SHOW_SPLASH = 4; 62 public static final int SPLASH_WAITS_FOR_WINDOW = 5; 63 public static final int SPLASH_TIMEOUT = 6; 64 public static final int SPLASH_TIMEOUT_ERR = 7; 65 public static final int CHDIR = 8; 66 public static final int SET_PROC_NAME = 9; 67 public static final int ERR_TITLE = 10; 68 public static final int GUI_HEADER_STAYS_ALIVE = 11; 69 public static final int JVM_OPTIONS = 12; 70 public static final int CMD_LINE = 13; 71 public static final int JAR = 14; 72 public static final int MAIN_CLASS = 15; 73 public static final int CLASSPATH = 16; 74 public static final int WRAPPER = 17; 75 public static final int DONT_USE_PRIVATE_JRES = 18; 76 public static final int ENV_VARIABLES = 19; 77 public static final int PRIORITY_CLASS = 20; 78 public static final int DOWNLOAD_URL = 21; 79 public static final int SUPPORT_URL = 22; 80 81 public static final int STARTUP_ERR = 101; 82 public static final int BUNDLED_JRE_ERR = 102; 83 public static final int JRE_VERSION_ERR = 103; 84 public static final int LAUNCHER_ERR = 104; 85 86 private final StringBuffer _sb = new StringBuffer (); 87 88 public String getContent() { 89 return _sb.toString(); 90 } 91 92 public String getLine(int line) { 93 return _sb.toString().split("\n")[line - 1]; 94 } 95 96 public File build(Config c) throws IOException { 97 _sb.append("LANGUAGE "); 98 _sb.append(LANG_NEUTRAL); 99 _sb.append(", "); 100 _sb.append(SUBLANG_DEFAULT); 101 _sb.append('\n'); 102 addVersionInfo(c.getVersionInfo()); 103 addJre(c.getJre()); 104 addIcon(APP_ICON, c.getIcon()); 105 addText(ERR_TITLE, c.getErrTitle()); 106 addText(DOWNLOAD_URL, c.getDownloadUrl()); 107 addText(SUPPORT_URL, c.getSupportUrl()); 108 addText(CMD_LINE, c.getCmdLine()); 109 addWindowsPath(CHDIR, c.getChdir()); 110 addText(PRIORITY_CLASS, String.valueOf(c.getPriorityClass())); 111 addTrue(SET_PROC_NAME, c.isCustomProcName()); 112 addTrue(GUI_HEADER_STAYS_ALIVE, c.isStayAlive()); 113 addSplash(c.getSplash()); 114 addMessages(c.getMessages()); 115 116 if (c.getVariables() != null && !c.getVariables().isEmpty()) { 117 StringBuffer vars = new StringBuffer (); 118 append(vars, c.getVariables(), "\t"); 119 addText(ENV_VARIABLES, vars.toString()); 120 } 121 122 addTrue(WRAPPER, !c.isDontWrapJar()); 124 if (c.getClassPath() != null) { 125 addText(MAIN_CLASS, c.getClassPath().getMainClass()); 126 addWindowsPath(CLASSPATH, c.getClassPath().getPathsString()); 127 } 128 if (c.isDontWrapJar() && c.getJar() != null) { 129 addWindowsPath(JAR, c.getJar().getPath()); 130 } 131 132 File f = Util.createTempFile("rc"); 133 BufferedWriter w = new BufferedWriter (new FileWriter (f)); 134 w.write(_sb.toString()); 135 w.close(); 136 return f; 137 } 138 139 private void addVersionInfo(VersionInfo v) { 140 if (v == null) { 141 return; 142 } 143 _sb.append("1 VERSIONINFO\n"); 144 _sb.append("FILEVERSION "); 145 _sb.append(v.getFileVersion().replaceAll("\\.", ", ")); 146 _sb.append("\nPRODUCTVERSION "); 147 _sb.append(v.getProductVersion().replaceAll("\\.", ", ")); 148 _sb.append("\nFILEFLAGSMASK 0\n" + 149 "FILEOS 0x40000\n" + 150 "FILETYPE 1\n" + 151 "{\n" + 152 " BLOCK \"StringFileInfo\"\n" + 153 " {\n" + 154 " BLOCK \"040904E4\"\n" + " {\n"); 156 addVerBlockValue("CompanyName", v.getCompanyName()); 157 addVerBlockValue("FileDescription", v.getFileDescription()); 158 addVerBlockValue("FileVersion", v.getTxtFileVersion()); 159 addVerBlockValue("InternalName", v.getInternalName()); 160 addVerBlockValue("LegalCopyright", v.getCopyright()); 161 addVerBlockValue("OriginalFilename", v.getOriginalFilename()); 162 addVerBlockValue("ProductName", v.getProductName()); 163 addVerBlockValue("ProductVersion", v.getTxtProductVersion()); 164 _sb.append(" }\n }\nBLOCK \"VarFileInfo\"\n{\nVALUE \"Translation\", 0x0409, 0x04E4\n}\n}"); 165 } 166 167 private void addJre(Jre jre) { 168 addWindowsPath(JRE_PATH, jre.getPath()); 169 addText(JAVA_MIN_VER, jre.getMinVersion()); 170 addText(JAVA_MAX_VER, jre.getMaxVersion()); 171 addTrue(DONT_USE_PRIVATE_JRES, jre.isDontUsePrivateJres()); 172 StringBuffer options = new StringBuffer (); 173 if (jre.getInitialHeapSize() > 0) { 174 options.append("-Xms"); 175 options.append(jre.getInitialHeapSize()); 176 options.append('m'); 177 } 178 if (jre.getMaxHeapSize() > 0) { 179 addSpace(options); 180 options.append("-Xmx"); 181 options.append(jre.getMaxHeapSize()); 182 options.append('m'); 183 } 184 if (jre.getOptions() != null && !jre.getOptions().isEmpty()) { 185 addSpace(options); 186 append(options, jre.getOptions(), " "); 187 } 188 addText(JVM_OPTIONS, options.toString()); 189 } 190 191 private void addSplash(Splash splash) { 192 if (splash == null) { 193 return; 194 } 195 addTrue(SHOW_SPLASH, true); 196 addTrue(SPLASH_WAITS_FOR_WINDOW, splash.getWaitForWindow()); 197 addText(SPLASH_TIMEOUT, String.valueOf(splash.getTimeout())); 198 addTrue(SPLASH_TIMEOUT_ERR, splash.isTimeoutErr()); 199 addBitmap(SPLASH_BITMAP, splash.getFile()); 200 } 201 202 private void addMessages(Msg msg) { 203 if (msg == null) { 204 msg = new Msg(); 205 } 206 addText(STARTUP_ERR, msg.getStartupErr()); 207 addText(BUNDLED_JRE_ERR, msg.getBundledJreErr()); 208 addText(JRE_VERSION_ERR, msg.getJreVersionErr()); 209 addText(LAUNCHER_ERR, msg.getLauncherErr()); 210 } 211 212 private void append(StringBuffer sb, List list, String separator) { 213 for (int i = 0; i < list.size(); i++) { 214 sb.append(list.get(i)); 215 if (i < list.size() - 1) { 216 sb.append(separator); 217 } 218 } 219 } 220 221 private void addText(int id, String text) { 222 if (text == null || text.equals("")) { 223 return; 224 } 225 _sb.append(id); 226 _sb.append(" RCDATA BEGIN \""); 227 _sb.append(escape(text)); 228 _sb.append("\\0\" END\n"); 229 } 230 231 private void addTrue(int id, boolean value) { 232 if (value) { 233 addText(id, "true"); 234 } 235 } 236 237 240 private void addWindowsPath(int id, String path) { 241 if (path == null || path.equals("")) { 242 return; 243 } 244 _sb.append(id); 245 _sb.append(" RCDATA BEGIN \""); 246 _sb.append(path.replaceAll("\\\\", "\\\\\\\\") 247 .replaceAll("/", "\\\\\\\\")); 248 _sb.append("\\0\" END\n"); 249 } 250 251 private void addIcon(int id, File icon) { 252 if (icon == null || icon.getPath().equals("")) { 253 return; 254 } 255 _sb.append(id); 256 _sb.append(" ICON DISCARDABLE \""); 257 _sb.append(getPath(Util.getAbsoluteFile( 258 ConfigPersister.getInstance().getConfigPath(), icon))); 259 _sb.append("\"\n"); 260 } 261 262 private void addBitmap(int id, File bitmap) { 263 if (bitmap == null) { 264 return; 265 } 266 _sb.append(id); 267 _sb.append(" BITMAP \""); 268 _sb.append(getPath(Util.getAbsoluteFile( 269 ConfigPersister.getInstance().getConfigPath(), bitmap))); 270 _sb.append("\"\n"); 271 } 272 273 private String getPath(File f) { 274 return f.getPath().replaceAll("\\\\", "\\\\\\\\"); 275 } 276 277 private void addSpace(StringBuffer sb) { 278 int len = sb.length(); 279 if (len-- > 0 && sb.charAt(len) != ' ') { 280 sb.append(' '); 281 } 282 } 283 284 private void addVerBlockValue(String key, String value) { 285 _sb.append(" VALUE \""); 286 _sb.append(key); 287 _sb.append("\", \""); 288 if (value != null) { 289 _sb.append(escape(value)); 290 } 291 _sb.append("\"\n"); 292 } 293 294 private String escape(String text) { 295 return text.replaceAll("\"", "\"\""); 296 } 297 } 298 | Popular Tags |