#include "wxinc.h" #include "key.h" #include "wizard.h" #define HGAP 4 #define VGAP 2 //////////////////////////////////////////////////////////////////////////////////////////// //Campo wizard page (pagina generica del programma, di cui saranno figlie le singole pagine) class CampoWizardPage : public wxWizardPageSimple { wxHtmlWindow* m_pText; protected: CampoWizard& GetWizard() const {return *(CampoWizard*)GetParent();} void SetHTMLText(const wxString strTitle, const wxString strBody); void SetHTMLPage(const wxString strFile); wxString Bold(const wxString strStr) const; void AddLabel(wxSizer* pSizer, const wxChar* label); void AddLabel(wxGridBagSizer* pSizer, const wxChar* label, unsigned int row, unsigned int column); bool CheckDataDir(wxString strDataPath) const; void CheckCustomDir(const wxString strCustomPath, const wxString& strPrgPath, wxArrayString& asPersonalizedFiles) const; bool CheckPrgDir(const wxString& strPrgPath) const; public: virtual bool ForwardValidate() { return true; } wxString Get(wxWindowID id) const; bool GetBool(wxWindowID id) const; bool Set(wxWindowID id, const wxString& str); bool Set(wxWindowID id, bool bOk); 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::GetBool(wxWindowID id) const { wxCheckBox* pWnd = (wxCheckBox*)FindWindowById(id); return pWnd != NULL && pWnd->IsChecked(); } bool CampoWizardPage::Set(wxWindowID id, const wxString& str) { wxWindow* pWnd = FindWindowById(id); if (pWnd) pWnd->SetLabel(str); return (pWnd != NULL); } bool CampoWizardPage::Set(wxWindowID id, const bool bul) { wxCheckBox* pWnd = (wxCheckBox*)FindWindowById(id); if (pWnd) pWnd->SetValue(bul); 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); } //parte html della finestra standard void CampoWizardPage::SetHTMLText(wxString strTitle, wxString strBody) { wxString strAppNameFull = wxT(""); strAppNameFull += Bold(APPNAMEFULL); strAppNameFull += wxT(""); wxString strAppName = APPNAME; strTitle.Replace(wxT("APPNAMEFULL"), strAppNameFull); strBody.Replace(wxT("APPNAMEFULL"), strAppNameFull); 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); } wxString CampoWizardPage::Bold(const wxString strStr) const { wxString strBold; strBold << "" << strStr << ""; return strBold; } //metodo per aggiungere i prompt agli oggetti contenuti nelle GridSize e similia void CampoWizardPage::AddLabel(wxSizer* pSizer, const wxChar* label) { pSizer->Add(new wxStaticText(this, wxID_ANY, label), 0, wxALL|wxALIGN_CENTER_VERTICAL); } void CampoWizardPage::AddLabel(wxGridBagSizer* pSizer, const wxChar* label, unsigned int row, unsigned int column) { pSizer->Add(new wxStaticText(this, wxID_ANY, label), wxGBPosition(row, column)); } //metodo per il controllo della validita' di un'area dati bool CampoWizardPage::CheckDataDir(wxString strDataPath) const { bool bOkData = false; wxDir dirDataPath(strDataPath); //deve esistere non vuota, e contenere la sottodirectory "com" con i dati comuni if (dirDataPath.Exists(strDataPath) && dirDataPath.HasSubDirs("com")) { strDataPath << "/com"; wxFileName fnFileToCheck(strDataPath, "tabcom"); fnFileToCheck.SetExt("dbf"); if (fnFileToCheck.FileExists()) { bOkData = fnFileToCheck.IsFileWritable(); } } return bOkData; } //metodo per il controllo di eventuali personalizzazioni presenti nelle custom e relative ad una versione.. //..antecedente la 209110 (prima versione 10.0) void CampoWizardPage::CheckCustomDir(const wxString strCustomPath, const wxString& strPrgPath, wxArrayString& asPersonalizedFiles) const { //se la directory non c'è ciao ciciuz!! if (!::wxDirExists(strCustomPath)) return; //controlla la directory custom che gli viene passata alla ricerca del file custver.ini che contiene le info.. //..necessarie per sapere se le personalizzazioni sono a posto o meno CampoIniFile ciCustomVer(strCustomPath + "/custver.ini", "Main"); const long lCustomVer = ciCustomVer.GetInt("Versione"); //il dio dei programmatori perdoni il type mismatch! //se le personalizzazioni sono a posto esce felicemente if (lCustomVer >= 209110) return; //se le personalizzazioni non sono a posto (file custver.ini non esiste o è di una vecchia versione)... //riempie la lista delle personalizzazioni da controllare wxArrayString asFileList; const size_t uFiles = wxDir::GetAllFiles(strCustomPath, &asFileList, "*.*"); for (size_t i = 0; i < uFiles; i++) { const wxString strFile = asFileList[i].Lower(); //per prima cosa cerca i files che abbiano un'omonimo tra gli eseguibili: ad es. sono maschere che,.. //..ad aggiornamento concluso,non potrebbero funzionare const wxFileName fnFileCurr(strFile); const wxString strExt = fnFileCurr.GetExt(); wxFileName fnPrgDual = fnFileCurr; fnPrgDual.SetPath(strPrgPath); if (fnPrgDual.FileExists()) { asPersonalizedFiles.Add(strFile); } //poi controlla se c'è un ??rig*.ini/msk è sicuramente una personalizzazione if (strFile.Mid(2,3) == "rig" && (strExt == "ini" || strExt == "msk")) { asPersonalizedFiles.Add(strFile); } //poi controlla che non vi sia un .exe, che potrebbe non funzionare con le nuove .dll if (strExt == "exe") { asPersonalizedFiles.Add(strFile); } } //for(size_t i=0... } //metodo per il controllo della validita' di un'area programmi bool CampoWizardPage::CheckPrgDir(const wxString& strPrgPath) const { bool bOkPrg = false; wxDir dirPrgPath(strPrgPath); //deve esistere non vuota e con sottodirecrory (almeno res e recdesc ci vogliono) if (dirPrgPath.Exists(strPrgPath) && dirPrgPath.HasFiles() && dirPrgPath.HasSubDirs()) { wxFileName fnFileToCheck(strPrgPath, "campo"); fnFileToCheck.SetExt("ini"); if (fnFileToCheck.FileExists()) { fnFileToCheck.SetName("install"); fnFileToCheck.SetExt("ini"); if (fnFileToCheck.FileExists()) { fnFileToCheck.SetName("campo"); fnFileToCheck.SetExt("aut"); if (fnFileToCheck.FileExists()) { fnFileToCheck.SetName("ba0"); fnFileToCheck.SetExt("exe"); if (fnFileToCheck.FileExists()) { bOkPrg = true; } //if(ba0.. } //if(campo.. } //if(install.. } //if(ini... } //if(dirPrgPath.. return bOkPrg; } //costruttore della finestra standard CampoWizardPage::CampoWizardPage(wxWizard* parent) : wxWizardPageSimple(parent) { wxBoxSizer* pSizer = new wxBoxSizer(wxVERTICAL); m_pText = new wxHtmlWindow(this, 100, wxDefaultPosition, wxSize(640, 480)); 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 APPNAMEFULL"); wxString strBody = wxT("

Questo programma vi guiderà passo a passo nell'installazione / aggiornamento del software.

"); strBody += wxT("

LEGGERE ATTENTAMENTE LE ISTRUZIONI che saranno visualizzate nelle finestre di questo programma di installazione!

"); strBody += wxT("

Prima di proseguire con l'installazione / aggiornamento assicurarsi:

"); strBody += wxT("

1) di avere effettuato il login a Windows con un utente di tipo 'Amministratore' di sistema.

"); strBody += wxT("

2) di avere terminato ogni altro programma in funzione

"); strBody += wxT("

In caso di aggiornamento assicurarsi inoltre:

"); strBody += wxT("

3) di avere effettuato un backup di sicurezza dei dati.

"); strBody += wxT("

4) che il programma APPNAMEFULL NON sia in funzione.

"); strBody += wxT("

5) che l'eventuale gestore dei servizi di APPNAMEFULL, se presente, NON sia in funzione.

