From b3a74322614c8de7b465081205b3af23783fd65b Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 23 Jul 2007 15:01:38 +0000 Subject: [PATCH] Patch level :4.0 nopatch Files correlati : Ricompilazione Demo : [ ] Commento :aggiunto modulo setup git-svn-id: svn://10.65.10.50/trunk@15510 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- setup/Setup.cpp | 1105 ++++++++++++++++++++++++++++++++++++++++++ setup/aga_logo.gif | Bin 0 -> 5804 bytes setup/install.ico | Bin 0 -> 25214 bytes setup/resource.h | 17 + setup/sirio_logo.gif | Bin 0 -> 8994 bytes setup/wxinc.h | 25 + 6 files changed, 1147 insertions(+) create mode 100755 setup/Setup.cpp create mode 100755 setup/aga_logo.gif create mode 100755 setup/install.ico create mode 100755 setup/resource.h create mode 100755 setup/sirio_logo.gif create mode 100755 setup/wxinc.h diff --git a/setup/Setup.cpp b/setup/Setup.cpp new file mode 100755 index 000000000..3996c88bd --- /dev/null +++ b/setup/Setup.cpp @@ -0,0 +1,1105 @@ +#include "wxinc.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#include +#endif + +extern "C" +{ +#include "../xvaga/hlapi_c.h" +#include "../xvaga/skeylink.h" +} + +/////////////////////////////////////////////////////////// +// Utilities +/////////////////////////////////////////////////////////// +void ErrorBox(LPCSTR str) +{ + wxMessageBox(str, "Installazione", wxOK | wxICON_ERROR); +} + +void WarningBox(LPCSTR str) +{ + wxMessageBox(str, "Installazione", wxOK | wxICON_EXCLAMATION); +} + +wxString GetDefaultDestination() +{ + wxString strDest; +//scelta della directory di installazione di default +#ifdef WIN32 + TCHAR strFolder[MAX_PATH]; + ::SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, strFolder); + strDest = strFolder; +#endif + + if (strDest.IsEmpty()) + { + // Forse è la cartella base dove è installato Word? + wxFileType* pDoc = wxTheMimeTypesManager->GetFileTypeFromExtension(wxT("doc")); + if (pDoc != NULL) + { + wxFileName strFilename = pDoc->GetOpenCommand(wxT("pippo.doc")); + while (strFilename.GetDirCount() > 1) + strFilename.RemoveLastDir(); + strDest = strFilename.GetPath().After('"'); + if (strDest.StartsWith(wxT("C\\"))) + strDest = wxT("C:") + strDest.Mid(1); + } + } + + return strDest; +} + +class RSDirCopier : public wxDirTraverser +{ + wxString m_strSrc, m_strDst; + +protected: + virtual wxDirTraverseResult OnDir(const wxString& dirname); + virtual wxDirTraverseResult OnFile(const wxString& filename); + +public: + void RenameDLL(const wxString& strDLL, bool bOpenGL) const; + bool Copy(const wxString& src, const wxString& dst, bool bOpenGL); +}; + +wxDirTraverseResult RSDirCopier::OnDir(const wxString& dirname) +{ + return wxDIR_CONTINUE; +} + +wxDirTraverseResult RSDirCopier::OnFile(const wxString& filename) +{ + wxFileName strSource(filename); + strSource.MakeRelativeTo(m_strSrc); + + wxString str = m_strDst; + str += strSource.GetPathSeparator(); + str += strSource.GetFullPath(); + + wxFileName strDest(str); + if (!strDest.DirExists()) + strDest.Mkdir(); + + ::wxCopyFile(filename, str); + + return wxDIR_CONTINUE; +} + +void RSDirCopier::RenameDLL(const wxString& strDLL, bool bOpenGL) const +{ + wxFileName file1(m_strDst, strDLL); + file1.SetExt(bOpenGL ? wxT("dll") : wxT("old")); + + if (file1.FileExists()) + { + wxFileName file2(file1); + file2.SetExt(bOpenGL ? wxT("old") : wxT("dll")); + wxRename(file1.GetFullPath(), file2.GetFullPath()); + } +} + +bool RSDirCopier::Copy(const wxString& src, const wxString& dst, bool bOpenGL) +{ + wxBusyCursor hourglass; + m_strSrc = src; + m_strDst = dst; + + if (!wxDirExists(m_strDst)) // Utile precauzione + wxMkdir(m_strDst); + + wxDir dir(m_strSrc); + dir.Traverse(*this); + + RenameDLL(wxT("OpenGL32.dll"), bOpenGL); + RenameDLL(wxT("glu32.dll"), bOpenGL); + + return true; +} + +#ifdef WIN32 + +bool WriteRootRegistryKey(const wxChar* strKey, const wxString& strValue) +{ + HKEY hKey = NULL; + DWORD dw = 0; + bool ok = ::RegCreateKeyEx(HKEY_CLASSES_ROOT, strKey, 0, REG_NONE, + REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &hKey, &dw) == ERROR_SUCCESS; + if (ok) + { + ok = ::RegSetValueEx(hKey, NULL, 0, REG_SZ, + (BYTE*)(const wxChar*)strValue, DWORD(2*strValue.Len()+2)) == ERROR_SUCCESS; + ::RegCloseKey(hKey); + } + return ok; +} + +bool CreateDesktopIcon(const wxFileName& strExeFile) +{ + TCHAR szDesktopPath[MAX_PATH] = wxT(""); + HRESULT hres = ::SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, SHGFP_TYPE_CURRENT, szDesktopPath); + + if (szDesktopPath[0] != '\0') + { + CoInitialize(NULL); + + // Get a pointer to the IShellLink interface. + IShellLink* psl; + hres = CoCreateInstance(CLSID_ShellLink, NULL, + CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&psl); + if (SUCCEEDED(hres)) + { + IPersistFile* ppf; + + // Set the path to the shortcut target and add the description. + psl->SetPath(strExeFile.GetFullPath()); + psl->SetWorkingDirectory(strExeFile.GetPath()); + psl->SetDescription(APPNAME); + + // Query IShellLink for the IPersistFile interface for saving the + // shortcut in persistent storage. + hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); + + if (SUCCEEDED(hres)) + { + wxFileName strLnk(szDesktopPath, wxT("Campo.lnk")); + // Save the link by calling IPersistFile::Save. + wxString stringa = strLnk.GetFullPath(); + wchar_t buff[256]; + wxConvLocal.MB2WC(buff, stringa, stringa.Len()); + hres = ppf->Save(buff, true); + ppf->Release(); + } + psl->Release(); + } + CoUninitialize(); + } + + return true; +} + +void AssociateExtension(const wxFileName& strExeFile, const wxChar* strExt) +{ + // Register icon and application + WriteRootRegistryKey(strExt, APPNAME); + + wxString str = strExeFile.GetFullPath(); str += wxT(",0"); + WriteRootRegistryKey(wxT("Campo\\DefaultIcon"), str); + + str = strExeFile.GetFullPath(); str += wxT(" \"%1\""); + WriteRootRegistryKey(wxT("Campo\\shell\\open\\command"), str); +} + +#endif + +/////////////////////////////////////////////////////////// +// CampoWizardPage +/////////////////////////////////////////////////////////// + +class CampoWizardPage : public wxWizardPageSimple +{ + wxHtmlWindow* m_pText; + +protected: + wxWizard& GetWizard() const {return *(wxWizard*)GetParent();} + void SetHTMLText(const wxString strTitle, const wxString strBody); + void SetHTMLPage(const wxString strFile); + +public: + wxString Get(wxWindowID id) const; + bool Set(wxWindowID id, const wxString& str); + int GetSelection(wxWindowID id) const; + + CampoWizardPage(wxWizard* parent); +}; + +wxString CampoWizardPage::Get(wxWindowID id) const +{ + wxWindow* pWnd = FindWindowById(id); + return pWnd ? pWnd->GetLabel() : wxEmptyString; +} + +bool CampoWizardPage::Set(wxWindowID id, const wxString& str) +{ + wxWindow* pWnd = FindWindowById(id); + if (pWnd) + pWnd->SetLabel(str); + return (pWnd != NULL); +} + +int CampoWizardPage::GetSelection(wxWindowID id) const +{ + int n = -1; + wxWindow* pWnd = FindWindowById(id); + if (pWnd) + { + wxChoice* pList = (wxChoice*)pWnd; + n = pList->GetSelection(); + } + return n; +} + +void CampoWizardPage::SetHTMLPage(const wxString strFile) +{ + m_pText->LoadPage(strFile); +} + +void CampoWizardPage::SetHTMLText(wxString strTitle, wxString strBody) +{ + wxString strAppName = wxT(" "); strAppName += APPNAME; strAppName += wxT(" "); + strTitle.Replace(wxT("APPNAME"), strAppName); + strBody.Replace(wxT("APPNAME"), strAppName); + + wxString str; + str += wxT(""); + str += wxT("

