wxWidgets/utils/Install/wxmain.cpp
Bryan Petty f6bcfd974e merged 2.2 branch
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@7748 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2000-07-15 19:51:35 +00:00

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()
{
}