"); SetHTMLText(strTitle, strBody); } /**********************************************************************************************************/ // 2 Pagina con Accetta / Rifiuta la licenza //*********************************************************************************************************/ class CampoWizardPage2 : public CampoWizardPage { protected: virtual bool ForwardValidate(); public: CampoWizardPage2(wxWizard* parent); }; bool CampoWizardPage2::ForwardValidate() { if (GetSelection(201) == 1) return ErrorBox("Impossibile proseguire se non si accetta la licenza sul software!!"); return true; } CampoWizardPage2::CampoWizardPage2(wxWizard* parent) : CampoWizardPage(parent) { SetHTMLPage("licenza.htm"); //radiobutton Accetta / Rifiuta wxArrayString asAccRef; asAccRef.Add("Accetta"); asAccRef.Add("Rifiuta"); wxRadioBox* radio_box = new wxRadioBox(this, 201, "Selezionare 'Accetta' per proseguire con l'installazione, 'Rifiuta' per terminare l'installazione", wxDefaultPosition, wxDefaultSize, asAccRef, 0, wxRA_SPECIFY_COLS); radio_box->SetSelection(1); GetSizer()->Add(radio_box); } /**********************************************************************************************************/ /* 3 Pagina con la scelta di Aggiornamento / Tipo Installazione */ /**********************************************************************************************************/ class CampoWizardPage3 : public CampoWizardPage { wxRadioBox* m_pRadioBox; protected: virtual bool ForwardValidate(); bool LocalDongleTest() const; public: CampoWizardPage3(wxWizard* parent); }; //metodo per cercare se c'e' una chiave fisicamente collegata (serve per abilitare l'installazione demo) bool CampoWizardPage3::LocalDongleTest() const { unsigned short serno = 0xFFFF; int yearKey = 0; serno = HardlockLogin(yearKey); if (serno == 0xFFFF) serno = EutronLogin(yearKey); return serno != 0xFFFF && yearKey > 0; } bool CampoWizardPage3::ForwardValidate() { const int iLastRow = m_pRadioBox->GetRowCount() - 1; const int iSelectedRow = m_pRadioBox->GetSelection(); wxString strPrgPath; wxString strSrvAuth; wxString strSrvDict; //analizza il campo.ini dell'installazione selezionata (si usa < perche' l'ultima row e' la nuova installazione!) if (iSelectedRow < iLastRow) { strPrgPath = m_pRadioBox->GetStringSelection().BeforeLast('('); strPrgPath.Trim(); CampoIniFile CampoIni(strPrgPath + "/campo.ini", "Main"); //cerca il tipo dell'installazione InstallationType nType = CampoIni.GetInstallationType(); //se risulta un client... if (nType == it_client) { CampoIniFile InstallIni(strPrgPath + "/install.ini", "Main"); wxString strDiskPath = InstallIni.Get("DiskPath"); wxString strMsg = "Per aggiornare questa stazione di lavoro e' necessario aggiornare prima il Server di "; strMsg << APPNAMEFULL << " in " << strDiskPath << " !\n"; strMsg << "Questa stazione di lavoro si aggiornera' automaticamente alla prima esecuzione del programma " << APPNAMEFULL; return ErrorBox(strMsg); } const wxString strStudy = CampoIni.Get("Study"); CampoIniFile CampoServerIni(strPrgPath + "/campo.ini", "Server"); strSrvAuth = CampoServerIni.Get("Dongle"); strSrvDict = CampoServerIni.Get("Dictionary"); //controlla l'area dati e le eventuali custom directory //area dati if (!CheckDataDir(strStudy)) return ErrorBox("La cartella indicata come area dati NON e' valida!\nInterrompere l'installazione e selezionare un'area dati valida\ncon il programma"); //custom directories wxArrayString asPersonalizedFiles; //a) custom di studio CheckCustomDir(strStudy + "custom", strPrgPath, asPersonalizedFiles); //b) custom di ditta wxDir dirStudy(strStudy); wxString strDir; //deve farsi un giro sulle sole directory che abbiano nome lungo 6 caratteri (sono le ditte) for (bool ok = dirStudy.GetFirst(&strDir, wxT("??????"), wxDIR_DIRS); ok; ok = dirStudy.GetNext(&strDir)) { strDir.MakeLower(); if (strDir.EndsWith("a") && atol(strDir) > 0) { CheckCustomDir(strStudy + strDir + "/custom", strPrgPath, asPersonalizedFiles); } } //se ci sono files personalizzati pericolosi avverte l'utente ed interrompe l'aggiornamento!! if (asPersonalizedFiles.GetCount() > 0) { //finestra con la lista dei files personalizzati wxDialog dlgList(NULL, wxID_ANY, wxString("Lista files personalizzati"), wxDefaultPosition); wxBoxSizer* pSizer = new wxBoxSizer(wxVERTICAL); //testo con il fatale annuncio per l'utonto wxStaticText* stText = new wxStaticText (&dlgList, 100, "Sono presenti personalizzazioni create per una " "precedente versione del programma.\nE' necessario richiedere l'intervento dell'assistenza tecnica" ".\nImpossibile proseguire l'aggiornamento! Salvare la lista e ANNULLARE l'aggiornamento"); pSizer->Add(stText, 0, wxALL, 5); //lista dei file pericolosi wxListBox* lbList = new wxListBox(&dlgList, 101, wxDefaultPosition, wxSize(480, 320), asPersonalizedFiles); pSizer->Add(lbList, 0, wxALL, 5); //bottone di conferma wxButton* buOk = new wxButton(&dlgList, wxID_OK, "Salva lista", wxDefaultPosition, wxSize(96,-1)); pSizer->Add(buOk, 0, wxALL|wxALIGN_CENTRE, 5); dlgList.SetSizerAndFit(pSizer); dlgList.Centre(); dlgList.ShowModal(); //finestra per il salvataggio della lista in un file di testo wxFileDialog fdSave(NULL, "Selezionare la cartella dove salvare la lista", wxEmptyString, "listapers.txt", "*.txt", wxFD_SAVE|wxFD_OVERWRITE_PROMPT); if (fdSave.ShowModal() == wxID_OK) { const wxString strFileName = fdSave.GetPath(); wxTextFile tfLista(strFileName); //aggiunge i files della lista al file di testo for (size_t i = 0; i < asPersonalizedFiles.GetCount(); i++) tfLista.AddLine(asPersonalizedFiles[i]); //scrive 'sto benedetto file di testo! tfLista.Write(); } //blocca l'aggiornamento return false; } //se ha superato i severi controlli prosegue GetWizard().SetDataPath(strStudy); if (!strSrvAuth.IsEmpty()) GetWizard().SetSrvAuth(strSrvAuth); if (!strSrvDict.IsEmpty()) GetWizard().SetSrvDict(strSrvDict); //setta alla pagina riassuntiva i valori della pagina attuale... GetWizard().SetDestinationPath(strPrgPath); //va alla pagina riassuntiva GetWizard().SetPrgLocPath(strPrgPath); //questo serve solo per la creazione del link sul desktop! GetWizard().SetInstallationType(it_upgrade); //e' un aggiornamento!! GetWizard().SetDesktopShortcut(false); //e' sempre un aggiornamento! } else //resetta il path in caso si scelga nuova installazione dopo aver scelto aggiornamento { //continuiamo a sconsigliare l'installazione DEMO, ma ognuno fa come crede... if (GetBool(302)) { const wxString strPrgDemoPath = "c:/campodemo"; wxDir dirPrgDemoPath(strPrgDemoPath); if (dirPrgDemoPath.Exists(strPrgDemoPath) && (dirPrgDemoPath.HasFiles() || dirPrgDemoPath.HasSubDirs())) return ErrorBox("Impossibile installare la versione DEMO!\nLa cartella c:/campodemo NON e' vuota!"); GetWizard().SetInstDemoVersion(true); } //questo lo fa in ogni caso! GetWizard().SetDestinationPath(""); GetWizard().SetDesktopShortcut(true); } return true; } CampoWizardPage3::CampoWizardPage3(wxWizard* parent) : CampoWizardPage(parent) { //deve cercare campo.stp CampoIniFile iniCampoStp("C:\\campo.stp", ""); wxString strGroup; long nIndex; const wxString strProgram = "Program"; wxArrayString asGroups, asCampi; //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 (asCampi) da cui genera un radiobutton di scelte for (bool ok = iniCampoStp.GetFirstGroup(strGroup, nIndex); ok; ok = iniCampoStp.GetNextGroup(strGroup, nIndex)) { asGroups.Add(strGroup); } int prechecked = -1; for (int i = 0; i < (int)asGroups.GetCount(); i++) { CampoIniFile iniCampoStp("C:\\campo.stp", asGroups[i]); wxString strPath = iniCampoStp.Get(strProgram); //sono installazioni valide quelle che passano il vaglio della CheckPrgdir, metodo che testa l'integrita'.. //..di una cartella programmi di campo if (CheckPrgDir(strPath)) { //controlla il tipo di installazione rilevata (Standalone,Server,Client) CampoIniFile iniCampo(strPath + "/campo.ini", "Main"); const InstallationType nType = iniCampo.GetInstallationType(); switch (nType) { case it_server: strPath << " (Server)"; break; case it_client: strPath << " (Client)"; break; default: strPath << " (Standard)"; break; } asCampi.Add(strPath); //prechecca l'eventuale installazione server o standalone se ci sono piu' installazioni.. //..sulla stessa macchina if (prechecked < 0) { if (nType == it_standalone || nType == it_server) prechecked = i; } } //if(CheckPrgDir(strPath)... else //se una installazione su campo.stp non e' buona cancella la voce da campo.stp stesso.. //..per non fare casini in futuro { wxString strGroup = "/"; strGroup += asGroups[i]; iniCampoStp.DeleteGroup(strGroup); } } //for(unsigned int i=0... wxString strTitle, strBody; //se non ci sono delle installazioni da aggiornare propone solo installazioni.. if (asCampi.IsEmpty()) { strTitle += wxT("Scelta Installazione"); strBody += wxT("