"); str += strTitle; str += wxT("

"); + str += wxT("
"); + str += wxT("
"); str += strBody; str += wxT("
"); + str += wxT(""); + + m_pText->SetPage(str); +} + +CampoWizardPage::CampoWizardPage(wxWizard* parent) + : wxWizardPageSimple(parent) +{ + wxBoxSizer* pSizer = new wxBoxSizer(wxVERTICAL); + m_pText = new wxHtmlWindow(this, 100, wxDefaultPosition, wxSize(512, 256)); + pSizer->Add(m_pText, 0, wxALL, 0); + pSizer->AddSpacer(5); + SetSizer(pSizer); +} +/**********************************************************************************************************/ +/* 1 Pagina di benvenuto */ +/**********************************************************************************************************/ +class CampoWizardPage1 : public CampoWizardPage +{ +public: + CampoWizardPage1(wxWizard* parent); +}; + +CampoWizardPage1::CampoWizardPage1(wxWizard* parent) : CampoWizardPage(parent) +{ + //contenuto della prima schermata (pagina benvenuto) + wxString strTitle = wxT("Benvenuti in APPNAME"); + wxString strBody = wxT("Questo programma vi guiderà passo a passo nell'installazione / aggiornamento del software."); + SetHTMLText(strTitle, strBody); +} + + +/**********************************************************************************************************/ +/* 2 Pagina con la scelta di Aggiornamento / Tipo Installazione */ +/**********************************************************************************************************/ +class CampoWizardPage2 : public CampoWizardPage +{ + wxRadioBox* m_pRadioBox; + +protected: + virtual bool TransferDataFromWindow(); + +public: + CampoWizardPage2(wxWizard* parent); +}; + +bool CampoWizardPage2::TransferDataFromWindow() +{ + const int last_row = m_pRadioBox->GetRowCount() - 1; + const int selected_row = m_pRadioBox->GetSelection(); + wxString path; + + if (selected_row < last_row) + path = m_pRadioBox->GetStringSelection(); + + GetWizard().SetDestinationPath(path); + return true; +} + +CampoWizardPage2::CampoWizardPage2(wxWizard* parent) : CampoWizardPage(parent) +{ + //deve cercare campo.stp + wxFileConfig campo_stp("", "", "", "C:\\campo.stp", wxCONFIG_USE_GLOBAL_FILE|wxCONFIG_USE_NO_ESCAPE_CHARACTERS); + wxString group; + long index; + const wxString program = "Program"; + wxArrayString gruppi, campi; + + //cerca se esiste campo.stp;se lo trova cerca quelle che sono le installazioni valide;se ne trova.. + //..le aggiunge ad un array di stringhe (campi) da cui genera un radiobutton di scelte + for (bool ok = campo_stp.GetFirstGroup(group, index); ok; ok = campo_stp.GetNextGroup(group, index)) + { + gruppi.Add(group); + } + int prechecked = -1; + for (unsigned int i = 0; i < gruppi.GetCount(); i++) + { + wxFileConfig campo_stp("", "", "", "C:\\campo.stp", wxCONFIG_USE_GLOBAL_FILE|wxCONFIG_USE_NO_ESCAPE_CHARACTERS); + campo_stp.SetPath(gruppi[i]); + wxString path = campo_stp.Read(program); + + //sono installazioni valide quelle che presentano la coppia di files campo.ini e campo.aut (senza.. + //..questi 2 soggetti il programma non parte) + wxString campo_ini = path; + campo_ini << "\\campo.ini"; + wxString campo_aut = path; + campo_aut << "\\campo.aut"; + if (wxFileName::FileExists(campo_ini) && wxFileName::FileExists(campo_aut)) + { + campi.Add(path); + //cerca l'eventuale installazione server se ci sono piu' installazioni sulla stessa macchina + if (prechecked < 0) + { + wxFileConfig ini("", "", "", campo_ini, wxCONFIG_USE_GLOBAL_FILE|wxCONFIG_USE_NO_ESCAPE_CHARACTERS); + ini.SetPath("Main"); + wxString test_database = ini.Read("TestDatabase"); + if (test_database == "X" || test_database == "Y") + prechecked = i; + } + } + } + + //se non ci sono delle installazioni da aggiornare propone solo installazioni.. + if (campi.IsEmpty()) + { + wxString strTitle = wxT("Scelta Installazione"); + wxString strBody = wxT("

