]> git.saurik.com Git - wxWidgets.git/blame_incremental - utils/Install/wxmain.cpp
implemented wxSingleInstanceChecker for Unix
[wxWidgets.git] / utils / Install / wxmain.cpp
... / ...
CommitLineData
1#include "wx/wxprec.h"
2
3#ifdef __BORLANDC__
4#pragma hdrstop
5#endif
6
7#ifndef WX_PRECOMP
8#include "wx/wx.h"
9#endif
10
11#include "wx/resource.h"
12#include "install.h"
13#include "instsup.h"
14
15#include <ctype.h>
16
17#if !defined(__EMX__) && !defined(__OS2__) && !defined(WIN32) && !defined(WINNT)
18#define stricmp strcasecmp
19#endif
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25extern char installdir[];
26
27#ifdef __cplusplus
28}
29#endif
30
31typedef struct _wxCommands {
32 int id;
33 char file[50];
34} wxCommands;
35
36#define COMMANDMAX 20
37
38wxCommands wxcommands[COMMANDMAX];
39char finishedscript[256] = "";
40char percentname[256] = "";
41
42class MyApp: public wxApp
43{
44public:
45 MyApp();
46
47 virtual bool OnInit();
48
49 virtual ~MyApp();
50};
51
52class MyDialog : public wxDialog
53{
54public:
55 void handle_button(wxCommandEvent& event);
56};
57
58class MyThread : public wxThread
59{
60public:
61 virtual void *Entry();
62};
63
64void *MyThread::Entry()
65{
66 install_thread(NULL);
67 return NULL;
68}
69
70MyDialog *dialog = NULL;
71
72IMPLEMENT_APP(MyApp)
73
74MyApp::MyApp()
75{
76}
77
78wxCondition *InstCond = NULL;
79
80void updatepercent(void)
81{
82 wxGauge *tmp = (wxGauge *)wxFindWindowByName(percentname, dialog);
83
84 if(tmp)
85 {
86 unsigned long sliderpos;
87 int pixels = 100;
88 extern int current_file, files;
89
90 sliderpos = (unsigned long)(((float)(current_file)/(float)files)*pixels);
91 tmp->SetValue(sliderpos);
92 }
93}
94
95int parse_ini(char *filename)
96{
97 FILE *f;
98 int b;
99
100 for(b=0;b<COMMANDMAX;b++)
101 {
102 wxcommands[b].id = 0;
103 wxcommands[b].file[0] = 0;
104 }
105
106 grabfile(filename);
107 if((f=fopen(filename, "r")) != NULL)
108 {
109 int bytesread = 1;
110 char raw[256], entry[256], entrydata[256], entrydata2[256];
111
112 /* figure out why we are not getting an EOF on windows...
113 bytesread is a hack to make sure it doesn't loop forever. */
114 while(!feof(f) && bytesread)
115 {
116 bytesread = getparseline(f, '#', ',', '\"', raw, entry, entrydata, entrydata2);
117 if(stricmp(entry, "loadwxr") == 0)
118 {
119 grabfile(entrydata);
120 if(!wxResourceParseFile(entrydata))
121 {
122 error("Error loading resources!");
123 remove(entrydata);
124 remove(filename);
125 return FALSE;
126 }
127 remove(entrydata);
128
129 dialog = new MyDialog;
130
131 dialog->LoadFromResource(NULL, "dialog1");
132 dialog->Show(TRUE);
133
134 /*MyApp::SetTopWindow(dialog);*/
135 }
136 else if(stricmp(entry, "closeold") == 0)
137 {
138 if(dialog)
139 dialog->Destroy();
140 dialog = NULL;
141 }
142 else if(stricmp(entry, "getcheck") == 0)
143 {
144 wxCheckBox *tmp = (wxCheckBox *)wxFindWindowByName(entrydata, dialog);
145
146 if(tmp)
147 {
148 if(!tmp->GetValue())
149 {
150 parse_ini(entrydata2);
151 bytesread = 0;
152 }
153 }
154 }
155 else if(stricmp(entry, "gettext") == 0)
156 {
157 wxTextCtrl *tmp = (wxTextCtrl *)wxFindWindowByName(entrydata, dialog);
158 wxString bleah;
159
160 if(tmp)
161 {
162 if((bleah = tmp->GetValue()))
163 strcpy(installdir, bleah);
164 }
165 }
166 else if(stricmp(entry, "settext") == 0)
167 {
168 wxTextCtrl *tmp = (wxTextCtrl *)wxFindWindowByName(entrydata, dialog);
169
170 if(tmp)
171 tmp->SetValue(installdir);
172 }
173 else if(stricmp(entry, "message") == 0)
174 mesg(entrydata);
175 else if(stricmp(entry, "disable") == 0)
176 {
177 wxButton *tmp = (wxButton *)wxFindWindowByName(entrydata, dialog);
178 if(tmp)
179 tmp->Disable();
180 }
181 else if(stricmp(entry, "grabfile") == 0)
182 grabfile(entrydata);
183 else if(stricmp(entry, "remove") == 0)
184 remove(entrydata);
185 else if(stricmp(entry, "system") == 0)
186 wxExecute(entrydata);
187 else if(stricmp(entry, "startinst") == 0)
188 {
189 strcpy(percentname, entrydata);
190 strcpy(finishedscript, entrydata2);
191
192 /* I couldn't get it working with threads, even when
193 using conditions it blocked the message loop making
194 it unreadable, so I am going with wxYield for the
195 moment. */
196#if 0
197 MyThread *thread = new MyThread();
198
199 if ( thread->Create() != wxTHREAD_NO_ERROR )
200 {
201 error("Can't create thread!");
202 }
203 strcpy(finishedscript, entrydata);
204
205 InstCond = new wxCondition();
206
207 thread->Run();
208
209 wxMutex *test = new wxMutex();
210
211 InstCond->Wait(*test);
212#endif
213 install_thread(NULL);
214 create_wps_objects();
215 parse_ini(finishedscript);
216 }
217 else if(stricmp(entry, "mleview") == 0)
218 {
219 FILE *f;
220 unsigned long bytes;
221 char buffer[1025];
222 wxTextCtrl *tmp = (wxTextCtrl *)wxFindWindowByName(entrydata, dialog);
223
224 if(tmp)
225 {
226 grabfile(entrydata2);
227
228 if((f = fopen(entrydata2, "rb"))!= NULL)
229 {
230 while(!feof(f))
231 {
232 memset(buffer, 0, 1025);
233 bytes = fread(buffer, 1, 1024, f);
234 *tmp << buffer;
235 }
236 fclose(f);
237 }
238 remove(entrydata2);
239 tmp->ShowPosition(0);
240 }
241
242 }
243 else if(stricmp(entry, "setbutton") == 0)
244 {
245 for(b=0;b<COMMANDMAX;b++)
246 {
247 if(!wxcommands[b].id)
248 {
249 wxcommands[b].id = atoi(entrydata);
250 strcpy(wxcommands[b].file, entrydata2);
251 b = COMMANDMAX;
252 }
253 }
254 dialog->Connect( atol(entrydata), -1, wxEVT_COMMAND_BUTTON_CLICKED,
255 (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
256 &MyDialog::handle_button);
257
258 }
259 }
260 fclose(f);
261 remove(filename);
262 return TRUE;
263 }
264 remove(filename);
265 return FALSE;
266}
267
268void MyDialog::handle_button(wxCommandEvent& event )
269{
270 int b;
271
272 for(b=0;b<COMMANDMAX;b++)
273 {
274 if(wxcommands[b].id &&
275 wxcommands[b].id == event.GetId())
276 {
277 char tempbuf[50];
278
279 strcpy(tempbuf, wxcommands[b].file);
280 if(stricmp(tempbuf, "exit") == 0)
281 exit(0);
282 grabfile(tempbuf);
283 if(!parse_ini(tempbuf))
284 {
285 error("Error loading script \"%s\"", tempbuf);
286 exit(1);
287 }
288 remove(tempbuf);
289 return;
290 }
291 }
292
293}
294
295bool MyApp::OnInit(void)
296{
297#if 1
298 install_init(argv[0]);
299#else
300 install_init("install.exe");
301#endif
302
303 if(!parse_ini("page1.ini"))
304 {
305 error("Could not load startup script!");
306 return FALSE;
307 }
308
309 return TRUE;
310}
311
312MyApp::~MyApp()
313{
314}
315
316