E' possibile INSTALLARE APPNAMEFULL in un nuovo direttorio.

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

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

"); strBody += wxT("

Selezionare l'opzione desiderata nel riquadro sottostante. In caso di piu' di una installazione presente sul computer "); strBody += wxT("sara' preselezionata la eventuale installazione di tipo Server o Standard, in quanto deve essere aggiornata per prima! "); strBody += wxT("

In questo caso procedere all'aggiornamento di tale installazione Server e aggiornare successivamente le postazioni client "); strBody += wxT("lanciando il programma APPNAMEFULL su di esse

"); //radiobutton con le scelte aggiornamento asCampi.Add("Nuova installazione"); m_pRadioBox = new wxRadioBox(this, 301, "Selezionare l'installazione da aggiornare (consigliato) o Nuova installazione", wxDefaultPosition, wxDefaultSize, asCampi, 0, wxRA_SPECIFY_ROWS); if (prechecked >= 0) m_pRadioBox->SetSelection(prechecked); } GetSizer()->Add(m_pRadioBox); //se NON ci sono installazioni gia' presenti e NON c'e' alcuna chiave collegata -> puo' installare la DEMO if (asCampi.GetCount() == 1 && !LocalDongleTest()) { //checkbox per installare la DEMO (non fatelo, vi prego!!!) wxCheckBox* chDemoPrg = new wxCheckBox(this, 302, wxT("Installare la versione DEMO")); chDemoPrg->SetValue(false); GetSizer()->AddSpacer(16); GetSizer()->Add(chDemoPrg); strBody += wxT("

E' possibile anche installare la versione DEMO di APPNAMEFULL. Questa versione e' a scopo puramente "); strBody += wxT("dimostrativo e NON va di norma installata! Non e' utilizzabile come la versione normale in quanto limitata nel "); strBody += wxT("numero e nella data delle registrazioni e nel tempo di uso giornaliero (max 2 ore). La cartella di installazione della "); strBody += wxT("versione dimostrativa e' C:/campodemo e dispone di un'area dati parzialmente precompilata.