E' possibile INSTALLARE Campo in un nuovo direttorio.

"); + SetHTMLText(strTitle, strBody); + + campi.Add("Nuova installazione"); //voce di nuova installazione! + m_pRadioBox = new wxRadioBox(this, 201, "Installazione del software", wxDefaultPosition, + wxDefaultSize, campi, 0, wxRA_SPECIFY_ROWS); + } + //..senno' propone di aggiornare + else + { + wxString strTitle = wxT("Scelta Aggiornamento / Installazione"); + wxString strBody = wxT("

E' possibile AGGIORNARE (scelta consigliata) una installazione di Campo gia' presente oppure INSTALLARE in un nuovo direttorio.

"); + strBody += wxT("

Selezionare l'opzione desiderata nel riquadro sottostante.

"); + SetHTMLText(strTitle, strBody); + + //radiobutton con le scelte aggiornamento + campi.Add("Nuova installazione"); + + m_pRadioBox = new wxRadioBox(this, 201, "Selezionare l'installazione da aggiornare (consigliato) o Nuova installazione", wxDefaultPosition, + wxDefaultSize, campi, 0, wxRA_SPECIFY_ROWS); + if (prechecked > 0) + m_pRadioBox->SetSelection(prechecked); + } + GetSizer()->Add(m_pRadioBox); +} +/**********************************************************************************************************/ +// 3 Pagina con Accetta / Rifiuta la licenza +//*********************************************************************************************************/ +class CampoWizardPage3 : public CampoWizardPage +{ +protected: + virtual bool TransferDataFromWindow(); + +public: + CampoWizardPage3(wxWizard* parent); +}; + +bool CampoWizardPage3::TransferDataFromWindow() +{ + if (GetSelection(301) == 1) + { + wxMessageBox("Impossibile proseguire se non si accetta la licenza sul software!!", APPNAME, wxICON_ERROR|wxOK); + return false; + } + return true; +} + +CampoWizardPage3::CampoWizardPage3(wxWizard* parent) : CampoWizardPage(parent) +{ + SetHTMLPage("licenza.htm"); + + //radiobutton Accetta / Rifiuta + wxArrayString acc_ref; + acc_ref.Add("Accetta"); + acc_ref.Add("Rifiuta"); + wxRadioBox* radio_box = new wxRadioBox(this, 301, "Selezionare 'Accetta' per proseguire con l'installazione, 'Rifiuta' per terminare l'installazione", wxDefaultPosition, + wxDefaultSize, acc_ref, 0, wxRA_SPECIFY_COLS); + + radio_box->SetSelection(1); + GetSizer()->Add(radio_box); + +} + +/**********************************************************************************************************/ +/* 4 Pagina con la gestione della chiave di protezione */ +/**********************************************************************************************************/ +class CampoWizardPage4 : public CampoWizardPage +{ + int _dongle_type; + wxButton* _butt_HL; + wxButton* _butt_EU; + +protected: + DECLARE_EVENT_TABLE(); + void OnHLPick(wxCommandEvent& e); + void OnEUPick(wxCommandEvent& e); + + int DongleTest(); + int ThisYear(); + wxString DecodeString(const wxString& data); + int VersionYear(); + void BuildKey(char* key); + + bool HardlockGarble(unsigned short* data); + unsigned short HardlockLogin(int& year); + + void EncodeEutronPassword(char* str); + unsigned short EutronLogin(int& year); + +public: + CampoWizardPage4(wxWizard* parent); +}; + +//metodi per la gestione dei bottoni per l'esecuzione dei programmi di installazione delle chiavi +BEGIN_EVENT_TABLE(CampoWizardPage4, CampoWizardPage) + EVT_BUTTON(401, OnHLPick) + EVT_BUTTON(402, OnEUPick) +END_EVENT_TABLE() + +void CampoWizardPage4::OnHLPick(wxCommandEvent& e) +{ + wxString path("./chiavi/hardlock/hldrv32.exe"); + wxExecute(path, wxEXEC_SYNC); +} + +void CampoWizardPage4::OnEUPick(wxCommandEvent& e) +{ + wxString path("./chiavi/eutron/sdi.exe"); + wxExecute(path, wxEXEC_SYNC); +} +/////////////////////////////// +// Gestione chiave Hardlock // +/////////////////////////////// +bool CampoWizardPage4::HardlockGarble(unsigned short* data) +{ + HL_CODE(data, 1); + return true; +} + +unsigned short CampoWizardPage4::HardlockLogin(int& year) +{ + unsigned short serno = 0xFFFF; + unsigned char REFKEY[16] = "CAMPOKEY"; + unsigned char VERKEY[16] = "ìpÙˆ¬cê<"; + if (HL_LOGIN(26952, LOCAL_DEVICE, REFKEY, VERKEY) == STATUS_OK) + { + unsigned short eprom[64]; memset(eprom, 0, sizeof(eprom)); + HL_READBL((unsigned char*)eprom); + unsigned short data[4]; + memcpy(data, eprom, sizeof(data)); + HardlockGarble(data); + if (data[0] == 0xFAE8) + serno = data[1]; + else + serno = 0; + + memcpy(data, &eprom[60], sizeof(data)); + if (HardlockGarble(data)) + year = (int)data[0]; + } + return serno; +} + +/////////////////////////////// +// Gestione chiave Eutron // +/////////////////////////////// +void CampoWizardPage4::EncodeEutronPassword(char* str) +{ + const char* const key = "QSECOFR-"; + char tmp[16]; + int i; + for (i = 0; str[i]; i++) + tmp[i] = str[i] + (i < 8 ? key[i] : str[i - 8]); + tmp[i] = '\0'; + strcpy(str, tmp); +} + +unsigned short CampoWizardPage4::EutronLogin(int& year) +{ + unsigned short serno = 0xFFFF; + + const char* const login[2] = { "AGA.CAMPO", "25EBAI" }; + for (int i = 0; i < 2; i++) + { + KEY_NET eutron_key; + memset(&eutron_key, 0, sizeof(KEY_NET)); + eutron_key.net_command = NET_KEY_OPEN; + eutron_key.command = LOCATING_MODE; + + const char* const chiaro = login[i]; + char cifrato[16]; + strcpy(cifrato, chiaro); + EncodeEutronPassword(cifrato); + + memset(eutron_key.label, 0, LABEL_LENGTH); + strcpy((char*)eutron_key.label, chiaro); + memset(eutron_key.password, 0, PASSWORD_LENGTH); + strcpy((char*)eutron_key.password, cifrato); + + smartlink(&eutron_key); + if (eutron_key.status == ST_OK) + { + eutron_key.net_command = NET_KEY_ACCESS; + eutron_key.command = BLOCK_READING_MODE; + short* pointer = (short*)(&eutron_key.data[0]); + short* number = (short*)(&eutron_key.data[2]); + *pointer = 0; // Posizione in cui leggere + *number = 8; // Words da leggere + smartlink(&eutron_key); + if (eutron_key.status == ST_OK) + { + serno = (unsigned short)atol((const char*)eutron_key.data+4); + if (i == 0) + { + const unsigned short y = *(unsigned short*)(eutron_key.data+12); + if (y > 2000 && y < 3000) + year = y; + } + else + year = ThisYear(); + + break; + } + } + } + + return serno; +} + +///////////////////////////////////////////////////////// +// Metodi generici per le chiavi ed i relativi codici // +///////////////////////////////////////////////////////// +void CampoWizardPage4::BuildKey(char* key) +{ + for (int i = 0; i < 8; i++) + key[i] = 'A'+ rand()%26; +} + +int CampoWizardPage4::ThisYear() +{ + int anno = 2006; + time_t lt; + if (time(<) == 0) + { + struct tm* timeloc = localtime(<) ; + if (timeloc != NULL) + anno = timeloc->tm_year + 1900; + } + return anno; +} + +wxString CampoWizardPage4::DecodeString(const wxString& data) +{ + char key[8] = ""; + BuildKey(key); + + char tmp[256]; + int i; + for (i = 0; data[i]; i++) + tmp[i] = data[i] - (i < 8 ? key[i] : tmp[i - 8]); + tmp[i] = '\0'; + return tmp; +} + +int CampoWizardPage4::VersionYear() +{ + char ver[32]; + GetPrivateProfileString("ba", "Versione", "", ver, sizeof(ver), "./program/zip/install.ini"); + ver[4] = '\0'; + return atoi(ver); +} + +int CampoWizardPage4::DongleTest() +{ + _dongle_type = 0; + int yearKey = 0; + + unsigned int serno = HardlockLogin(yearKey); + if (serno == 0xFFFF) + { + serno = EutronLogin(yearKey); + if (serno != 0xFFFF) + _dongle_type = 2; //chiave eutron + } + else + _dongle_type = 1; //chiave hardlock + + if (serno == 0) // Chiave di sviluppo + return _dongle_type; + if (serno == 0xFFFF) // Chiave inesistente o invisibile = Prima installazione o demo + return _dongle_type; + + const int verYear = VersionYear(); + if (yearKey < verYear) // Chiave già programmata con assistenza pagata + { + bool ok = false; + wxFileInputStream file("./program/zip/dninst.zip"); + if (file.IsOk()) + { + wxTextInputStream keys(file); + wxString line = keys.ReadLine(); + srand(883); + DecodeString(line); + const int ass_year = atoi(line); + if (ass_year > yearKey) // Non devo abbassare l'anno di assistenza! + { + srand(ass_year); + while (!file.Eof()) + { + line = keys.ReadLine(); + line = DecodeString(line); + unsigned int sn = (unsigned int)atol(line); + if (sn == serno || line[0] == '*') + { + ok = true; + break; + } + } + if (ok) + { + const int n = ass_year%10; + const int y = (ass_year / 1000) * 1000 + (ass_year%1000) /10; + line.Printf("Il contratto di manutenzione %d/%d verrà attivato automaticamente", y, n); + WarningBox(line); + } + else + { + line.Printf("È necessario contattare l'assistenza tecnica\n" + "per l'abilitazione del contratto di manutenzione %d", verYear); + WarningBox(line); + } + } + } + else + { + ErrorBox("Impossibile verificare il contratto di manutenzione"); + } + } + return _dongle_type; +} + +CampoWizardPage4::CampoWizardPage4(wxWizard* parent) : CampoWizardPage(parent) +{ + _dongle_type = DongleTest(); //controlla se la chiave c'e' ed eventualmente quale e' + + wxString strTitle = wxT("Controllo della chiave hardware di protezione"); + wxString strBody = wxT("

