317 lines
5.7 KiB
C++
317 lines
5.7 KiB
C++
|
#include "wx/wxprec.h"
|
||
|
|
||
|
#ifdef __BORLANDC__
|
||
|
#pragma hdrstop
|
||
|
#endif
|
||
|
|
||
|
#ifndef WX_PRECOMP
|
||
|
#include "wx/wx.h"
|
||
|
#endif
|
||
|
|
||
|
#include "wx/resource.h"
|
||
|
#include "install.h"
|
||
|
#include "instsup.h"
|
||
|
|
||
|
#include <ctype.h>
|
||
|
|
||
|
#if !defined(__EMX__) && !defined(__OS2__) && !defined(WIN32) && !defined(WINNT)
|
||
|
#define stricmp strcasecmp
|
||
|
#endif
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
extern char installdir[];
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
typedef struct _wxCommands {
|
||
|
int id;
|
||
|
char file[50];
|
||
|
} wxCommands;
|
||
|
|
||
|
#define COMMANDMAX 20
|
||
|
|
||
|
wxCommands wxcommands[COMMANDMAX];
|
||
|
char finishedscript[256] = "";
|
||
|
char percentname[256] = "";
|
||
|
|
||
|
class MyApp: public wxApp
|
||
|
{
|
||
|
public:
|
||
|
MyApp();
|
||
|
|
||
|
virtual bool OnInit();
|
||
|
|
||
|
virtual ~MyApp();
|
||
|
};
|
||
|
|
||
|
class MyDialog : public wxDialog
|
||
|
{
|
||
|
public:
|
||
|
void handle_button(wxCommandEvent& event);
|
||
|
};
|
||
|
|
||
|
class MyThread : public wxThread
|
||
|
{
|
||
|
public:
|
||
|
virtual void *Entry();
|
||
|
};
|
||
|
|
||
|
void *MyThread::Entry()
|
||
|
{
|
||
|
install_thread(NULL);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
MyDialog *dialog = NULL;
|
||
|
|
||
|
IMPLEMENT_APP(MyApp)
|
||
|
|
||
|
MyApp::MyApp()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
wxCondition *InstCond = NULL;
|
||
|
|
||
|
void updatepercent(void)
|
||
|
{
|
||
|
wxGauge *tmp = (wxGauge *)wxFindWindowByName(percentname, dialog);
|
||
|
|
||
|
if(tmp)
|
||
|
{
|
||
|
unsigned long sliderpos;
|
||
|
int pixels = 100;
|
||
|
extern int current_file, files;
|
||
|
|
||
|
sliderpos = (unsigned long)(((float)(current_file)/(float)files)*pixels);
|
||
|
tmp->SetValue(sliderpos);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int parse_ini(char *filename)
|
||
|
{
|
||
|
FILE *f;
|
||
|
int b;
|
||
|
|
||
|
for(b=0;b<COMMANDMAX;b++)
|
||
|
{
|
||
|
wxcommands[b].id = 0;
|
||
|
wxcommands[b].file[0] = 0;
|
||
|
}
|
||
|
|
||
|
grabfile(filename);
|
||
|
if((f=fopen(filename, "r")) != NULL)
|
||
|
{
|
||
|
int bytesread = 1;
|
||
|
char raw[256], entry[256], entrydata[256], entrydata2[256];
|
||
|
|
||
|
/* figure out why we are not getting an EOF on windows...
|
||
|
bytesread is a hack to make sure it doesn't loop forever. */
|
||
|
while(!feof(f) && bytesread)
|
||
|
{
|
||
|
bytesread = getparseline(f, '#', ',', '\"', raw, entry, entrydata, entrydata2);
|
||
|
if(stricmp(entry, "loadwxr") == 0)
|
||
|
{
|
||
|
grabfile(entrydata);
|
||
|
if(!wxResourceParseFile(entrydata))
|
||
|
{
|
||
|
error("Error loading resources!");
|
||
|
remove(entrydata);
|
||
|
remove(filename);
|
||
|
return FALSE;
|
||
|
}
|
||
|
remove(entrydata);
|
||
|
|
||
|
dialog = new MyDialog;
|
||
|
|
||
|
dialog->LoadFromResource(NULL, "dialog1");
|
||
|
dialog->Show(TRUE);
|
||
|
|
||
|
/*MyApp::SetTopWindow(dialog);*/
|
||
|
}
|
||
|
else if(stricmp(entry, "closeold") == 0)
|
||
|
{
|
||
|
if(dialog)
|
||
|
dialog->Destroy();
|
||
|
dialog = NULL;
|
||
|
}
|
||
|
else if(stricmp(entry, "getcheck") == 0)
|
||
|
{
|
||
|
wxCheckBox *tmp = (wxCheckBox *)wxFindWindowByName(entrydata, dialog);
|
||
|
|
||
|
if(tmp)
|
||
|
{
|
||
|
if(!tmp->GetValue())
|
||
|
{
|
||
|
parse_ini(entrydata2);
|
||
|
bytesread = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if(stricmp(entry, "gettext") == 0)
|
||
|
{
|
||
|
wxTextCtrl *tmp = (wxTextCtrl *)wxFindWindowByName(entrydata, dialog);
|
||
|
wxString bleah;
|
||
|
|
||
|
if(tmp)
|
||
|
{
|
||
|
if((bleah = tmp->GetValue()))
|
||
|
strcpy(installdir, bleah);
|
||
|
}
|
||
|
}
|
||
|
else if(stricmp(entry, "settext") == 0)
|
||
|
{
|
||
|
wxTextCtrl *tmp = (wxTextCtrl *)wxFindWindowByName(entrydata, dialog);
|
||
|
|
||
|
if(tmp)
|
||
|
tmp->SetValue(installdir);
|
||
|
}
|
||
|
else if(stricmp(entry, "message") == 0)
|
||
|
mesg(entrydata);
|
||
|
else if(stricmp(entry, "disable") == 0)
|
||
|
{
|
||
|
wxButton *tmp = (wxButton *)wxFindWindowByName(entrydata, dialog);
|
||
|
if(tmp)
|
||
|
tmp->Disable();
|
||
|
}
|
||
|
else if(stricmp(entry, "grabfile") == 0)
|
||
|
grabfile(entrydata);
|
||
|
else if(stricmp(entry, "remove") == 0)
|
||
|
remove(entrydata);
|
||
|
else if(stricmp(entry, "system") == 0)
|
||
|
wxExecute(entrydata);
|
||
|
else if(stricmp(entry, "startinst") == 0)
|
||
|
{
|
||
|
strcpy(percentname, entrydata);
|
||
|
strcpy(finishedscript, entrydata2);
|
||
|
|
||
|
/* I couldn't get it working with threads, even when
|
||
|
using conditions it blocked the message loop making
|
||
|
it unreadable, so I am going with wxYield for the
|
||
|
moment. */
|
||
|
#if 0
|
||
|
MyThread *thread = new MyThread();
|
||
|
|
||
|
if ( thread->Create() != wxTHREAD_NO_ERROR )
|
||
|
{
|
||
|
error("Can't create thread!");
|
||
|
}
|
||
|
strcpy(finishedscript, entrydata);
|
||
|
|
||
|
InstCond = new wxCondition();
|
||
|
|
||
|
thread->Run();
|
||
|
|
||
|
wxMutex *test = new wxMutex();
|
||
|
|
||
|
InstCond->Wait(*test);
|
||
|
#endif
|
||
|
install_thread(NULL);
|
||
|
create_wps_objects();
|
||
|
parse_ini(finishedscript);
|
||
|
}
|
||
|
else if(stricmp(entry, "mleview") == 0)
|
||
|
{
|
||
|
FILE *f;
|
||
|
unsigned long bytes;
|
||
|
char buffer[1025];
|
||
|
wxTextCtrl *tmp = (wxTextCtrl *)wxFindWindowByName(entrydata, dialog);
|
||
|
|
||
|
if(tmp)
|
||
|
{
|
||
|
grabfile(entrydata2);
|
||
|
|
||
|
if((f = fopen(entrydata2, "rb"))!= NULL)
|
||
|
{
|
||
|
while(!feof(f))
|
||
|
{
|
||
|
memset(buffer, 0, 1025);
|
||
|
bytes = fread(buffer, 1, 1024, f);
|
||
|
*tmp << buffer;
|
||
|
}
|
||
|
fclose(f);
|
||
|
}
|
||
|
remove(entrydata2);
|
||
|
tmp->ShowPosition(0);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if(stricmp(entry, "setbutton") == 0)
|
||
|
{
|
||
|
for(b=0;b<COMMANDMAX;b++)
|
||
|
{
|
||
|
if(!wxcommands[b].id)
|
||
|
{
|
||
|
wxcommands[b].id = atoi(entrydata);
|
||
|
strcpy(wxcommands[b].file, entrydata2);
|
||
|
b = COMMANDMAX;
|
||
|
}
|
||
|
}
|
||
|
dialog->Connect( atol(entrydata), -1, wxEVT_COMMAND_BUTTON_CLICKED,
|
||
|
(wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
|
||
|
&MyDialog::handle_button);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
fclose(f);
|
||
|
remove(filename);
|
||
|
return TRUE;
|
||
|
}
|
||
|
remove(filename);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void MyDialog::handle_button(wxCommandEvent& event )
|
||
|
{
|
||
|
int b;
|
||
|
|
||
|
for(b=0;b<COMMANDMAX;b++)
|
||
|
{
|
||
|
if(wxcommands[b].id &&
|
||
|
wxcommands[b].id == event.GetId())
|
||
|
{
|
||
|
char tempbuf[50];
|
||
|
|
||
|
strcpy(tempbuf, wxcommands[b].file);
|
||
|
if(stricmp(tempbuf, "exit") == 0)
|
||
|
exit(0);
|
||
|
grabfile(tempbuf);
|
||
|
if(!parse_ini(tempbuf))
|
||
|
{
|
||
|
error("Error loading script \"%s\"", tempbuf);
|
||
|
exit(1);
|
||
|
}
|
||
|
remove(tempbuf);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
bool MyApp::OnInit(void)
|
||
|
{
|
||
|
#if 1
|
||
|
install_init(argv[0]);
|
||
|
#else
|
||
|
install_init("install.exe");
|
||
|
#endif
|
||
|
|
||
|
if(!parse_ini("page1.ini"))
|
||
|
{
|
||
|
error("Could not load startup script!");
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
MyApp::~MyApp()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|