]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/Install/wxmain.cpp
merged 2.2 branch
[wxWidgets.git] / utils / Install / wxmain.cpp
diff --git a/utils/Install/wxmain.cpp b/utils/Install/wxmain.cpp
new file mode 100644 (file)
index 0000000..39cbad1
--- /dev/null
@@ -0,0 +1,316 @@
+#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()
+{
+}
+
+