La versione commerciale del software richiede l'installazione e la presenza della chiave hardware di protezione

"); + switch (_dongle_type) + { + case 1: + strBody += wxT("

E' stata rilevata una chiave tipo Hardlock:

"); + strBody += wxT("

"); + strBody += wxT("

Si puo' procedere con l'installazione /aggiornamento del software Campo. Premere il pulsante \"Next\".

"); + break; + case 2: + strBody += wxT("

E' stata rilevata una chiave tipo Eutron:

"); + strBody += wxT("

"); + strBody += wxT("

Si puo' procedere con l'installazione /aggiornamento del software Campo. Premere il pulsante \"Next\".

"); + break; + //case 3: e' il caso del server di chiavi;la DongleTest() per ora non lo fa + //break; + default: + strBody += wxT("

Non e' stata rilevata alcuna chiave hardware installata !

"); + strBody += wxT("

Per procedere all'installazione dei driver della chiave hardware collegata al computer premere il bottone corrispondente alla tipologia della chiave stessa.

"); + strBody += wxT("

Se si desidera proseguire nell'installazione del software senza installare la chiave hardware cliccare su \"Next\".

"); + strBody += wxT("

Quest'ultima procedura e' consigliata solo in caso di installazione tipo Client di rete senza chiave propria, ma che utilizza un server di autorizzazioni gia' installato e funzionante in rete.

