diff --git a/ba/autorun.cpp b/ba/autorun.cpp index 093d7aa28..7a1c38b4c 100755 --- a/ba/autorun.cpp +++ b/ba/autorun.cpp @@ -1,563 +1,48 @@ -#define WIN32_LEAN_AND_MEAN -#define STRICT -#include -#include - -#include "../xvaga/incstr.h" -extern "C" -{ -#include "../xvaga/hlapi_c.h" -#include "../xvaga/skeylink.h" -} -#include -#include -#include - -static HINSTANCE _hInstance = NULL; -static int _dongle_type = 0; - -/****************************/ -/* Utility */ -/****************************/ - -void ErrorBox(LPCSTR str) -{ - MessageBox(GetFocus(), str, "Installazione", MB_ICONSTOP|MB_OK); -} - -void WarningBox(LPCSTR str) -{ - MessageBox(GetFocus(), str, "Installazione", MB_ICONEXCLAMATION|MB_OK); -} - -int ThisYear() -{ - int anno = 2006; - time_t lt; - if (time(<) == 0) - { - struct tm* timeloc = localtime(<) ; - if (timeloc != NULL) - anno = timeloc->tm_year + 1900; - } - return anno; -} - -/****************************/ -/* Gestione chiave Hardlock */ -/****************************/ - -bool HardlockGarble(unsigned short* data) -{ - HL_CODE(data, 1); - return TRUE; -} - -unsigned short 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 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 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; -} - -/***********************************/ -/* Gestione cifratura lista codici */ -/***********************************/ - -void BuildKey(char* key) -{ - for (int i = 0; i < 8; i++) - key[i] = 'A'+ rand()%26; -} - -void DecodeString(char* 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'; - strcpy(data, tmp); -} - -int VersionYear() -{ - char ver[32]; - GetPrivateProfileString("ba", "Versione", "", ver, sizeof(ver), "./program/zip/install.ini"); - ver[4] = '\0'; - return atoi(ver); -} - -void ProgramName(char* name) -{ - char ver[80]; - GetPrivateProfileString("Main", "Producer", "", ver, sizeof(ver), "./program/zip/install.ini"); - - if (ver[0] != '\0') - { - const char * const encryption_key = "QSECOFR-"; - int i; - for (i = 0; ver[i]; i++) - name[i] = ver[i] - (i < 8 ? encryption_key[i] : name[i - 8]); - name[i] = '\0'; - } - else - strcpy(name, "Campo"); -} - -int 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; - ifstream keys("./program/zip/dninst.zip"); - if (keys.good()) - { - char line[256]; - keys.getline(line, sizeof(line)); - 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 (!keys.eof()) - { - keys.getline(line, sizeof(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; - wsprintf(line, "Il contratto di manutenzione %d/%d verrà attivato automaticamente", y, n); - WarningBox(line); - } - else - { - wsprintf(line, "È 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; -} - -//allah! -int __stdcall DongleProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) - { - case WM_INITDIALOG: - ::CheckRadioButton(hDlg, 100, 101, 100); - break; - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDOK: - _dongle_type = ::IsDlgButtonChecked(hDlg, 100) ? 2 : 1; - case IDCANCEL: - ::EndDialog(hDlg, LOWORD(wParam)); - return true; - default: - break; - } - break; - default: - break; - } - return false; -} - - -bool InstallDongle() -{ - //metodo per richiedere il tipo di chiave e lanciare l'installazione dei servizi - int ret = ::DialogBox(_hInstance, "DONGLE", NULL, DongleProc); - if (ret != IDOK) - return false; - - char path[256] = ""; - if (_dongle_type == 1) - strcpy(path, "./chiavi/hardlock/hldrv32.exe"); - else - strcpy(path, "./chiavi/eutron/sdi.exe"); - - STARTUPINFO si; - PROCESS_INFORMATION pi; - - ZeroMemory( &si, sizeof(si) ); - si.cb = sizeof(si); - ZeroMemory( &pi, sizeof(pi) ); - - // Start the child process. - if( !CreateProcess( NULL, // No module name (use command line). - path, // Command line. - NULL, // Process handle not inheritable. - NULL, // Thread handle not inheritable. - FALSE, // Set handle inheritance to FALSE. - 0, // No creation flags. - NULL, // Use parent's environment block. - NULL, // Use parent's starting directory. - &si, // Pointer to STARTUPINFO structure. - &pi ) // Pointer to PROCESS_INFORMATION structure. - ) - return false; - // Wait until child process exits. - WaitForSingleObject( pi.hProcess, INFINITE ); - - // Close process and thread handles. - CloseHandle( pi.hProcess ); - CloseHandle( pi.hThread ); - - return true; -} - -unsigned int Run(LPCSTR app) -{ - unsigned int ret = WinExec(app, SW_SHOWNORMAL); - if (ret <= 32) - { - char s[128]; - wsprintf(s,"Impossibile eseguire\n%s\nErrore %d", app, (int)ret); - ErrorBox(s); - } - return ret; -} - -/* - * MainWndProc - * - * Purpose: - * Window procedure for main window. The main window is a dialog. - * - */ -LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_ERASEBKGND: - { - /* Repaint lo sfondo quando necessario*/ - HDC hdc = (HDC) wParam; - HPEN hpenOld = (HPEN)SelectObject(hdc, GetStockObject(NULL_PEN)); - RECT rect; GetClientRect(hwnd,&rect); - - COLORREF cStart = GetSysColor(COLOR_ACTIVECAPTION); - COLORREF cStop = GetSysColor(27 /*COLOR_GRADIENTACTIVECAPTION*/); - int deltaR = GetRValue(cStop) - GetRValue(cStart); - int deltaG = GetGValue(cStop) - GetGValue(cStart); - int deltaB = GetBValue(cStop) - GetBValue(cStart); - - const int ysize=rect.bottom-rect.top; - const int step = 4; - for (int y=rect.bottom; y>=rect.top-step; y-=step) - { - int r = GetRValue(cStart) + deltaR * y / rect.bottom; - int g = GetGValue(cStart) + deltaG * y / rect.bottom; - int b = GetBValue(cStart) + deltaB * y / rect.bottom; - HBRUSH hbrush = CreateSolidBrush(RGB(r,g,b)); - HBRUSH hbrushOld = (HBRUSH)SelectObject(hdc, hbrush); - Rectangle(hdc, rect.left, y, rect.right, y+step+1); - SelectObject(hdc, hbrushOld); - DeleteObject(hbrush); - } - SelectObject(hdc, hpenOld); - } - break; - case WM_PAINT: - { - PAINTSTRUCT ps; - RECT rct; - const char* s1 = "Installazione / Aggiornamento della versione normale"; - const char* s2 = "Installazione della versione dimostrativa"; - const char* s4 = "Termina installazione"; - const char* s5 = "Scelta installazione"; - - HDC hdc = BeginPaint(hwnd, &ps); - - GetWindowRect(GetDesktopWindow(),&rct); - SetBkMode(hdc, TRANSPARENT); - - const int offx=(rct.right - rct.left-640)/2; - const int offy=(rct.bottom - rct.top-260)/2; - rct.left = offx+300; - rct.top = offy; - rct.right = rct.left+350; - rct.bottom = offy+60; - - SetTextColor(hdc, GetSysColor(COLOR_CAPTIONTEXT)); - DrawText(hdc, s1, strlen(s1), &rct, DT_LEFT|DT_WORDBREAK); - rct.top += 80; rct.bottom += 80; - DrawText(hdc, s2, strlen(s2), &rct, DT_LEFT|DT_WORDBREAK); - rct.top += 80; rct.bottom += 80; - DrawText(hdc, s4, strlen(s4), &rct, DT_LEFT|DT_WORDBREAK); - - /* Titolo con ombreggiatura */ - HFONT hfont = CreateFont(64, 0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS, PROOF_QUALITY, VARIABLE_PITCH | FF_SWISS, "Arial"); - HFONT hfontOld = (HFONT)SelectObject(hdc, hfont); - - SetTextColor(hdc, RGB(0,0,0)); - TextOut(hdc, 20, 20, s5, strlen(s5)); - - SetTextColor(hdc, GetSysColor(COLOR_CAPTIONTEXT)); - TextOut(hdc, 16, 16, s5, strlen(s5)); - - SelectObject(hdc, hfontOld); - DeleteObject(hfont); - EndPaint(hwnd, &ps); - } - break; - case WM_COMMAND: - { - bool quit_program = false; - switch (LOWORD(wParam)) - { - case 2: - quit_program = true; - break; - case 1000: //installazione normale con chiave - if (_dongle_type == 0) //non trova una chiave funzionante... - { - InstallDongle(); //chiede di installare la chiave... - DongleTest(); //verifica l'installazione della chiave.. - if (_dongle_type == 0) //la chiave non c'e' proprio! - { //forza l'installazione del modulo SY con chiave Eutron (finta) - int ret = ::MessageBox(hwnd, "ATTENZIONE! Chiave di protezione NON rilevata:\n" - "Si desidera installare ugualmente il modulo base ?", - "Installazione", MB_YESNO | MB_ICONQUESTION); - _dongle_type = ret == IDYES ? 2 : 0; - } - } - if (_dongle_type != 0) - quit_program = Run("program\\disk1\\setup.exe") > 32; - break; - case 1001: - quit_program = Run("demo\\disk1\\setup.exe") > 32; - break; - default: - break; - } - if (quit_program) //esce dal programma di installazione - PostQuitMessage(0); - } - break; - case WM_CHAR: - if (wParam == VK_ESCAPE) - PostQuitMessage(0); - break; - case WM_DESTROY: - PostQuitMessage(0); - break; - default: - return DefDlgProc(hwnd, msg, wParam, lParam); - } - - return NULL; -} - - -/* - * InitApplication - * - * Purpose: - * Registers window class - * - * Parameters: - * hinst hInstance of application - * - * Return Value: - * TRUE if initialization succeeded, FALSE otherwise. - */ -BOOL InitApplication (HINSTANCE hinst) -{ - WNDCLASS wc; - - wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW; - wc.lpfnWndProc = MainWndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = DLGWINDOWEXTRA; - wc.hInstance = hinst; - wc.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(9012)); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1); - wc.lpszMenuName = NULL; - wc.lpszClassName = "MainWndClass"; - - return RegisterClass(&wc); -} - - -/* - * WinMain - * - * Purpose: - * Main entry point of application. - * - */ - -int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hinstPrev, LPSTR pCmdLine, int nCmdShow) -{ - if (!InitApplication(hInst)) // Register window class - return 0; - - _hInstance = hInst; - - _dongle_type = DongleTest(); //controlla se la chiave c'e' ed eventualmente quale e' - - RECT rect; - GetWindowRect(GetDesktopWindow(),&rect); - HWND hwndDlg=CreateWindow("MainWndClass","Scelta installazione",WS_VISIBLE| WS_CAPTION | WS_SYSMENU | WS_MAXIMIZE, - rect.left,rect.top,rect.right,rect.bottom,NULL,NULL,hInst,NULL ); - - const int offx=(rect.right - rect.left-700)/2; - const int offy=(rect.bottom - rect.top-260)/2; - - char name[80]; - ProgramName(name); - - char prompt[128]; - strcpy(prompt, name); - - UINT dwFlags = WS_CHILD | WS_VISIBLE; - /* Disegna i pulsanti */ - CreateWindow("BUTTON",prompt, dwFlags, - offx, offy, 300, 32, hwndDlg , (HMENU)1000, hInst, NULL ); - - - if (_dongle_type != 0) //se la chiave e' presente e funzionante non si puo' installare la DEMO - dwFlags |= WS_DISABLED; - strcat(prompt, " DEMO"); - CreateWindow("BUTTON", prompt, dwFlags, - offx, offy+80, 300, 32, hwndDlg , (HMENU)1001, hInst, NULL ); - - CreateWindow("BUTTON","Uscita", - WS_CHILD| WS_VISIBLE,offx,offy+160,300,32, hwndDlg ,(HMENU)2,hInst,NULL ); - - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - return (msg.wParam); -} +#define WIN32_LEAN_AND_MEAN +#define STRICT +#include +#include + +BOOL ErrorBox(LPCTSTR msg) +{ + ::MessageBox(NULL, msg, TEXT("Setup"), MB_OK | MB_ICONERROR); + return FALSE; +} + +BOOL FileExists(LPCTSTR name) +{ + return ::GetFileAttributes(name) != 0xFFFFFFFF; +} + +BOOL IsVistaOrLater() +{ + BOOL good = FALSE; + OSVERSIONINFOEX osinfo; ZeroMemory(&osinfo, sizeof(osinfo)); + osinfo.dwOSVersionInfoSize = sizeof(osinfo); + if (::GetVersionEx((OSVERSIONINFO*)&osinfo)) + good = osinfo.dwMajorVersion >= 6; + return good; +} + +int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hinstPrev, LPSTR pCmdLine, int nCmdShow) +{ + BOOL bFound = FileExists(TEXT("SetCmpUp.exe")); + if (!bFound) + { + ::SetCurrentDirectory(TEXT("program\\setup")); + bFound = FileExists(TEXT("SetCmpUp.exe")); + if (!bFound) + ErrorBox(TEXT("Impossibile trovare SetCmpUp.exe")); + } + if (bFound) + { + if (IsVistaOrLater()) + bFound = (int)::ShellExecute(NULL, TEXT("runas"), TEXT("SetCmpUp.exe"), NULL, NULL, SW_SHOWMAXIMIZED) > 32; + else + bFound = ::WinExec("SetCmpUp.exe", SW_SHOWMAXIMIZED) > 32; + if (!bFound) + ErrorBox(TEXT("Impossibile eseguire SetCmpUp.exe")); + } + + return bFound ? 0 : 2; +} diff --git a/ba/ba1700.cpp b/ba/ba1700.cpp index 8154d7b65..f90dbcc33 100755 --- a/ba/ba1700.cpp +++ b/ba/ba1700.cpp @@ -605,7 +605,10 @@ bool TInstaller_mask::autoload() const int patch = atoi(str.mid(2, 4)); const int mypatch = ini_get_int(CONFIG_GENERAL, module, "Patch"); if (patch > 0 && patch < mypatch) + { + modules.destroy(i); continue; // Non fare il download delle patch inutili + } TFilename remote = http_path; remote << str; @@ -663,6 +666,11 @@ bool TInstaller_mask::autoload() { TString& ininame = *arow; ininame.lower(); + if (fsize(ininame) < 8) + { + xvt_fsys_remove_file(ininame); + continue; + } const int pos = ininame.find("a.ini"); CHECKS(pos >= 6, TR("Configurazione di installazione non valida: "), (const char*)ininame); const TString4 module = ininame.mid(pos-6, 2); diff --git a/ba/ba2800.cpp b/ba/ba2800.cpp index 1b891f51e..5449d9479 100644 --- a/ba/ba2800.cpp +++ b/ba/ba2800.cpp @@ -519,11 +519,25 @@ bool Tdninst_mask::get_remote_dninst() const TString& n = remote_dninst(10); if (n.full()) { - if (fcopy(n, DNINST_BAK, false, true) && fsize(DNINST_BAK) > 0) + const int minsize = 48*1024; + if (fcopy(n, DNINST_BAK, false, true)) { - fcopy(DNINST_BAK, DNINST_ZIP); - remove(DNINST_BAK); - return true; + const int size = fsize(DNINST_BAK); + if (size > minsize) + { + fcopy(DNINST_BAK, DNINST_ZIP); + remove(DNINST_BAK); + return true; + } + else + { + TString msg; msg << TR("Il file dninst.zip remoto pesa solo ") << size << " bytes"; + if (is_running()) + error_box(msg); + else + log(2, msg); + return false; + } } } if (is_running()) diff --git a/ba/ba3100.cpp b/ba/ba3100.cpp index 6ad321b98..3596cfa3d 100755 --- a/ba/ba3100.cpp +++ b/ba/ba3100.cpp @@ -528,12 +528,14 @@ bool TGeneric_table_app::change_decimals_handler(TMask_field& f, KEY k) { TMask& m = f.mask(); real cambio(f.get()); + /* Obsoleto if (cambio > ZERO && m.get_bool(FLD_TABCAM_B1)) { // Se il cambio e' espresso in EURO metto in R10 il valore in lire cambio = 1936.27 / cambio; cambio.round(5); } + */ m.set(FLD_TABCAM_R10, cambio); } return true;