"); } SetHTMLText(strTitle, strBody); } /**********************************************************************************************************/ /* 4 Pagina con la gestione della chiave di protezione */ /**********************************************************************************************************/ class CampoWizardPage4 : public CampoWizardPage { protected: DECLARE_EVENT_TABLE(); void OnHLPick(wxCommandEvent& e); void OnEUPick(wxCommandEvent& e); void OnSRPick(wxCommandEvent& e); virtual bool ForwardValidate(); virtual bool TransferDataToWindow(); wxString DecodeString(const wxString& data); int VersionYear(); void BuildKey(char* key); public: int DongleTest(); 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) EVT_BUTTON(403, OnSRPick) 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); } void CampoWizardPage4::OnSRPick(wxCommandEvent& e) { static bool bSemaforo = false; if (!bSemaforo) { bSemaforo = true; wxBusyCursor hourglass; wxString strSrvName; int year = 0; unsigned short serno = ServerLogin(year, strSrvName); if (!strSrvName.IsEmpty()) Set(404, strSrvName); bSemaforo = false; } } bool CampoWizardPage4::ForwardValidate() { //per poter proseguire deve aver trovato una chiave o un server! GetWizard().SetSrvAuth(Get(404)); int nDongleType = DongleTest(); if (nDongleType == 0) return ErrorBox("Per proseguire e' NECESSARIO installare una chiave locale o collegarsi ad una chiave di rete!"); return true; } bool CampoWizardPage4::TransferDataToWindow() { FindWindowById(401)->Disable(); FindWindowById(402)->Disable(); FindWindowById(403)->Disable(); FindWindowById(404)->Disable(); //controlla preventivamente se la chiave c'e' ed eventualmente quale e' (hardlock,eutron,server di chiavi) const int nDongleType = DongleTest(); GetWizard().SetDongleType(nDongleType); 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 (nDongleType) { case 1: strBody += wxT("

E' stata rilevata una chiave tipo Hardlock:

"); strBody += wxT("

"); strBody += wxT("

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

"); 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 APPNAMEFULL. Premere il pulsante \"Avanti\".

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

E' stato rilevata una chiave remota condivisa in rete con il servizio di gestione autorizzazioni:

"); strBody += wxT("

"); strBody += wxT("

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

"); Set(404, GetWizard().GetSrvAuth()); break; default: strBody += wxT("

Non e' stata rilevata alcuna chiave hardware installata sul computer!

"); strBody += wxT("

Per procedere all'installazione della chiave hardware, collegarla al computer e premere il bottone corrispondente alla tipologia della chiave stessa per installarne i driver.

"); strBody += wxT("

Se si utilizza una chiave remota collegata ad un altro computer e condivisa in rete attraverso il servizio gestione di autorizzazioni "); strBody += wxT("premere il bottone Cerca per attivare la ricerca automatica della chiave remota. Qualora tale ricerca fallisse digitare il nome del computer "); strBody += wxT("(o l'indirizzo IP) cui e' collegata la chiave di rete e su cui e' installato e attivo il gestore di autorizzazioni. "); FindWindowById(401)->Enable(); FindWindowById(402)->Enable(); FindWindowById(403)->Enable(); FindWindowById(404)->Enable(); break; } SetHTMLText(strTitle, strBody); return true; } void CampoWizardPage4::BuildKey(char* key) { for (int i = 0; i < 8; i++) key[i] = 'A'+ rand()%26; } 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), "../install.ini"); ver[4] = '\0'; return atoi(ver); } int CampoWizardPage4::DongleTest() { int dongle_type = 0; int yearKey = 0; unsigned int serno = 0xFFFF; wxString strSrvName = GetWizard().GetSrvAuth(); //nome del server di autorizzazioni (se c'e') if (!strSrvName.IsEmpty()) { serno = ServerLogin(yearKey, strSrvName); if (serno != 0xFFFF) dongle_type = 3; //chiave remota } if (serno == 0xFFFF) { serno = HardlockLogin(yearKey); if (serno == 0xFFFF) { serno = EutronLogin(yearKey); if (serno != 0xFFFF) dongle_type = 2; //chiave eutron } else dongle_type = 1; //chiave hardlock } return dongle_type; } CampoWizardPage4::CampoWizardPage4(wxWizard* parent) : CampoWizardPage(parent) { //procedura per la costruzione dei bottoni e delle immagini per l'installazione dei driver di chiave //"griglia" contenitrice degli oggetti //griglia per sistemare i campi wxGridBagSizer* gbsButtSizer = new wxGridBagSizer(VGAP, HGAP); GetSizer()->Add(gbsButtSizer); //prima riga della griglia //Hardlock label AddLabel(gbsButtSizer, "Installa chiave locale di tipo Hardlock", 0, 0); //Hardlock image wxBitmap bmp_HL("../../campo/servers/hardlock.gif", wxBITMAP_TYPE_GIF); wxStaticBitmap* s_bmp_HL = new wxStaticBitmap(this, wxID_ANY, bmp_HL); gbsButtSizer->Add(s_bmp_HL, wxGBPosition(0, 1)); //bottone Hardlock wxButton* bHlButton = new wxButton(this, 401, wxT("Hardlock"), wxDefaultPosition, wxSize(64, -1)); gbsButtSizer->Add(bHlButton, wxGBPosition(0, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); //seconda riga della griglia //Eutron label AddLabel(gbsButtSizer, "Installa chiave locale di tipo Eutron", 1, 0); //Eutron image wxBitmap bmp_EU("../../campo/servers/eutron.gif", wxBITMAP_TYPE_GIF); wxStaticBitmap* s_bmp_EU = new wxStaticBitmap(this, wxID_ANY, bmp_EU); gbsButtSizer->Add(s_bmp_EU, wxGBPosition(1, 1)); //bottone Eutron wxButton* bEuButton = new wxButton(this, 402, wxT("Eutron"), wxDefaultPosition, wxSize(64, -1)); gbsButtSizer->Add(bEuButton, wxGBPosition(1, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); //terza riga della griglia //Server label AddLabel(gbsButtSizer, "Nome o indirizzo IP del server di autorizzazioni", 2, 0); //nome Server wxTextCtrl* tcSrvName = new wxTextCtrl(this, 404, "", wxDefaultPosition, wxSize(128,-1)); gbsButtSizer->Add(tcSrvName, wxGBPosition(2, 1)); //bottone Eutron wxButton* bSrvButton = new wxButton(this, 403, wxT("Cerca"), wxDefaultPosition, wxSize(64, -1)); gbsButtSizer->Add(bSrvButton, wxGBPosition(2, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); } /**********************************************************************************************************/ // 5 Scelta tipo installazione /**********************************************************************************************************/ class CampoWizardPage5 : public CampoWizardPage { wxRadioBox* m_pRadioBox; protected: virtual bool ForwardValidate(); public: CampoWizardPage5(wxWizard* parent); }; bool CampoWizardPage5::ForwardValidate() { // controlla il tipo di installazione! InstallationType nType = it_standalone; const int nSessionId = GetSessionId(); //nessun SessionId -> installazione comune -> selection dal radiobutton if (nSessionId == 0) nType = InstallationType(m_pRadioBox->GetSelection() + 1); else //SessionId != 0 -> Terminal Server -> installazione di tipo Server obbligata!!! nType = it_server; GetWizard().SetInstallationType(nType); return true; } CampoWizardPage5::CampoWizardPage5(wxWizard* parent) : CampoWizardPage(parent) { //chiede al sistema se e' in modalita' termserv (win2003/2008srv) const int nSessionId = GetSessionId(); //Istruzioni per l'uso! wxString strTitle = wxT("Scelta del tipo di installazione"); wxString strBody; if (nSessionId == 0) { strBody = wxT("

Standard (scelta consigliata). Installazione su postazione singola, con programmi e dati sul disco locale del computer

"); strBody += wxT("

Installazioni di rete (per utenti esperti)

"); strBody += wxT("

Server: Computer in rete sul quale sono presenti una copia, utilizzata o meno, dei programmi (server programmi) e l’area dati (server dati). "); strBody += wxT("In una installazione in rete di APPNAMEFULL e' necessario sia presente un unica postazione di tipo server, "); strBody += wxT("e deve essere installata per prima!

"); strBody += wxT("

Client: Computer in rete sul quale e' presente una copia dei programmi ma non l'area dati. "); strBody += wxT("I client possono essere installati solo dopo l'installazione del server!

"); } else { strBody += wxT("

Terminal Server: Computer con sistema operativo tipo Windows 2003/2008 Server. "); strBody += wxT("L'installazione e' unica e viene utilizzata dagli utenti di sistema quando aprono una sessione sul server.

"); strBody += wxT("

Selezionando configurazione Terminal Server e' necessario installare il gestore delle autorizzazioni per "); strBody += wxT("poter gestire l'accesso contemporaneo di piu' utenti.

"); } SetHTMLText(strTitle, strBody); //radiobutton con i tipi di installazione wxArrayString asInstType; if (nSessionId == 0) { asInstType.Add("Standard"); asInstType.Add("Server"); asInstType.Add("Client"); } else asInstType.Add("Terminal Server"); m_pRadioBox = new wxRadioBox(this, 501, "Selezionare il tipo di installazione", wxDefaultPosition, wxDefaultSize, asInstType, 0, wxRA_SPECIFY_ROWS); //setta il default a Standard m_pRadioBox->SetSelection(0); GetSizer()->Add(m_pRadioBox); } /**********************************************************************************************************/ // 6 Installazione standard /**********************************************************************************************************/ class CampoWizardPage6 : public CampoWizardPage { protected: DECLARE_EVENT_TABLE(); void OnDirPick(wxCommandEvent& e); virtual bool ForwardValidate(); public: CampoWizardPage6(wxWizard* parent); }; BEGIN_EVENT_TABLE(CampoWizardPage6, CampoWizardPage) EVT_BUTTON(602, OnDirPick) EVT_BUTTON(604, OnDirPick) END_EVENT_TABLE() void CampoWizardPage6::OnDirPick(wxCommandEvent& e) { const wxWindowID wiTargetField = e.GetId() - 1; wxString strPath = Get(wiTargetField); wxDirDialog dlg(this, wxDirSelectorPromptStr, strPath, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST); if (dlg.ShowModal() == wxID_OK) { strPath = dlg.GetPath(); Set(wiTargetField, strPath); } } //metodo per il controllo dell'area dati;se la directory indicata non e' vuota non puoi usarla ne' crearla bool CampoWizardPage6::ForwardValidate() { //controllo esistenza directory vuota per i programmi in locale const wxString strPrgLocPath = Get(601); wxDir dirPrgLocPath(strPrgLocPath); if (dirPrgLocPath.Exists(Get(601)) && (dirPrgLocPath.HasFiles() || dirPrgLocPath.HasSubDirs())) return ErrorBox("La cartella selezionata per l'installazione dei programmi NON e' valida! Selezionarne un'altra!"); const wxString strDataPath = Get(603); wxDir dirDataPath(strDataPath); if (dirDataPath.Exists(strDataPath) && (dirDataPath.HasFiles() || dirDataPath.HasSubDirs())) return ErrorBox("La cartella indicata per la creazione dell'area dati non e' vuota! Selezionarne un'altra!"); //setta alla pagina riassuntiva i valori della pagina attuale... GetWizard().SetPrgLocPath(strPrgLocPath); GetWizard().SetDataPath(strDataPath); //...e pure quegli stupidi datidemo che nessuno ha mai installato!! const bool bInstDemoData = GetBool(605); GetWizard().SetInstDemoData(bInstDemoData); return true; } CampoWizardPage6::CampoWizardPage6(wxWizard* parent) : CampoWizardPage(parent) { wxString strTitle = wxT("Installazione di tipo Standard"); wxString strBody = wxT("

Digitare nel campo 'Cartella programma' il percorso completo della cartella dove si desidera installare il programma. "); strBody += wxT("Il percorso di default (consigliato) e' C:\\APPNAME

"); strBody += wxT("

Digitare nel campo 'Cartella Dati' il percorso completo della cartella dove si desidera installare l'area dati. "); strBody += wxT("Il percorso di default (consigliato) e' C:\\APPNAME\\dati

"); /*strBody += wxT("

Dati dimostrativi: area dati precompilata per installazioni di tipo dimostrativo del funzionamento del software. "); strBody += wxT("NON vanno caricati nel caso di una normale installazione!

");*/ SetHTMLText(strTitle, strBody); //griglia per sistemare i campi wxGridBagSizer* gbsSizer = new wxGridBagSizer(VGAP, HGAP); GetSizer()->Add(gbsSizer); //prima riga della griglia //prompt AddLabel(gbsSizer, "Cartella programmi", 0, 0); //campo testo wxString strPath; strPath = "C:\\"; strPath += APPNAME; wxTextCtrl* tcPrgPath = new wxTextCtrl(this, 601, strPath, wxDefaultPosition, wxSize(320,-1)); gbsSizer->Add(tcPrgPath, wxGBPosition(0, 1)); //bottone 'sfoglia' wxButton* bPrgButton = new wxButton(this, 602, wxT("Sfoglia"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bPrgButton, wxGBPosition(0, 2)); //seconda riga della griglia //prompt AddLabel(gbsSizer, "Cartella dati", 1, 0); //campo testo strPath += "/dati"; wxTextCtrl* tcDataPath = new wxTextCtrl(this, 603, strPath, wxDefaultPosition, wxSize(320,-1)); gbsSizer->Add(tcDataPath, wxGBPosition(1, 1)); //bottone 'sfoglia' wxButton* bDataButton = new wxButton(this, 604, wxT("Sfoglia"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bDataButton, wxGBPosition(1, 2)); //terza riga della griglia ***per ora i datidemo li installiamo solo con la demo (anzi,per sempre) /* wxCheckBox* chDataDemo = new wxCheckBox(this, 605, wxT("Carica i dati dimostrativi")); chDataDemo->SetValue(false); gbsSizer->Add(chDataDemo, wxGBPosition(2, 1));*/ } /**********************************************************************************************************/ // 7 Installazione server /**********************************************************************************************************/ class CampoWizardPage7 : public CampoWizardPage { wxRadioBox* m_pRadioBox; protected: DECLARE_EVENT_TABLE(); virtual bool ForwardValidate(); void OnDirPick(wxCommandEvent& e); void OnSrvClick(wxCommandEvent& e); public: CampoWizardPage7(wxWizard* parent); }; BEGIN_EVENT_TABLE(CampoWizardPage7, CampoWizardPage) EVT_BUTTON(702, OnDirPick) EVT_BUTTON(704, OnDirPick) EVT_CHECKBOX(705, OnSrvClick) EVT_CHECKBOX(707, OnSrvClick) END_EVENT_TABLE() void CampoWizardPage7::OnDirPick(wxCommandEvent& e) { const wxWindowID wiTargetField = e.GetId() - 1; wxString strPath = Get(wiTargetField); wxDirDialog dlg(this, wxDirSelectorPromptStr, strPath, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST); if (dlg.ShowModal() == wxID_OK) { strPath = dlg.GetPath(); Set(wiTargetField, strPath); } } void CampoWizardPage7::OnSrvClick(wxCommandEvent& e) { //nome del server wxWindow* pWnd = FindWindowById(e.GetId() + 1); if (pWnd) pWnd->Enable(e.IsChecked()); //tipo installazione server pWnd = FindWindowById(709); if (pWnd) pWnd->Enable(GetBool(705) || GetBool(707)); } bool CampoWizardPage7::ForwardValidate() { //controllo esistenza directory vuota per i programmi in locale const wxString strPrgLocPath = Get(701); wxDir dirPrgLocPath(strPrgLocPath); if (dirPrgLocPath.Exists(strPrgLocPath) && (dirPrgLocPath.HasFiles() || dirPrgLocPath.HasSubDirs())) return ErrorBox("La cartella selezionata per l'installazione dei programmi NON e' valida! Selezionarne un'altra!"); //controllo della directory dell'area dati: deve essere nuova o vuota affinche' possa essere utilizzata!! const wxString strDataPath = Get(703); wxDir dirDataPath(strDataPath); if (dirDataPath.Exists(strDataPath) && (dirDataPath.HasFiles() || dirDataPath.HasSubDirs())) return ErrorBox("La cartella indicata per la creazione dell'area dati non e' vuota! Selezionarne un'altra!"); //setta alla pagina riassuntiva i valori della pagina attuale... GetWizard().SetPrgLocPath(strPrgLocPath); GetWizard().SetDataPath(strDataPath); //...compresi eventuali stupidi servers! const bool bInstAuth = GetBool(705); if (bInstAuth) { GetWizard().SetInstUseAuth(bInstAuth); const wxString strSrvAuth = Get(706); if (strSrvAuth.IsEmpty()) return ErrorBox("Specificare il server gestore delle autorizzazioni!"); GetWizard().SetSrvAuth(strSrvAuth); } else GetWizard().SetSrvAuth(""); const bool bInstDict = GetBool(707); if (bInstDict) { GetWizard().SetInstUseDict(bInstDict); const wxString strSrvDict = Get(708); if (strSrvDict.IsEmpty()) return ErrorBox("Specificare il server gestore dei dizionari!"); GetWizard().SetSrvDict(strSrvDict); } else GetWizard().SetSrvDict(""); //..e loro modalita' di esecuzione if (bInstAuth || bInstDict) { int nType = m_pRadioBox->GetSelection() + 1; //+1 perchè 0 corrisponde a lm_none GetWizard().SetSrvAutostartMode((LurchMode)nType); } else GetWizard().SetSrvAutostartMode(lm_none); return true; } CampoWizardPage7::CampoWizardPage7(wxWizard* parent) : CampoWizardPage(parent) { const int nSessionId = GetSessionId(); wxString strTitle; wxString strBody; if (nSessionId == 0) { strTitle = wxT("Installazione di tipo Server"); strBody = wxT("

Digitare nel campo 'Cartella programma' il percorso completo della cartella dove si desidera installare il programma. "); strBody += wxT("Il percorso consigliato e' C:\\APPNAME

"); strBody += wxT("

Digitare nel campo 'Cartella dati' il percorso completo della cartella dove si desidera installare l'area dati. "); strBody += wxT("Il percorso consigliato e' C:\\APPNAME\\dati

"); strBody += wxT("

Le cartelle del programma e dei dati dovranno essere condivise in modalita' lettura/scrittura agli utenti di sistema e di rete che utilizzeranno il software APPNAMEFULL. "); strBody += wxT("In mancanza di tale condivisione nessun client potra' accedere al server!

"); strBody += wxT("

Gestore autorizzazioni: e' il software che permette di gestire una chiave di protezione hardware multiutenza condivisa in rete. "); strBody += wxT("Installando tale software e' necessario specificare il computer su cui e' montata la chiave di protezione multiutenza."); strBody += wxT("Viene di default proposto il computer su cui si sta eseguendo l'installazione di APPNAMEFULL (localhost).

"); strBody += wxT("

Gestore dizionari: e' il software che permette di utilizzare APPNAMEFULL in lingue diverse dall'italiano. "); strBody += wxT("Per l'installazione di questo software viene di default proposto il computer su cui si sta eseguendo l'installazione di APPNAMEFULL (localhost).

"); strBody += wxT("

Modalita' di esecuzione programmi di gestione
"); strBody += wxT("Come servizi: i programmi di gestione vengono eseguiti come servizi di Windows; questa e' la modalita' consigliata ed e' obbligatoria in caso di installazione con Windows 2003/2008
"); strBody += wxT("Nel menu esecuzione automatica: i programmi di gestione vengono eseguiti automaticamente al primo accesso di un utente al server di APPNAMEFULL; usare questa modalita' solo nell'impossibilita' di utilizzare la precedente

"); } else { strTitle = wxT("Installazione di tipo Terminal Server"); strBody = wxT("

Digitare nel campo 'Cartella programma' il percorso completo della cartella dove si desidera installare il programma. "); strBody += wxT("Il percorso consigliato e' C:\\APPNAME

"); strBody += wxT("

Digitare nel campo 'Cartella dati' il percorso completo della cartella dove si desidera installare l'area dati. "); strBody += wxT("Il percorso consigliato e' C:\\APPNAME\\dati

"); strBody += wxT("

Le cartelle del programma e dei dati dovranno essere accessibili in modalita' lettura/scrittura agli utenti di sistema e di rete che utilizzeranno il software APPNAMEFULL. "); strBody += wxT("In mancanza di tale modalita' nessun utente potra' utilizzare il software APPNAMEFULL !

"); strBody += wxT("

Gestore autorizzazioni: e' il software che permette di gestire una chiave di protezione hardware multiutenza condivisa in rete. "); strBody += wxT("E' necessario installare questo software specificando localhost come computer su cui e' montata la chiave di protezione multiutenza.

"); strBody += wxT("

Gestore dizionari: e' il software che permette di utilizzare APPNAMEFULL in lingue diverse dall'italiano. "); strBody += wxT("E' necessario installare questo software specificando localhost come computer su cui installare il servizio.

"); strBody += wxT("

Modalita' di esecuzione programmi di gestione: obbligatorio come servizi!
"); } SetHTMLText(strTitle, strBody); //griglia per sistemare i campi wxGridBagSizer* gbsSizer = new wxGridBagSizer(VGAP, HGAP); GetSizer()->Add(gbsSizer); //prima riga della griglia //prompt AddLabel(gbsSizer, "Cartella programmi", 0, 0); //campo testo wxString strPath; strPath = "C:\\"; strPath += APPNAME; wxTextCtrl* tcPrgPath = new wxTextCtrl(this, 701, strPath, wxDefaultPosition, wxSize(320,-1)); gbsSizer->Add(tcPrgPath, wxGBPosition(0, 1)); //bottone 'sfoglia' wxButton* bPrgButton = new wxButton(this, 702, wxT("Sfoglia"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bPrgButton, wxGBPosition(0, 2)); //seconda riga della griglia //prompt AddLabel(gbsSizer, "Cartella dati", 1, 0); //campo testo strPath += "/dati"; wxTextCtrl* tcDataPath = new wxTextCtrl(this, 703, strPath, wxDefaultPosition, wxSize(320,-1)); gbsSizer->Add(tcDataPath, wxGBPosition(1, 1)); //bottone 'sfoglia' wxButton* bDataButton = new wxButton(this, 704, wxT("Sfoglia"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bDataButton, wxGBPosition(1, 2)); //terza riga della griglia //check installa authoriz wxCheckBox* chAuthoriz = new wxCheckBox(this, 705, wxT("Installa il gestore delle autorizzazioni")); //e' obbligatorio installare authoriz in caso di terminal server! if (nSessionId == 0) chAuthoriz->SetValue(false); else chAuthoriz->SetValue(true); gbsSizer->Add(chAuthoriz, wxGBPosition(2, 1)); //server authoriz wxTextCtrl* tcAuthoriz = new wxTextCtrl(this, 706, "localhost", wxDefaultPosition, wxSize(96,-1)); tcAuthoriz->Disable(); gbsSizer->Add(tcAuthoriz, wxGBPosition(2, 2)); //quarta riga della griglia //check installa diction wxCheckBox* chDictionary = new wxCheckBox(this, 707, wxT("Installa il gestore dei dizionari")); chDictionary->SetValue(false); gbsSizer->Add(chDictionary, wxGBPosition(3, 1)); //server diction wxTextCtrl* tcDiction = new wxTextCtrl(this, 708, "localhost", wxDefaultPosition, wxSize(96,-1)); tcDiction->Disable(); gbsSizer->Add(tcDiction, wxGBPosition(3, 2)); //quinta riga della griglia //radiobutton con i tipi di installazione wxArrayString asInstType; if (nSessionId == 0) { asInstType.Add("Come servizi (consigliato)"); asInstType.Add("Nel menu esecuzione automatica"); } else asInstType.Add("Come servizi (obbligatorio)"); m_pRadioBox = new wxRadioBox(this, 709, "Modalita' di esecuzione gestori", wxDefaultPosition, wxDefaultSize, asInstType, 0, wxRA_SPECIFY_COLS); //setta il default a "come servizio" m_pRadioBox->SetSelection(0); m_pRadioBox->Disable(); gbsSizer->Add(m_pRadioBox, wxGBPosition(4, 1)); } /**********************************************************************************************************/ // 8 Installazione client /**********************************************************************************************************/ class CampoWizardPage8 : public CampoWizardPage { protected: DECLARE_EVENT_TABLE(); virtual bool ForwardValidate(); virtual bool TransferDataToWindow(); void OnDirPick(wxCommandEvent& e); void OnSrvClick(wxCommandEvent& e); public: CampoWizardPage8(wxWizard* parent); }; BEGIN_EVENT_TABLE(CampoWizardPage8, CampoWizardPage) EVT_BUTTON(802, OnDirPick) EVT_BUTTON(804, OnDirPick) EVT_BUTTON(806, OnDirPick) EVT_CHECKBOX(807, OnSrvClick) END_EVENT_TABLE() void CampoWizardPage8::OnDirPick(wxCommandEvent& e) { const wxWindowID wiTargetField = e.GetId() - 1; wxString strPath = Get(wiTargetField); wxDirDialog dlg(this, wxDirSelectorPromptStr, strPath, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST); if (dlg.ShowModal() == wxID_OK) { strPath = dlg.GetPath(); Set(wiTargetField, strPath); } } void CampoWizardPage8::OnSrvClick(wxCommandEvent& e) { wxWindow* pWnd = FindWindowById(e.GetId() + 1); if (pWnd) pWnd->Enable(e.IsChecked()); } bool CampoWizardPage8::TransferDataToWindow() { bool bNoPrg = Get(803).IsEmpty(); bool bNoData = Get(805).IsEmpty(); if (bNoPrg || bNoData) { //cerca le unita' condivise in rete wxArrayString asList; const size_t nShared = ListNetworkDisks(asList); //se ne trova controlla se sono valide come directory di programmi e dati for (size_t i = 0; i < nShared; i++) { wxString strWrk = asList[i]; if (!wxEndsWithPathSeparator(strWrk)) strWrk << wxFILE_SEP_PATH; UINT nDriveType = GetDriveType(strWrk); if (nDriveType == DRIVE_REMOTE) { if (bNoPrg && CheckPrgDir(strWrk)) { bNoPrg = false; Set(803, strWrk); } if (bNoData && CheckDataDir(strWrk)) { bNoData = false; Set(805, strWrk); } } } //for(size_t... } //if(noPrg... return true; } bool CampoWizardPage8::ForwardValidate() { //controlli su directory selezionate //1) directory di installazione programmi const wxString strPrgLocPath = Get(801); //la directory di installazione programmi deve essere su un disco locale (sei un client!) UINT nPrgDriveType = ::GetDriveType(strPrgLocPath.Left(3)); if (nPrgDriveType != DRIVE_FIXED) return ErrorBox("La cartella selezionata per l'installazione dei programmi deve trovarsi su un disco locale!"); //controllo esistenza directory vuota per i programmi in locale wxDir dirPrgLocPath(strPrgLocPath); if (dirPrgLocPath.Exists(strPrgLocPath) && (dirPrgLocPath.HasFiles() || dirPrgLocPath.HasSubDirs())) return ErrorBox("La cartella selezionata per l'installazione dei programmi NON e' valida! Selezionarne un'altra!"); //2) directory di origine dei programmi sul server const wxString strPrgNetPath = Get(803); //il server non puo' essere un cd o roba simile UINT nPrgNetDriveType = ::GetDriveType(strPrgNetPath.Left(3)); if (nPrgNetDriveType != DRIVE_REMOTE) return ErrorBox("Il server deve essere su un disco di rete!"); //il server deve contenere i programmi di Campo giaà installati correttamente if (!CheckPrgDir(strPrgNetPath)) return ErrorBox("La cartella selezionata come origine dei programmi NON e' valida!"); //3) directory dati sul server const wxString strDataPath = Get(805); //la cartella dei dati deve essere in remoto,senno' sei una postazione locale o un server UINT nDataDriveType = ::GetDriveType(strDataPath.Left(3)); if (nDataDriveType != DRIVE_REMOTE) return ErrorBox("La cartella dei dati deve trovarsi su un server remoto e non su un disco locale!"); //la cartella dei dati deve contenerli ed essere scrivibile if (!CheckDataDir(strDataPath)) return ErrorBox("La cartella selezionata come area dati NON e' valida o non accessibile in scrittura!"); //setta alla pagina riassuntiva i valori della pagina attuale GetWizard().SetPrgLocPath(strPrgLocPath); GetWizard().SetPrgNetPath(strPrgNetPath); GetWizard().SetDataPath(strDataPath); //...compresi eventuali stupidi servers! const wxString strSrvDict = Get(807); //se c'e' un nome di dictionary server e non lo trova si incazza if (!strSrvDict.IsEmpty() && !DictionaryLogin(strSrvDict)) { wxString strMsg; strMsg << "Impossibile contattare il server " << strSrvDict << " per la gestione dei dizionari!"; return ErrorBox(strMsg); } else GetWizard().SetSrvDict(strSrvDict); return true; } CampoWizardPage8::CampoWizardPage8(wxWizard* parent) : CampoWizardPage(parent) { wxString strTitle = wxT("Installazione di tipo Client"); wxString strBody = wxT("

Digitare nel campo 'Cartella locale programma' il percorso completo della cartella dove si desidera installare il programma. "); strBody += wxT("Il percorso consigliato e' C:\\APPNAME

"); strBody += wxT("

Il campo 'Cartella remota origine programmi' contiene il percorso completo della cartella di rete dove sono i files origine del programma. "); strBody += wxT("E' la cartella di programmi condivisa dal server precedentemente installato. Se condivisa e connessa correttamente viene rilevata automaticamente e proposta dal programma. "); strBody += wxT("Se non viene proposta automaticamente, digitare il percorso completo (es. Z:\\APPNAME)

"); strBody += wxT("

Il campo 'Cartella remota dati da utilizzare' contiene il percorso completo della cartella di rete dove sono i dati. "); strBody += wxT("E' la cartella dei dati condivisa dal server precedentemente installato. Se condivisa e connessa correttamente viene rilevata automaticamente e proposta dal programma. "); strBody += wxT("Se non viene proposta automaticamente, digitare il percorso completo (es. Z:\\APPNAME\\Dati)

"); strBody += wxT("

Gestore dizionari: e' il computer gestore dei dizionari di APPNAMEFULL in lingue diverse dall'italiano. Generalmente e' il computer agente da server di APPNAMEFULL in rete. "); strBody += wxT("Premere il bottone Cerca per attivare la ricerca automatica di tale computer. Qualora tale ricerca fallisse digitare il nome del computer gestore dei dizionari

"); SetHTMLText(strTitle, strBody); //griglia per sistemare i campi wxGridBagSizer* gbsSizer = new wxGridBagSizer(VGAP, HGAP); GetSizer()->Add(gbsSizer); //prima riga della griglia //prompt AddLabel(gbsSizer, "Cartella locale programma", 0, 0); //campo testo wxString strPath; strPath = "C:\\"; strPath += APPNAME; wxTextCtrl* tcDestPrgPath = new wxTextCtrl(this, 801, strPath, wxDefaultPosition, wxSize(256,-1)); gbsSizer->Add(tcDestPrgPath, wxGBPosition(0, 1)); //bottone 'sfoglia' wxButton* bDestPrgButton = new wxButton(this, 802, wxT("Sfoglia"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bDestPrgButton, wxGBPosition(0, 2)); //seconda riga della griglia //prompt AddLabel(gbsSizer, "Cartella remota origine programmi", 1, 0); //campo testo wxTextCtrl* tcSrcPrgPath = new wxTextCtrl(this, 803, "", wxDefaultPosition, wxSize(256,-1)); gbsSizer->Add(tcSrcPrgPath, wxGBPosition(1, 1)); //bottone 'sfoglia' wxButton* bSrcPrgButton = new wxButton(this, 804, wxT("Sfoglia"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bSrcPrgButton, wxGBPosition(1, 2)); //terza riga della griglia //prompt AddLabel(gbsSizer, "Cartella remota dati da utilizzare", 2, 0); //campo testo wxTextCtrl* tcDataPath = new wxTextCtrl(this, 805, "", wxDefaultPosition, wxSize(256,-1)); gbsSizer->Add(tcDataPath, wxGBPosition(2, 1)); //bottone 'sfoglia' wxButton* bDataButton = new wxButton(this, 806, wxT("Sfoglia"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bDataButton, wxGBPosition(2, 2)); //terza riga della griglia //Server dizionari label AddLabel(gbsSizer, "Nome o indirizzo IP del server dei dizionari", 3, 0); //nome Server dizionari wxTextCtrl* tcSrvName = new wxTextCtrl(this, 807, "", wxDefaultPosition, wxSize(256,-1)); gbsSizer->Add(tcSrvName, wxGBPosition(3, 1)); //bottone Cerca wxButton* bSrvButton = new wxButton(this, 808, wxT("Cerca"), wxDefaultPosition, wxSize(48, -1)); gbsSizer->Add(bSrvButton, wxGBPosition(3, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); } /**********************************************************************************************************/ // 9 pagina con la creazione icona sul desktop, lanciatore del lurch e installatore teleassistenza /**********************************************************************************************************/ class CampoWizardPage9 : public CampoWizardPage { protected: virtual bool TransferDataToWindow(); virtual bool ForwardValidate(); public: CampoWizardPage9(wxWizard* parent); }; bool CampoWizardPage9::TransferDataToWindow() { //setta il checkbox del link Set(901, GetWizard().GetDesktopShortcut()); //controlla se il programma di teleassistenza e' gia' installato sul computer e decide se spuntare o meno.. //..il checkbox bool bChkTeleass = false; const bool bIsAgaVersion = IsAgaVersion("../install.ini"); if (bIsAgaVersion) { bChkTeleass = true; const wxString strWinProgDir = GetWindowsProgramDirectory(); wxString strUVNCDir = strWinProgDir + "/UltraVNC"; wxDir dirUVNCDir(strUVNCDir); if (dirUVNCDir.Exists(strUVNCDir)) { wxFileName fnFileToCheck(strUVNCDir, "winvnc"); fnFileToCheck.SetExt("exe"); if (fnFileToCheck.FileExists()) bChkTeleass = false; } } Set(902, bChkTeleass); return true; } bool CampoWizardPage9::ForwardValidate() { //link sul desktop const bool bDesktopShortcut = GetBool(901); GetWizard().SetDesktopShortcut(bDesktopShortcut); //installazione programma teleassistenza const bool bInstallTeleass = GetBool(902); if (bInstallTeleass) { wxString strPath("../../teleassistenza/UltraVNC-102-Setup.exe"); wxExecute(strPath, wxEXEC_SYNC); } return true; } CampoWizardPage9::CampoWizardPage9(wxWizard* parent) : CampoWizardPage(parent) { //l'installatore della teleassistenza ci va solo nella versione AGA;quindi controlla il producer nell'install.ini... //..che c'è appena sopra di lui in program const bool bIsAgaVersion = IsAgaVersion("../install.ini"); wxString strTitle = wxT("Collegamenti e Teleassistenza"); wxString strBody; strBody += wxT("

E' possibile creare l'icona di APPNAMEFULL sul desktop.

"); if (bIsAgaVersion) { strBody += wxT("

E' possibile installare il programma di teleassistenza. E' il software che consente"); strBody += wxT(" ai tecnici dell'assistenza di controllare il computer su cui si installa APPNAMEFULL in caso di problemi gravi."); strBody += wxT(" Se la casella risulta NON spuntata in automatico il programma di teleassistenza e' gia' presente"); strBody += wxT(" sul computer e non deve essere reinstallato.

"); } SetHTMLText(strTitle, strBody); wxCheckBox* pIcon = new wxCheckBox(this, 901, wxT("Creare l'icona sul desktop")); GetSizer()->Add(pIcon, 0, wxALL, 0); GetSizer()->AddSpacer(10); wxCheckBox* pTeleass = new wxCheckBox(this, 902, wxT("Installare il programma di teleassistenza")); GetSizer()->Add(pTeleass, 0, wxALL, 0); if (!bIsAgaVersion) pTeleass->Hide(); //wxCheckBox* pLink = new wxCheckBox(this, 1002, wxT("Associare i file .caz al programma")); //pLink->SetValue(true); //GetSizer()->Add(pLink, 0, wxALL, 0); } /**********************************************************************************************************/ // 10 pagina con la selezione di destinazione /**********************************************************************************************************/ class CampoWizardPage10 : public CampoWizardPage { InstallationType _uInstallType; wxString _strInstallType; wxString _strPrgLocPath; wxString _strPrgNetPath; wxString _strDataPath; wxString _strSrvAuth; wxString _strSrvDict; unsigned int _iSrvAutostartMode; bool _bInstDemoData; bool _bInstDemoVersion; bool _bDesktopShortcut; protected: virtual bool TransferDataToWindow(); public: CampoWizardPage10(wxWizard* parent); }; bool CampoWizardPage10::TransferDataToWindow() { CampoWizard& cw = GetWizard(); _uInstallType = cw.GetInstallationType(); switch (_uInstallType) { case it_server: //server if (GetSessionId() > 0) _strInstallType = "Terminal Server"; else _strInstallType = "Server"; _strPrgLocPath = cw.GetPrgLocPath(); _strDataPath = cw.GetDataPath(); _strSrvAuth = cw.GetSrvAuth(); _strSrvDict = cw.GetSrvDict(); if (!_strSrvAuth.IsEmpty() || !_strSrvDict.IsEmpty()) _iSrvAutostartMode = cw.GetSrvAutostartMode(); break; case it_client: //client _strInstallType = "Client"; _strPrgLocPath = cw.GetPrgLocPath(); _strPrgNetPath = cw.GetPrgNetPath(); _strDataPath = cw.GetDataPath(); _strSrvAuth = cw.GetSrvAuth(); _strSrvDict = cw.GetSrvDict(); break; case it_upgrade: //aggiornamento _strInstallType = ""; _strPrgLocPath = cw.GetDestinationPath(); _strDataPath = cw.GetDataPath(); _strSrvAuth = cw.GetSrvAuth(); _strSrvDict = cw.GetSrvDict(); break; default: //standard if (cw.GetInstDemoVersion()) { _strInstallType = "DEMO"; _strPrgLocPath = "c:/campodemo"; } else { _strInstallType = "Standard"; _strPrgLocPath = cw.GetPrgLocPath(); _strDataPath = cw.GetDataPath(); _bInstDemoData = cw.GetInstDemoData(); } break; } //questo vale per tutti _bDesktopShortcut = cw.GetDesktopShortcut(); //se installazione o aggiornamento cambia sia il titolo che i contenuti wxString strTitle; wxString strBody; //Aggiornamento if (_uInstallType == it_upgrade) { strTitle += wxT("AGGIORNAMENTO: riepilogo configurazione"); strBody = wxT("

Cartella programma da aggiornare: "); strBody += wxT(Bold(_strPrgLocPath) + "

"); strBody += wxT("

Cartella dati in uso: "); strBody += wxT(Bold(_strDataPath) + "

"); } else //Installazione { strTitle += wxT("INSTALLAZIONE: riepilogo configurazione"); //DEMO (aaarrgh!) if (cw.GetInstDemoVersion()) { strBody = wxT("

Tipo installazione selezionata: "); strBody += wxT("DEMO

"); strBody += wxT("

Cartella dove installare il programma: "); strBody += wxT("C:/campodemo

"); } else //tutte le altre { strBody = wxT("

Tipo installazione selezionata: "); strBody += wxT(Bold(_strInstallType) + "

"); strBody += wxT("

Cartella dove installare il programma: "); strBody += wxT(Bold(_strPrgLocPath) + "

"); if (_uInstallType == it_client) { strBody += wxT("

Cartella di origine dei files del programma: "); strBody += wxT(Bold(_strPrgNetPath) + "

"); strBody += wxT("

Cartella dati da utilizzare: "); strBody += wxT(Bold(_strDataPath) + "

"); } else { strBody += wxT("

Cartella dati da creare: "); strBody += wxT(Bold(_strDataPath) + "

"); } } } //installazione servers... if (!_strSrvAuth.IsEmpty()) { strBody += wxT("

Computer gestore delle autorizzazioni: "); strBody += wxT(Bold(_strSrvAuth) + "

"); } if (!_strSrvDict.IsEmpty()) { strBody += wxT("

Computer gestore dei dizionari: "); strBody += wxT(Bold(_strSrvDict) + "

"); } //...e loro modalita' di lancio (solo installazione server!) if (_uInstallType == it_server && (!_strSrvAuth.IsEmpty() || !_strSrvDict.IsEmpty()) && _iSrvAutostartMode >= 0) { strBody += wxT("

Modalita' di esecuzione dei programmi di gestione: "); if (_iSrvAutostartMode == lm_service) strBody += wxT(Bold("Come servizi") + "

"); else strBody += wxT(Bold("Nel menu esecuzione automatica") + "

"); } //installazione dati demo (solo in postazione singola) if (_uInstallType == it_standalone && _bInstDemoData) strBody += wxT("

Installazione area dati dimostrativa

"); if (_bDesktopShortcut) strBody += wxT("

Creazione dell' icona sul desktop

"); SetHTMLText(strTitle, strBody); return true; } CampoWizardPage10::CampoWizardPage10(wxWizard* parent) : CampoWizardPage(parent) { } /////////////////////////////////////////////////////////// // CampoWizard /////////////////////////////////////////////////////////// //la dichiarazione della classe e' prima in quanto alcuni suoi metodi sono usati da altre classi scritte piu' su BEGIN_EVENT_TABLE(CampoWizard, wxWizard) EVT_BUTTON(wxID_FORWARD, CampoWizard::OnNext) END_EVENT_TABLE() void CampoWizard::OnNext(wxCommandEvent& e) { CampoWizardPage* p = (CampoWizardPage*)GetCurrentPage(); if (p->ForwardValidate()) e.Skip(); } bool CampoWizard::Run() { return RunWizard(m_pPage[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::Set(wxWindowID id, const wxString str) { wxWindow* pWnd = FindWindowById(id); if (pWnd != NULL) pWnd->SetLabel(str); } //lunga litania di metodi per gettare e settare i valori tra le pagine void CampoWizard::SetDestinationPath(const wxString& path) { _strDestinationPath = path; //Se il path di destinazione e' vuoto -> nuova installazione, senno' e' un aggiornamento della installazione.. //..che sta in _strDestinationPath if (_strDestinationPath.IsEmpty()) { //installazione if (GetInstDemoVersion()) wxWizardPageSimple::Chain(m_pPage[2], m_pPage[8]); //installazione DEMO else { wxWizardPageSimple::Chain(m_pPage[2], m_pPage[3]); //installazione nuova normale wxWizardPageSimple::Chain(m_pPage[3], m_pPage[4]); } } else { //aggiornamento CampoWizardPage4* page4 = (CampoWizardPage4*)m_pPage[3]; if (page4->DongleTest() != 0) wxWizardPageSimple::Chain(m_pPage[2], m_pPage[8]); // chiave trovata else { wxWizardPageSimple::Chain(m_pPage[2], m_pPage[3]); // chiave NON trovata wxWizardPageSimple::Chain(m_pPage[3], m_pPage[8]); } } } const wxString& CampoWizard::GetDestinationPath() const { return _strDestinationPath; } void CampoWizard::SetInstallationType(const InstallationType nType) { _uInstallationType = nType; //in base al tipo di installazione spara l'utente alla pagina corretta switch (_uInstallationType) { case it_server: //server wxWizardPageSimple::Chain(m_pPage[4], m_pPage[6]); //manda l'utente alla pagina server wxWizardPageSimple::Chain(m_pPage[6], m_pPage[8]); //dal server alla pagina riassuntiva break; case it_client: //client wxWizardPageSimple::Chain(m_pPage[4], m_pPage[7]); //manda l'utente alla pagina client wxWizardPageSimple::Chain(m_pPage[7], m_pPage[8]); //dal client alla pagina riassuntiva break; case it_upgrade: //aggiornamento installazione precedente //wxWizardPageSimple::Chain(m_pPage[3], m_pPage[8]); //manda l'utente alla pagina riassuntiva break; default: //standard //if demo if (GetInstDemoVersion()) { wxWizardPageSimple::Chain(m_pPage[2], m_pPage[8]); //manda l'utente alla pagina riassuntiva senza controllo chiave } else { wxWizardPageSimple::Chain(m_pPage[4], m_pPage[5]); //manda l'utente alla pagina standard wxWizardPageSimple::Chain(m_pPage[5], m_pPage[8]); //dalla standard alla pagina riassuntiva } break; } } const InstallationType CampoWizard::GetInstallationType() const { return _uInstallationType; } void CampoWizard::SetPrgLocPath(const wxString& strPrgLocPath) { _strPrgLocPath = strPrgLocPath; } const unsigned int CampoWizard::GetDongleType() const { return _uDongleType; } void CampoWizard::SetDongleType(const unsigned int uType) { _uDongleType = uType; } const wxString& CampoWizard::GetPrgLocPath() const { return _strPrgLocPath; } void CampoWizard::SetPrgNetPath(const wxString& strPrgNetPath) { _strPrgNetPath = strPrgNetPath; } const wxString& CampoWizard::GetPrgNetPath() const { return _strPrgNetPath; } void CampoWizard::SetDataPath(const wxString& strDataPath) { _strDataPath = strDataPath; } const wxString& CampoWizard::GetDataPath() const { return _strDataPath; } void CampoWizard::SetInstUseAuth(const bool bInstUseAuth) { _bInstUseAuth = bInstUseAuth; } const bool CampoWizard::GetInstUseAuth() const { return _bInstUseAuth; } void CampoWizard::SetSrvAuth(const wxString& strSrvAuth) { _strSrvAuth = strSrvAuth; } const wxString& CampoWizard::GetSrvAuth() const { return _strSrvAuth; } void CampoWizard::SetInstUseDict(const bool bInstUseDict) { _bInstUseDict = bInstUseDict; } const bool CampoWizard::GetInstUseDict() const { return _bInstUseDict; } void CampoWizard::SetSrvDict(const wxString& strSrvDict) { _strSrvDict = strSrvDict; } const wxString& CampoWizard::GetSrvDict() const { return _strSrvDict; } void CampoWizard::SetSrvAutostartMode(const LurchMode iSrvAutostartMode) { _iSrvAutostartMode = iSrvAutostartMode; } const LurchMode CampoWizard::GetSrvAutostartMode() const { return _iSrvAutostartMode; } void CampoWizard::SetInstDemoData(const bool bInstDemoData) { _bInstDemoData = bInstDemoData; } const bool CampoWizard::GetInstDemoData() const { return _bInstDemoData; } void CampoWizard::SetInstDemoVersion(const bool bInstDemoVersion) { _bInstDemoVersion = bInstDemoVersion; } const bool CampoWizard::GetInstDemoVersion() const { return _bInstDemoVersion; } void CampoWizard::SetDesktopShortcut(const bool bDesktopShortcut) { _bDesktopShortcut = bDesktopShortcut; } const bool CampoWizard::GetDesktopShortcut() const { return _bDesktopShortcut; } //...fine litania metodi di passaggio valori tra le finestre CampoWizard::CampoWizard(wxWindow* pParent) { //resettatore dei booleans (che senno' prendono valore casuale ad ogni esecuzione) _bInstDemoData = false; //installa dati dimostrativi _bInstDemoVersion = false; //installa versione demo _bInstUseAuth = false; //installa/usa server authoriz _bInstUseDict = false; //installa/usa server diction _iSrvAutostartMode = lm_none;//autostart dei servers _bDesktopShortcut = false; //creazione link sul desktop wxImage iLogo; wxString strName = wxT("logo.gif"); iLogo.LoadFile(strName, wxBITMAP_TYPE_GIF); int nWidth = iLogo.GetWidth(); int nHeight = iLogo.GetHeight(); if (nWidth > 320) { nHeight = nHeight * 320 / nWidth; nWidth = 320; iLogo.Rescale(nWidth, nHeight, wxIMAGE_QUALITY_HIGH); } const wxBitmap bitmap(iLogo); Create(pParent, wxID_ANY, APPNAMEFULL, bitmap); m_pPage[0] = new CampoWizardPage1(this); //benvenuto con logo m_pPage[1] = new CampoWizardPage2(this); //licenza m_pPage[2] = new CampoWizardPage3(this); //scelta aggiornamento/tipo installazione m_pPage[3] = new CampoWizardPage4(this); //test ed installazione chiavi m_pPage[4] = new CampoWizardPage5(this); //selezione tipo installazione m_pPage[5] = new CampoWizardPage6(this); //installazione standard m_pPage[6] = new CampoWizardPage7(this); //installazione server m_pPage[7] = new CampoWizardPage8(this); //installazione client m_pPage[8] = new CampoWizardPage9(this); //creazione icona sul desktop e in start/programmi/campo m_pPage[9] = new CampoWizardPage10(this); //riassuntino installazione for (int p = 1; p < m_nPages; p++) wxWizardPageSimple::Chain(m_pPage[p-1], m_pPage[p]); GetPageAreaSizer()->Add(m_pPage[0]); //bottoni di navigazione Set(wxID_FORWARD, "Avanti"); Set(wxID_BACKWARD, "Indietro"); Set(wxID_CANCEL, "Annulla"); }