source: installer/c/i2pExe/i2p.c @ f6190dd

Last change on this file since f6190dd was f6190dd, checked in by str4d <str4d@…>, 9 years ago

Get a simple I2P.exe working

  • Property mode set to 100644
File size: 6.1 KB
Line 
1/**
2 * Customized I2P launcher.
3 * Launches the JRE within the process, to allow Task Manager to show
4 * "I2P.exe" as the process, and firewalls to control access of
5 * "I2P.exe".
6 */
7
8#include "errors.h"
9
10#include <windows.h>
11#include <stdio.h>   
12#include <malloc.h>
13#include <sys/stat.h>
14
15//BOOL MoveFontPropertiesFile(const char *path);
16void SetWorkingDirectory(char *path);
17void readOptions(char***, int*);
18//BOOL localJREExists(const char*);
19BOOL exist(const char*);
20
21// defined in java.c
22extern void* MemAlloc(size_t);
23// defined in java.c
24extern int launchJVM(int, char**);
25
26
27int
28main(int argc, char** argv) {
29
30        //int read_options_size;
31        //char** read_options;
32        int ret = 0;
33        //int current_argc = 0;
34        //int new_argc;
35        //char** new_argv;
36        //int i;
37        char currentDirectory[MAX_PATH+1];
38
39        // Set/get the correct working directory.
40        SetWorkingDirectory(currentDirectory);
41
42        // Read in options from disk (launch.properties)
43        // or the default ones (if no launch.properties existed)
44        //readOptions(&read_options, &read_options_size);
45
46        // Construct a new argc & argv to pass to launchJVM
47        //new_argc = read_options_size + argc;
48        //new_argv = (char**)MemAlloc(sizeof(char*) * (new_argc+1));
49
50        // copy process name
51        //new_argv[0] = argv[0];
52        // copy arguments from properties file
53        //for(i = 1; i <= read_options_size; i++)
54        //      new_argv[i] = read_options[i-1];
55        // copy argv arguments as arguments after the properties file
56        // (generally used as arguments for I2P)
57        //for(current_argc = 1; current_argc < argc; current_argc++)
58        //      new_argv[i++] = argv[current_argc];
59
60        //new_argv[i] = NULL;
61
62        // options are no longer necessary -- free them up.
63        //if(read_options != 0)
64        //      free(read_options);
65
66    //ret = launchJVM(new_argc, new_argv);
67        //free(new_argv);
68        ret = launchJVM(argc, argv);
69        switch(ret) {
70        case ERROR_COULDNT_FIND_JVM:
71        case ERROR_COULDNT_INITIALIZE_JVM:
72        case ERROR_COULDNT_LOAD_JVM:
73                if (MessageBox(NULL, "I2P needs the Java Runtime Environment 5.0 or above. Click OK to go to www.java.com, where you can install Java.", 
74                       "I2P Launcher Error",
75                       MB_ICONWARNING | MB_OKCANCEL) == IDOK)
76                        ShellExecute(NULL, NULL, "http://www.java.com/", "", "", SW_SHOWNORMAL);
77                break;
78        case ERROR_COULDNT_PARSE_ARGUMENTS:
79                MessageBox(NULL, "I2P failed to parse the commandline arguments to Java.\n"
80                        "Please download and install I2P again.",
81                        "I2P Launcher Error", MB_OK);
82                break;
83        case ERROR_STARTING_PROGRAM:
84                MessageBox(NULL, "I2P was unable to load.\n"
85                                "Please download and install I2P again.",
86                                "I2P Launcher Error", MB_OK);
87                break;
88        }
89        return ret;
90}
91
92
93
94#define MAX_OPTION_SIZE 100
95#define MAX_OPTIONS 100
96
97/**
98 * Read in the launch.properties file and generate psuedo-commandline arguments.
99 */
100void readOptions(char*** options, int* size) {
101        FILE* file;
102        char* buffer;
103        int i;
104        size_t currentlen;
105        char* command; 
106
107        file = fopen("launch.properties", "r");
108        if(file == NULL) {
109                // default to certain values.
110                *size = 10;
111#ifdef ALPHA
112                *size = (*size) + 1;
113#endif
114               
115                *options = (char**)MemAlloc(sizeof(char*) * (*size));
116                i = 0;
117                (*options)[i++] = "-Xms64m";
118                (*options)[i++] = "-Xmx256m";
119                (*options)[i++] = "-Dasdf=fdsa";
120                (*options)[i++] = "-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog";
121                //(*options)[i++] = "-Djava.net.preferIPv6Addresses=false";
122                (*options)[i++] = "-Djava.net.preferIPv4Stack=true";
123                (*options)[i++] = "-ea:com.limegroup...";
124                (*options)[i++] = "-ea:org.limewire...";
125                (*options)[i++] = "-Djava.library.path=lib";
126                (*options)[i++] = "-jar";
127                (*options)[i++] = "lib\\MuWire.jar";
128#ifdef ALPHA
129#pragma message ("\n\n!!!!!!!!!!!!!! building ALPHA !!!!!!!!!!!!!!\n\n")
130                (*options)[(*size) - 3] = "-agentlib:yjpagent=port=11111";
131                (*options)[(*size) - 2] = "-jar";
132                (*options)[(*size) - 1] = "I2P.jar";
133#endif
134                return;
135        }
136
137        *options = (char**)MemAlloc(sizeof(char*) * MAX_OPTIONS);
138        *size = 0;
139
140        for(i = 0; i < MAX_OPTIONS && !feof(file); i++) {
141                buffer = (char*)MemAlloc(sizeof(char) * MAX_OPTION_SIZE);
142                // get the next option.
143                if(fgets(buffer, MAX_OPTION_SIZE - 1, file) == NULL)
144                        break;
145                // strip off the \n if it exists.
146                currentlen = strlen(buffer);
147                if(currentlen > 0 && buffer[currentlen-1] == '\n') {
148                        buffer[currentlen-1] = 0;
149                        currentlen--;
150                }
151                // downsize the storage for the command.
152                currentlen++; // (include \0)
153                command = (char*)MemAlloc(sizeof(char) * currentlen);
154                strcpy(command, buffer);
155                free(buffer);
156
157                // set the option & increase the size
158                if(currentlen > 0) {
159                        (*options)[i] = command;
160                        (*size)++;
161                }
162        }
163
164        if(file != NULL)
165                fclose(file);
166}
167
168/*
169 * Sets the current working directory to wherever I2P.exe is located
170 */
171static void
172SetWorkingDirectory(char *path) {
173        GetModuleFileName(NULL, path, MAX_PATH + 1);
174        *strrchr(path, '\\') = '\0'; // remove the .exe
175        SetCurrentDirectory(path);
176        GetCurrentDirectory(MAX_PATH + 1, path);
177}
178
179/**
180 * Checks to see if an app-installed JRE exists.
181 */
182/*
183BOOL localJREExists(const char* path) {
184        char localBuf[MAX_PATH + 1];
185        sprintf(localBuf, "%s\\jre\\bin\\hotspot\\jvm.dll\0", path);
186        return exist(localBuf);
187}
188*/
189
190/**
191 * Copies the windows.font.properties file to the jre so that
192 * we use the proper fonts for international installs.
193 */
194/*
195BOOL
196MoveFontPropertiesFile(const char *path) {
197        char curFontFile[MAX_PATH + 1];
198        char newFontFile[MAX_PATH + 1];
199        BOOL copySucceeded;
200        sprintf(curFontFile, "%s\\windows.font.properties\0", path);
201        sprintf(newFontFile, "%s\\jre\\lib\\font.properties\0", path);
202        if(!exist(curFontFile))
203                return TRUE;
204
205        copySucceeded = CopyFile(curFontFile, newFontFile, FALSE);
206        if(copySucceeded)
207                DeleteFile(curFontFile);
208        return copySucceeded;
209}
210*/
211
212BOOL exist(const char *filename) {
213        struct stat s;
214        return stat(filename, &s) == 0 ? TRUE : FALSE;
215}
216
217
218__declspec(dllimport) char **__initenv;
219
220int WINAPI
221WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow)
222{
223    int   ret;
224
225    /* It turns out, that Windows can set thread locale to default user locale
226     * instead of default system locale. We correct this by explicitely setting
227     * thread locale to system default.
228     */
229    SetThreadLocale(GetSystemDefaultLCID());
230
231    __initenv = _environ;
232    ret = main(__argc, __argv);
233
234    return ret; 
235}
Note: See TracBrowser for help on using the repository browser.