version info reader implemented
[idea/community.git] / tools / launcher-generator / src / com / pme / launcher / LauncherGenerator.java
1 /*
2  * Copyright 2006 ProductiveMe Inc.
3  * Copyright 2013 JetBrains s.r.o.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 package com.pme.launcher;
19
20 import com.pme.exe.ExeReader;
21 import com.pme.exe.SectionReader;
22 import com.pme.exe.Bin;
23 import com.pme.exe.res.ResourceSectionReader;
24 import com.pme.exe.res.DirectoryEntry;
25 import com.pme.exe.res.RawResource;
26 import com.pme.exe.res.StringTable;
27 import com.pme.exe.res.bmp.PictureResourceInjector;
28 import com.pme.exe.res.icon.IconResourceInjector;
29 import com.pme.exe.res.vi.VersionInfo;
30 import com.pme.util.OffsetTrackingInputStream;
31
32 import java.io.*;
33
34 /**
35  * Date: May 6, 2006
36  * Time: 10:43:01 AM
37  */
38 public class LauncherGenerator {
39   private File myTemplate;
40   private File myIcon;
41   private File myBmp;
42   private File myExePath;
43   private int mySplashTimeout = 3;
44   private String myJreBundlePath;
45   private String myVmParameters;
46   private String myStartJar;
47   private String myWorkDir;
48   private String myJavaVersion;
49   private boolean mySearchJdkOnly = false;
50
51   public LauncherGenerator(File template, File exePath) {
52     myTemplate = template;
53     myExePath = exePath;
54   }
55
56   public void setWorkDir(String workDir) {
57     myWorkDir = workDir;
58   }
59
60   public void setSplashTimeout(int splashTimeout) {
61     mySplashTimeout = splashTimeout;
62   }
63
64   public void setJreBundlePath(String jreBundlePath) {
65     myJreBundlePath = jreBundlePath;
66   }
67
68   public void setVmParameters(String vmParameters) {
69     myVmParameters = vmParameters;
70   }
71
72   public void setStartJar(String startJar) {
73     myStartJar = startJar;
74   }
75
76   public void setIcon(File icon) {
77     myIcon = icon;
78   }
79
80   public void setBmp(File bmp) {
81     myBmp = bmp;
82   }
83
84   public void generate() throws IOException {
85     ExeReader reader = new ExeReader(myTemplate.getName());
86     RandomAccessFile stream = new RandomAccessFile(myTemplate, "r");
87     reader.read(stream);
88     stream.close();
89     SectionReader sectionReader = reader.getSectionReader(".rsrc");
90     ResourceSectionReader resourceReader = (ResourceSectionReader) sectionReader.getMember(".rsrc");
91     DirectoryEntry root = resourceReader.getRoot();
92     DirectoryEntry subDir = root.findSubDir("IRD6");
93     DirectoryEntry ird7 = subDir.findSubDir("IRD7");
94
95     RawResource rawResource = ird7.getRawResource(0);
96     Bin.Bytes bytes = rawResource.getBytes();
97     StringTable srtingTable = new StringTable(bytes.getBytes());
98
99     if (myBmp != null) {
100       srtingTable.setString(0, "splash"); // show splash
101     }
102     srtingTable.setString(1, "alive"); // stay alive
103     srtingTable.setString(2, "" + mySplashTimeout); // splash timeout
104     if (myJreBundlePath != null) {
105       srtingTable.setString(3, myJreBundlePath); // jre bundled path
106     }
107     if (myVmParameters != null) {
108       srtingTable.setString(4, myVmParameters); // PROP_VM_PARAMETERS
109     }
110     if (myStartJar != null) {
111       srtingTable.setString(5, myStartJar); // PROP_START_JAR
112     }
113     srtingTable.setString(6, "waitForWindow"); // PROP_WAIT_FOR_WINDOW
114
115     if (myWorkDir != null) {
116       srtingTable.setString(7, myWorkDir); // PROP_WORK_DIR
117     }
118
119     if (myJavaVersion != null) {
120       StringBuffer buffer = new StringBuffer( myJavaVersion.length() );
121       for( int i = 0; i < myJavaVersion.length(); ++i){
122         char ch = myJavaVersion.charAt( i );
123         if ( Character.isDigit( ch ) || ch == '.' ){
124           buffer.append( ch );
125         }
126       }
127       srtingTable.setString(8, buffer.toString()); // PROP_JAVA_VERSION
128     }
129     if (mySearchJdkOnly) {
130       srtingTable.setString(9, "SearchJdkOnly"); // PROP_SEARCH_JDK_ONLY
131     }
132
133     byte[] a = srtingTable.getBytes();
134     rawResource.setBytes(a);
135
136     if (myIcon != null) {
137       IconResourceInjector iconInjector = new IconResourceInjector();
138       iconInjector.injectIcon(myIcon, root, "IRD101");
139     }
140
141     if (myBmp != null) {
142       PictureResourceInjector bmpInjector = new PictureResourceInjector();
143       bmpInjector.inject(myBmp, root, "IRD104");
144     }
145
146
147
148     DirectoryEntry viDir = root.findSubDir("IRD16").findSubDir( "IRD1" );
149     Bin.Bytes viBytes = viDir.getRawResource( 0 ).getBytes();
150     ByteArrayInputStream bytesStream = new ByteArrayInputStream(viBytes.getBytes());
151
152     VersionInfo viReader = new VersionInfo();
153     viReader.read(new OffsetTrackingInputStream(new DataInputStream(bytesStream)));
154
155     reader.resetOffsets(0);
156
157     myExePath.getParentFile().mkdirs();
158     myExePath.createNewFile();
159     RandomAccessFile exeStream = new RandomAccessFile(myExePath, "rw");
160     reader.write(exeStream);
161     exeStream.close();
162   }
163
164   public void setJavaVersion(String javaVersion) {
165     myJavaVersion = javaVersion;
166   }
167
168   public void setSearchJdkOnly(boolean searchJdkOnly) {
169     mySearchJdkOnly = searchJdkOnly;
170   }
171 }