diff --git a/setup/Setup.cpp b/setup/Setup.cpp index a12925f5c..2312f5246 100755 --- a/setup/Setup.cpp +++ b/setup/Setup.cpp @@ -28,6 +28,7 @@ /////////////////////////////////////////////////////////// // Utilities /////////////////////////////////////////////////////////// + wxString GetDefaultDestination() { wxString strDest; @@ -56,79 +57,6 @@ wxString GetDefaultDestination() return strDest; } -class CampoDirCopier : 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 CampoDirCopier::OnDir(const wxString& dirname) -{ - return wxDIR_CONTINUE; -} - -wxDirTraverseResult CampoDirCopier::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 CampoDirCopier::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 CampoDirCopier::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 - - - -#endif - /////////////////////////////////////////////////////////// // CampoWizardPage /////////////////////////////////////////////////////////// @@ -158,10 +86,11 @@ class CampoWizard : public wxWizard protected: DECLARE_EVENT_TABLE(); - int Pages() const { return m_nPages; } - CampoWizardPage* Page(int p) const { return m_pPage[p]; } void OnNext(wxCommandEvent& e); - + + int Pages() const { return m_nPages; } + CampoWizardPage& Page(int p) const { wxASSERT(p >= 0 && p < m_nPages); return *m_pPage[p]; } + public: bool Run(); wxString Get(wxWindowID id) const; @@ -631,16 +560,25 @@ void CampoWizardPage4::OnEUPick(wxCommandEvent& e) void CampoWizardPage4::OnSRPick(wxCommandEvent& e) { - wxString strSrvName; - int year = 0; - unsigned short serno = ServerLogin(year, strSrvName); - if (!strSrvName.IsEmpty()) - Set(404, strSrvName); + 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!"); @@ -1559,7 +1497,7 @@ void CampoWizard::OnNext(wxCommandEvent& e) } bool CampoWizard::Run() -{ return RunWizard(Page(0)); } +{ return RunWizard(m_pPage[0]); } wxString CampoWizard::Get(wxWindowID id) const { @@ -1778,6 +1716,18 @@ CampoWizard::CampoWizard(wxWindow* pParent) wxWizardPageSimple::Chain(m_pPage[p-1], m_pPage[p]); GetPageAreaSizer()->Add(m_pPage[0]); + + wxWindow* pNext = FindWindowById(wxID_FORWARD); + if (pNext != NULL) + pNext->SetLabel("Continua"); + + wxWindow* pPrev = FindWindowById(wxID_BACKWARD); + if (pPrev != NULL) + pPrev->SetLabel("C'ho ripensato"); + + wxWindow* pCancel = FindWindowById(wxID_CANCEL); + if (pCancel != NULL) + pCancel->SetLabel("Mittico! Ma vaff..."); } diff --git a/setup/setupkey.cpp b/setup/setupkey.cpp index 1c9bca06f..da4f8e4da 100755 --- a/setup/setupkey.cpp +++ b/setup/setupkey.cpp @@ -1,5 +1,4 @@ #include "wxinc.h" - #include #include "setupkey.h" @@ -10,7 +9,6 @@ extern "C" #include "../xvaga/skeylink.h" } - /////////////////////////////// // Utilities // /////////////////////////////// @@ -144,16 +142,82 @@ unsigned short EutronLogin(int& year) return serno; } +////////////////////////////////// +// Gestione Server di chiavi // +////////////////////////////////// + +class TBordello +{ + WX_DECLARE_STRING_HASH_MAP(wxSocketClient*, TBrothel); + TBrothel m_map; + +public: + wxSocketClient& Zoccola(wxIPV4address& ip); + wxSocketClient* QuellaBuona(); + void Chiudi(); + virtual ~TBordello(); +} m_bordello; + +wxSocketClient& TBordello::Zoccola(wxIPV4address& ip) +{ + const wxString strIP = ip.IPAddress(); + if (m_map[strIP] == NULL) + { + m_map[strIP] = new wxSocketClient; + m_map[strIP]->SetTimeout(2); + } + return *m_map[strIP]; +} + +wxSocketClient* TBordello::QuellaBuona() +{ + wxSocketClient* good = NULL; + for(TBrothel::iterator it = m_map.begin(); it != m_map.end(); ++it ) + { + wxSocketClient* sc = (wxSocketClient*)it->second; + if (sc != NULL) + { + sc->WaitOnConnect(0, 1); + if (sc->IsConnected()) + { + good = sc; + break; + } + } + } + return good; +} + +void TBordello::Chiudi() +{ + for(TBrothel::iterator it = m_map.begin(); it != m_map.end(); ++it ) + { + wxSocketClient* sc = (wxSocketClient*)it->second; + if (sc != NULL) + sc->Close(); + } +} + + +TBordello::~TBordello() +{ +/* Non funziona per oggetti statici + for(TBrothel::iterator it = m_map.begin(); it != m_map.end(); ++it ) + { + wxSocketClient* sc = (wxSocketClient*)it->second; + sc->Destroy(); + } +*/ + m_map.clear(); +} -////////////////////////////////// -// Gestione Server di chiavi // -////////////////////////////////// static unsigned short InquireSocketNumber(wxSocketClient& sc, const wxString& strCommand) { - sc.Write(strCommand, (wxUint32)strCommand.Len()); - long number[2] = { 0L, 0L }; - sc.Read(number, sizeof(number)); - return (unsigned short)number[1]; + sc.Discard(); + sc.Write(strCommand, (wxUint32)strCommand.Len()); + long number[2] = { 0L, 0L }; + sc.Read(number, sizeof(number)); + return (unsigned short)number[1]; } static unsigned short InquireServer(const wxString& strSrvName, int& year, const bool bMsg) @@ -169,13 +233,12 @@ static unsigned short InquireServer(const wxString& strSrvName, int& year, const return serno; } - wxSocketClient* sc = new wxSocketClient; - sc->SetTimeout(2); - if (sc->Connect(ip)) //il computer remoto risponde ma il server no (non c'e' o e' spento) + wxSocketClient& sc = m_bordello.Zoccola(ip); + if (sc.IsConnected() || sc.Connect(ip)) //il computer remoto risponde { - serno = InquireSocketNumber(*sc, "DongleNumber()"); - year = InquireSocketNumber(*sc, "DongleYear()"); - sc->Discard(); + // ma il server e' davvero acceso o spento ? + serno = InquireSocketNumber(sc, "DongleNumber()"); + year = InquireSocketNumber(sc, "DongleYear()"); } else { @@ -187,7 +250,6 @@ static unsigned short InquireServer(const wxString& strSrvName, int& year, const } } - sc->Destroy(); return serno; } @@ -208,51 +270,35 @@ unsigned short ServerLogin(int& year, wxString& strSrvName) if (strMyIP.Len() > 7) { const unsigned short MaxSck = 256; -// for (int j = 3; j < 256 && serno == 0xFFFF; j += MaxSck) + for (int i = 0; i < MaxSck; i++) { - wxSocketClient* sc[MaxSck]; - memset(sc, 0, sizeof(sc)); - wxIPV4address ipRemote[MaxSck]; - for (int i = 0; i < MaxSck; i++) + //deve sostituire l'ultima cifra dell'IP con tutti i numeri che vanno da 0 a 255 alla ricerca del server + wxString strSrvIP = strMyIP.BeforeLast('.'); + strSrvIP << "." << i; //ip del computer remoto + if (strSrvIP != strMyIP) { - const int n = i; //+j; - if (n < 256) + wxIPV4address ipRemote; + if (ipRemote.Hostname(strSrvIP) && ipRemote.Service("1883")) { - //deve sostituire l'ultima cifra dell'IP con tutti i numeri che vanno da 0 a 255 alla ricerca del server - wxString strSrvIP = strMyIP.BeforeLast('.'); - strSrvIP << "." << n; //ip del computer remoto - if (strSrvIP == strMyIP) - continue; - if (ipRemote[i].Hostname(strSrvIP) && ipRemote[i].Service("1883")) - { - sc[i] = new wxSocketClient; - sc[i]->SetTimeout(2); - sc[i]->Connect(ipRemote[i], false); - } + wxSocketClient& sc = m_bordello.Zoccola(ipRemote); + if (!sc.IsConnected()) + sc.Connect(ipRemote, ipLocal, false); } } - wxMilliSleep(100); - for (int i = 0; i < MaxSck; i++) if (sc[i]) - { - sc[i]->WaitOnConnect(0, 1); - if (sc[i]->IsConnected()) - { - sc[i]->GetPeer(ipRemote[i]); - strSrvName = ipRemote[i].Hostname(); - serno = InquireSocketNumber(*sc[i], "DongleNumber()"); - year = InquireSocketNumber(*sc[i], "DongleYear()"); - sc[i]->Discard(); - if (year > 0) - break; - } - sc[i]->Close(); - } //for (inti =0... - for (int i = 0; i < MaxSck; i++) if (sc[i]) - sc[i]->Destroy(); - } //for(int j=0... + } + + wxSleep(2); + wxSocketClient* sc = m_bordello.QuellaBuona(); + if (sc != NULL) + { + wxIPV4address ipRemote; + sc->GetPeer(ipRemote); + strSrvName = ipRemote.Hostname(); + } } //if(strMyIP.Len()... } //if(strSrvName.Is... - else + + if (!strSrvName.IsEmpty()) serno = InquireServer(strSrvName, year, true); return serno;