KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > launch4j > RcBuilder


1 /*
2     Launch4j (http://launch4j.sourceforge.net/)
3     Cross-platform Java application wrapper for creating Windows native executables.
4
5     Copyright (C) 2004, 2006 Grzegorz Kowal
6
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */

21
22 /*
23  * Created on 2005-04-24
24  */

25 package net.sf.launch4j;
26
27 import java.io.BufferedWriter JavaDoc;
28 import java.io.File JavaDoc;
29 import java.io.FileWriter JavaDoc;
30 import java.io.IOException JavaDoc;
31 import java.util.List JavaDoc;
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 /**
41  * @author Copyright (C) 2005 Grzegorz Kowal
42  */

43 public class RcBuilder {
44
45     // winnt.h
46
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     // ICON
52
public static final int APP_ICON = 1;
53
54     // BITMAP
55
public static final int SPLASH_BITMAP = 1;
56
57     // RCDATA
58
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 JavaDoc _sb = new StringBuffer JavaDoc();
87
88     public String JavaDoc getContent() {
89         return _sb.toString();
90     }
91
92     public String JavaDoc getLine(int line) {
93         return _sb.toString().split("\n")[line - 1];
94     }
95
96     public File JavaDoc build(Config c) throws IOException JavaDoc {
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 JavaDoc vars = new StringBuffer JavaDoc();
118             append(vars, c.getVariables(), "\t");
119             addText(ENV_VARIABLES, vars.toString());
120         }
121
122         // MAIN_CLASS / JAR
123
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 JavaDoc f = Util.createTempFile("rc");
133         BufferedWriter JavaDoc w = new BufferedWriter JavaDoc(new FileWriter JavaDoc(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" + // English
155
" {\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 JavaDoc options = new StringBuffer JavaDoc();
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 JavaDoc sb, List JavaDoc list, String JavaDoc 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 JavaDoc 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     /**
238      * Stores path in Windows format with '\' separators.
239      */

240     private void addWindowsPath(int id, String JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc getPath(File JavaDoc f) {
274         return f.getPath().replaceAll("\\\\", "\\\\\\\\");
275     }
276     
277     private void addSpace(StringBuffer JavaDoc sb) {
278         int len = sb.length();
279         if (len-- > 0 && sb.charAt(len) != ' ') {
280             sb.append(' ');
281         }
282     }
283     
284     private void addVerBlockValue(String JavaDoc key, String JavaDoc 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 JavaDoc escape(String JavaDoc text) {
295         return text.replaceAll("\"", "\"\"");
296     }
297 }
298
Popular Tags