"); + + //procedura per la costruzione dei bottoni e delle immagini per l'installazione dei driver di chiave + //"griglia" contenitrice degli oggetti + wxBoxSizer* butt_box = new wxBoxSizer(wxHORIZONTAL); + GetSizer()->Add(butt_box, 0, wxALIGN_CENTER_HORIZONTAL, 0); + //Hardlock img e button + wxBitmap bmp_HL("hardlock.gif", wxBITMAP_TYPE_GIF); + wxStaticBitmap* s_bmp_HL = new wxStaticBitmap(this, wxID_ANY, bmp_HL); + butt_box->Add(s_bmp_HL, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8); + _butt_HL = new wxButton(this, 401, "Hardlock", wxDefaultPosition, wxSize(100, 50)); + butt_box->Add(_butt_HL, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8); + //spaziatore centrale + butt_box->AddSpacer(24); + //Eutron img e button + _butt_EU = new wxButton(this, 402, "Eutron", wxDefaultPosition, wxSize(100, 50)); + butt_box->Add(_butt_EU, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8); + wxBitmap bmp_EU("eutron.gif", wxBITMAP_TYPE_GIF); + wxStaticBitmap* s_bmp_EU = new wxStaticBitmap(this, wxID_ANY, bmp_EU); + butt_box->Add(s_bmp_EU, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8); + break; + } + + SetHTMLText(strTitle, strBody); +} + +/**********************************************************************************************************/ +// nuove pagine da implementare +/**********************************************************************************************************/ +class CampoWizardPage5 : public CampoWizardPage +{ +protected: +public: + CampoWizardPage5(wxWizard* parent); +}; +CampoWizardPage5::CampoWizardPage5(wxWizard* parent) : CampoWizardPage(parent) +{ + wxString strTitle = wxT("Pagina 5"); + wxString strBody = wxT("Pagina 5"); + SetHTMLText(strTitle, strBody); +} + +class CampoWizardPage6 : public CampoWizardPage +{ +protected: +public: + CampoWizardPage6(wxWizard* parent); +}; +CampoWizardPage6::CampoWizardPage6(wxWizard* parent) : CampoWizardPage(parent) +{ + wxString strTitle = wxT("Pagina 6"); + wxString strBody = wxT("Pagina 6"); + SetHTMLText(strTitle, strBody); +} + +class CampoWizardPage7 : public CampoWizardPage +{ +protected: +public: + CampoWizardPage7(wxWizard* parent); +}; +CampoWizardPage7::CampoWizardPage7(wxWizard* parent) : CampoWizardPage(parent) +{ + wxString strTitle = wxT("Pagina 7"); + wxString strBody = wxT("Pagina 7"); + SetHTMLText(strTitle, strBody); +} + + +/**********************************************************************************************************/ +//pagina con la selezione di destinazione +/**********************************************************************************************************/ +class CampoWizardPage8 : public CampoWizardPage +{ +protected: + DECLARE_EVENT_TABLE(); + void OnDirPick(wxCommandEvent& e); + +public: + CampoWizardPage8(wxWizard* parent); +}; + +BEGIN_EVENT_TABLE(CampoWizardPage8, CampoWizardPage) + EVT_BUTTON(202, OnDirPick) +END_EVENT_TABLE() + +void CampoWizardPage8::OnDirPick(wxCommandEvent& e) +{ + wxFileName strPath = Get(201); + wxDirDialog dlg(this, wxDirSelectorPromptStr, strPath.GetPath(), + wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST); + if (dlg.ShowModal() == wxID_OK) + { + strPath.Assign(dlg.GetPath(), APPNAME); + Set(201, strPath.GetFullPath()); + } +} + +CampoWizardPage8::CampoWizardPage8(wxWizard* parent) : CampoWizardPage(parent) +{ + //seconda pagina + wxString strTitle = wxT("Selezione della cartella di destinazione"); + wxString strBody = wxT("APPNAME verrà installato nella cartella selezionata"); + SetHTMLText(strTitle, strBody); + + wxBoxSizer* pSizer = new wxBoxSizer(wxHORIZONTAL); + GetSizer()->Add(pSizer); + + const wxFileName strPath(GetDefaultDestination(), APPNAME); + wxTextCtrl* pPath = new wxTextCtrl(this, 201, strPath.GetFullPath(), + wxDefaultPosition, wxSize(320,-1), wxTE_READONLY); + pSizer->Add(pPath, 0, wxALL, 0); + + wxButton* pButton = new wxButton(this, 202, wxT("..."), wxDefaultPosition, wxSize(24, -1)); + pSizer->Add(pButton, 0, wxALL, 0); +} + +class CampoWizardPage9 : public CampoWizardPage +{ +public: + CampoWizardPage9(wxWizard* parent); +}; + +CampoWizardPage9::CampoWizardPage9(wxWizard* parent) : CampoWizardPage(parent) +{ + wxString strTitle = wxT(""); + wxString strBody; + strBody += wxT("Attivando questa opzione verrà utilizzata l'accelerazione "); + strBody += wxT("hardware della scheda video installata, altrimenti il rendering "); + strBody += wxT("delle mappe sarà implementato via software (Mesa)"); + SetHTMLText(strTitle, strBody); + + wxArrayString aMode; + aMode.Add(wxT("Hardware (Maggiori prestazioni, minore compatibilità)")); + aMode.Add(wxT("Software (Maggiore compatibilità, minori prestazioni)")); + wxRadioBox* pBox = new wxRadioBox(this, 301, wxT("Accelerazione OpenGL"), wxDefaultPosition, wxDefaultSize, + aMode, 0, wxRA_VERTICAL); + GetSizer()->Add(pBox, 0, wxALL, 0); +} + +class CampoWizardPage10 : public CampoWizardPage +{ +public: + CampoWizardPage10(wxWizard* parent); +}; + +CampoWizardPage10::CampoWizardPage10(wxWizard* parent) : CampoWizardPage(parent) +{ + wxString strTitle = wxT("Collegamenti"); + wxString strBody; + strBody += wxT("E' possibile creare l'icona di APPNAME sul desktop "); + //strBody += wxT("ed associare l'estensione .rs1 al programma."); + SetHTMLText(strTitle, strBody); + + wxCheckBox* pIcon = new wxCheckBox(this, 401, wxT("Creare l'icona sul desktop")); + pIcon->SetValue(true); + GetSizer()->Add(pIcon, 0, wxALL, 0); + + GetSizer()->AddSpacer(5); + + //wxCheckBox* pLink = new wxCheckBox(this, 402, wxT("Associare i file .rs1 al programma")); + //pLink->SetValue(true); + //GetSizer()->Add(pLink, 0, wxALL, 0); +} + + +/////////////////////////////////////////////////////////// +// CampoWizard +/////////////////////////////////////////////////////////// + +class CampoWizard : public wxWizard +{ + enum { m_nPages = 10 }; + CampoWizardPage* m_pPage[m_nPages]; + wxString _destination_path; //path di aggiornamento/installazione + +protected: + int Pages() const { return m_nPages; } + CampoWizardPage* Page(int p) const { return m_pPage[p]; } + +public: + bool Run(); + wxString Get(wxWindowID id) const; + int GetSelection(wxWindowID id) const; + bool GetBool(wxWindowID id) const; + void SetDestinationPath(const wxString& path); + const wxString& GetDestinationPath() const; + + CampoWizard(wxWindow* pParent); +}; + +bool CampoWizard::Run() +{ return RunWizard(Page(0)); } + +wxString CampoWizard::Get(wxWindowID id) const +{ + wxWindow* pWnd = FindWindowById(id); + return pWnd ? pWnd->GetLabel() : wxEmptyString; +} + +int CampoWizard::GetSelection(wxWindowID id) const +{ + int n = -1; + wxWindow* pWnd = FindWindowById(id); + if (pWnd) + { + wxChoice* pList = (wxChoice*)pWnd; + n = pList->GetSelection(); + } + return n; +} + +bool CampoWizard::GetBool(wxWindowID id) const +{ + wxCheckBox* pWnd = (wxCheckBox*)FindWindowById(id); + return pWnd != NULL && pWnd->IsChecked(); +} + +void CampoWizard::SetDestinationPath(const wxString& path) +{ + _destination_path = path; + //Se il path di destinazione e' vuoto -> nuova installazione, senno' e' un aggiornamento della installazione.. + //..che sta in _destination_path + if (_destination_path.IsEmpty()) + { + m_pPage[2]->Chain(m_pPage[1], m_pPage[2]); + } + else + { + m_pPage[2]->Chain(m_pPage[1], m_pPage[9]); + } +} + +const wxString& CampoWizard::GetDestinationPath() const +{ + return _destination_path; +} + +CampoWizard::CampoWizard(wxWindow* pParent) +{ + wxBitmap bitmap; + wxString strName = wxT("logo.gif"); + bitmap.LoadFile(strName, wxBITMAP_TYPE_GIF); + + Create(pParent, wxID_ANY, APPNAME, bitmap); + + m_pPage[0] = new CampoWizardPage1(this); //pagina benvenuto con logo + m_pPage[1] = new CampoWizardPage2(this); //pagina scelta aggiornamento/tipo installazione + m_pPage[2] = new CampoWizardPage3(this); //pagina licenza + m_pPage[3] = new CampoWizardPage4(this); //pagina test ed installazione chiavi + m_pPage[4] = new CampoWizardPage5(this); //pagina.. + m_pPage[5] = new CampoWizardPage6(this); //pagina.. + m_pPage[6] = new CampoWizardPage7(this); //pagina.. + m_pPage[7] = new CampoWizardPage8(this); + m_pPage[8] = new CampoWizardPage9(this); + m_pPage[9] = new CampoWizardPage10(this); + + for (int p = 1; p < m_nPages; p++) + m_pPage[p]->Chain(m_pPage[p-1], m_pPage[p]); + + GetPageAreaSizer()->Add(m_pPage[0]); +} + +/////////////////////////////////////////////////////////// +// RSFrame +/////////////////////////////////////////////////////////// + +class RSFrame : public wxFrame +{ +protected: + DECLARE_EVENT_TABLE(); + virtual void OnErase(wxEraseEvent& e); +public: + RSFrame(); +}; + +BEGIN_EVENT_TABLE(RSFrame, wxFrame) + EVT_ERASE_BACKGROUND(RSFrame::OnErase) +END_EVENT_TABLE() + +void RSFrame::OnErase(wxEraseEvent& e) +{ + //preparazione background + wxDC& dc = *e.GetDC(); + const wxRect rect = GetClientSize(); + wxColour c0 = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); + wxColour c1 = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); + wxColour c2 = wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW); + + wxRect rect1 = rect; rect1.SetBottom(rect.GetBottom() / 2); + dc.GradientFillLinear(rect1, c0, c1, wxSOUTH); + + wxRect rect2 = rect; rect2.SetTop(rect.GetBottom() / 2); + dc.GradientFillLinear(rect2, c1, c2, wxDOWN); + + const int nHeight = rect.GetHeight()/8; + wxFont* pFont = wxTheFontList->FindOrCreateFont(nHeight, wxFONTFAMILY_SWISS, wxFONTSTYLE_ITALIC, + wxFONTWEIGHT_BOLD); + dc.SetFont(*pFont); + dc.SetBackgroundMode(wxTRANSPARENT); + + const int k = nHeight / 16 + 1; + + dc.SetTextForeground(c2); + dc.DrawText(APPNAME, k, k); + dc.SetTextForeground(c1); + dc.DrawText(APPNAME, k/2, k/2); + + int w, h; + const wxString strSetup = wxT("Setup"); + dc.GetTextExtent(strSetup, &w, &h); + + dc.SetTextForeground(c2); + dc.DrawText(strSetup, rect.GetRight()-w-k/2, rect.GetHeight()-h-k/2); + dc.SetTextForeground(c1); + dc.DrawText(strSetup, rect.GetRight()-w-k, rect.GetHeight()-h-k); +} + +RSFrame::RSFrame() + : wxFrame(NULL, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0) +{ + ShowFullScreen(true); +} + +/////////////////////////////////////////////////////////// +// RSSetup +/////////////////////////////////////////////////////////// + +class RSSetup : public wxApp +{ + RSFrame* m_pMainFrame; + wxLocale m_locale; + +protected: + DECLARE_EVENT_TABLE() + void OnTimer(wxTimerEvent& e); + +public: + virtual bool OnInit(); +}; + +IMPLEMENT_APP(RSSetup) + +BEGIN_EVENT_TABLE(RSSetup, wxApp) + EVT_TIMER(883, OnTimer) +END_EVENT_TABLE() + +void RSSetup::OnTimer(wxTimerEvent& WXUNUSED(e)) +{ + CampoWizard* pWizard = new CampoWizard(m_pMainFrame); + if (pWizard->Run()) + { + wxFileName strPath = argv[0]; + strPath.SetCwd(); + + const wxString strSrc = strPath.GetPath(); + const wxString strDest = pWizard->Get(201); + const bool bOpenGL = pWizard->GetSelection(301)==0; + RSDirCopier dc; + dc.Copy(strSrc, strDest, bOpenGL); + + const wxFileName strExe(strDest, wxT("ba0.exe")); + if (pWizard->GetBool(401)) + CreateDesktopIcon(strExe); + //if (pWizard->GetBool(402)) + // AssociateExtension(strExe, wxT(".rs1")); + } + pWizard->Destroy(); + + ::wxMessageBox(wxT("Installazione terminata"), APPNAME, wxOK | wxICON_INFORMATION); + m_pMainFrame->Destroy(); +} + +bool RSSetup::OnInit() +{ + wxInitAllImageHandlers(); + m_locale.Init(); + + m_pMainFrame = new RSFrame; + SetTopWindow(m_pMainFrame); + + wxTimerEvent e(883); + AddPendingEvent(e); + + return true; +} diff --git a/setup/aga_logo.gif b/setup/aga_logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..a3a772a42c14d69e3a6a58387664053b69ce074b GIT binary patch literal 5804 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 literal 0 HcmV?d00001 diff --git a/setup/resource.h b/setup/resource.h new file mode 100755 index 000000000..8bbde0735 --- /dev/null +++ b/setup/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Setup.rc +// +#define IDI_ICON1 101 +#define IDI_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/setup/sirio_logo.gif b/setup/sirio_logo.gif new file mode 100755 index 0000000000000000000000000000000000000000..858c9d5fb9debfd1c3186abd3376caccc4a64df6 GIT binary patch literal 8994 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 literal 0 HcmV?d00001 diff --git a/setup/wxinc.h b/setup/wxinc.h new file mode 100755 index 000000000..3e5966fdd --- /dev/null +++ b/setup/wxinc.h @@ -0,0 +1,25 @@ +// Windows only defines +#ifdef WIN32 + + #define __WXMSW__ + #define __WIN32__ + + // Windows 2000, XP, Server 2003 + #define WINVER 0x0500 + + // Se uso la DLL del runtime C, allora "FORSE" uso anche la DLL di wxWidgets + #ifdef _DLL + #define WXUSINGDLL + #endif + +#endif + +// Common defines +#ifndef NDEBUG +#define __WXDEBUG__ +#endif + +#include + +#define APPNAME wxT("Campo") +#define APPVERSION wxT("4.0") \ No newline at end of file