diff --git a/KeyGenerator.cpp b/KeyGenerator.cpp index 50bce41..2d39aa8 100644 --- a/KeyGenerator.cpp +++ b/KeyGenerator.cpp @@ -29,9 +29,9 @@ using namespace std ; //--------------------------- Define ----------------------------------------- #if defined( NDEBUG) - #define STR_EXE "KeyGeneratorR32.exe" + #define STR_EXE "KeyGeneratorR32.exe" #else - #define STR_EXE "KeyGeneratorD32.exe" + #define STR_EXE "KeyGeneratorD32.exe" #endif @@ -83,11 +83,18 @@ CKeyGeneratorApp::InitInstance( void) // verifico la protezione string sKey = GetPrivateProfileStringUtf8( "General", "Key", "", m_pszProfileName) ; - if ( VerifyKey( sKey, 1230, 15, 01) != KEY_OK) + if ( VerifyKey( sKey, 1230, 16, 10) != KEY_OK) return FALSE ; + // gestione linea di comando + string sFileToOpen ; + CCommandLineInfo cmdInfo ; + ParseCommandLine( cmdInfo) ; + if ( cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) + sFileToOpen = WtoA( cmdInfo.m_strFileName) ; + // Dialog interface - CKeyGeneratorDlg dlg ; + CKeyGeneratorDlg dlg( sFileToOpen) ; m_pMainWnd = &dlg ; dlg.DoModal() ; diff --git a/KeyGenerator.rc b/KeyGenerator.rc index a0b0a26..ceb0d63 100644 Binary files a/KeyGenerator.rc and b/KeyGenerator.rc differ diff --git a/KeyGeneratorDlg.cpp b/KeyGeneratorDlg.cpp index f375719..5e40d4a 100644 --- a/KeyGeneratorDlg.cpp +++ b/KeyGeneratorDlg.cpp @@ -21,6 +21,7 @@ #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGnStringConverter.h" #include "/EgtDev/Include/EgtIniFile.h" +#include "/EgtDev/Include/SELkKeyProc.h" using namespace std ; @@ -108,10 +109,12 @@ END_MESSAGE_MAP() //---------------------------------------------------------------------------- // CKeyGeneratorDlg dialog //---------------------------------------------------------------------------- -CKeyGeneratorDlg::CKeyGeneratorDlg( CWnd* pParent) +CKeyGeneratorDlg::CKeyGeneratorDlg( const string& sFileToOpen, CWnd* pParent) : CDialogEx( IDD_KEYGENERATOR_DIALOG) { m_hIcon = AfxGetApp()->LoadIcon( IDR_MAINFRAME) ; + // eventuale file da caricare all'avvio + m_sFileToOpen = sFileToOpen ; } //---------------------------------------------------------------------------- @@ -119,7 +122,8 @@ BEGIN_MESSAGE_MAP( CKeyGeneratorDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() - ON_BN_CLICKED( ID_GENER, OnGenerate) + ON_BN_CLICKED( IDC_OPENFILE, OnOpenFile) + ON_BN_CLICKED( IDC_GENER, OnGenerate) ON_WM_CLOSE() END_MESSAGE_MAP() @@ -129,7 +133,7 @@ CKeyGeneratorDlg::OnInitDialog( void) { CDialogEx::OnInitDialog() ; - // Add "About..." menu item to system menu. + // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); @@ -147,26 +151,20 @@ CKeyGeneratorDlg::OnInitDialog( void) } } - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog SetIcon( m_hIcon, TRUE) ; // Set big icon SetIcon( m_hIcon, FALSE) ; // Set small icon - // Assegno ultimi valori inseriti - string sCust = GetPrivateProfileStringUtf8( "Data", "Customer", "", AfxGetApp()->m_pszProfileName) ; - GetDlgItem( IDC_CUSTOMER)->SetWindowTextW( stringtoW( sCust)) ; - string sMachId = GetPrivateProfileStringUtf8( "Data", "MachineId", "", AfxGetApp()->m_pszProfileName) ; - GetDlgItem( IDC_MACHID)->SetWindowTextW( stringtoW( sMachId)) ; - int nSelProd = GetPrivateProfileInt( "Data", "SelProduct", 0, AfxGetApp()->m_pszProfileName) ; - ((CComboBox*)GetDlgItem( IDC_PROD))->SetCurSel( nSelProd) ; - int nSelVer = GetPrivateProfileInt( "Data", "SelVer", 0, AfxGetApp()->m_pszProfileName) ; - ((CComboBox*)GetDlgItem( IDC_VER))->SetCurSel( nSelVer) ; - int nSelLev = GetPrivateProfileInt( "Data", "SelLev", 0, AfxGetApp()->m_pszProfileName) ; - ((CComboBox*)GetDlgItem( IDC_LEV))->SetCurSel( nSelLev) ; - int nExpTime = GetPrivateProfileInt( "Data", "ExpTime", 0, AfxGetApp()->m_pszProfileName) ; - if ( nExpTime != 0) - ((CDateTimeCtrl*)GetDlgItem( IDC_EXPIRATION))->SetTime( &CTime( nExpTime)) ; + // eventuale apertura o esecuzione di file all'avvio + if ( ! m_sFileToOpen.empty()) { + // leggo il file + if ( LoadFile( m_sFileToOpen.c_str())) + return TRUE ; + } + // Assegno ultimi valori inseriti + LoadFile( WtoA( AfxGetApp()->m_pszProfileName)) ; return TRUE ; // return TRUE unless you set the focus to a control } @@ -228,6 +226,69 @@ CKeyGeneratorDlg::OnClose( void) EndDialog( IDCANCEL) ; } +//---------------------------------------------------------------------------- +void +CKeyGeneratorDlg::OnOpenFile( void) +{ + // visualizzo il dialogo di scelta file + CFileDialog dlg( TRUE, L"*.Kge", NULL, + OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR, + L"Key info EgalTech (*.Kge)|*.Kge||", NULL, 0, FALSE) ; + + // imposto il direttorio iniziale + wstring wsDir = stringtoW( GetPrivateProfileStringUtf8( "General", "DataDir", "", AfxGetApp()->m_pszProfileName)) ; + if ( ! wsDir.empty()) + dlg.m_ofn.lpstrInitialDir = wsDir.c_str() ; + + // lancio il dialogo di scelta file + if ( dlg.DoModal() != IDOK) + return ; + + // leggo il file + LoadFile( WtoA( dlg.GetPathName())) ; +} + +//---------------------------------------------------------------------------- +bool +CKeyGeneratorDlg::LoadFile( const char* szFile) +{ + // verifico validità nome file + if ( szFile == nullptr || szFile[0] == '\0') + return false ; + // leggo indice ultimo salvataggio + int nLast = GetPrivateProfileInt( "Index", "Last", 0, szFile) ; + // carico i dati del file + string sSec = "Licence" ; + if ( nLast > 0) + sSec += ToString( nLast) ; + string sCust = GetPrivateProfileStringUtf8( sSec.c_str(), "Customer", "", szFile) ; + GetDlgItem( IDC_CUSTOMER)->SetWindowTextW( stringtoW( sCust)) ; + string sMachId = GetPrivateProfileStringUtf8( sSec.c_str(), "MachineId", "", szFile) ; + GetDlgItem( IDC_MACHID)->SetWindowTextW( stringtoW( sMachId)) ; + int nProd = GetPrivateProfileInt( sSec.c_str(), "Product", 0, szFile) ; + ((CComboBox*)GetDlgItem( IDC_PROD))->SetCurSel( nProd - 1230) ; + int nVer = GetPrivateProfileInt( sSec.c_str(), "Ver", 0, szFile) ; + ((CComboBox*)GetDlgItem( IDC_VER))->SetCurSel( nVer - 15) ; + int nLev = GetPrivateProfileInt( sSec.c_str(), "Lev", 0, szFile) ; + ((CComboBox*)GetDlgItem( IDC_LEV))->SetCurSel( nLev - 1) ; + int nExpTime = GetPrivateProfileInt( sSec.c_str(), "ExpDays", 0, szFile) ; + if ( nExpTime != 0) + ((CDateTimeCtrl*)GetDlgItem( IDC_EXPIRATION))->SetTime( &CTime( nExpTime * 24 * 3600)) ; + int nOpt1 = GetPrivateProfileInt( sSec.c_str(), "Opt1", 0, szFile) ; + for ( int i = IDC_CHECK01, j = 0 ; i <= IDC_CHECK16 ; ++ i, ++ j) { + if ( ( nOpt1 & ( 1 << j)) != 0) + ((CButton*)GetDlgItem( i))->SetCheck( BST_CHECKED) ; + else + ((CButton*)GetDlgItem( i))->SetCheck( BST_UNCHECKED) ; + } + int nOpt2 = GetPrivateProfileInt( sSec.c_str(), "Opt2", 0, szFile) ; + // check non ancora inseriti nel dialogo + int nOptExpTime = GetPrivateProfileInt( sSec.c_str(), "OptExpDays", 0, szFile) ; + if ( nOptExpTime != 0) + ((CDateTimeCtrl*)GetDlgItem( IDC_OPT_EXPIR))->SetTime( &CTime( nOptExpTime * 24 * 3600)) ; + return true ; +} + //---------------------------------------------------------------------------- void CKeyGeneratorDlg::OnGenerate( void) @@ -242,7 +303,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Dati cliente vuoto o con caratteri vietati (\\/:*?\"<>|)") ; return ; } - WritePrivateProfileStringUtf8( "Data", "Customer", sCust.c_str(), AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Customer", sCust.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero l'identificativo macchina (tipo 2) GetDlgItem( IDC_MACHID)->GetWindowTextW( wszTemp) ; string sMachId = wstrztoA( wszTemp) ; @@ -250,7 +311,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Id Macchina vuoto o errato") ; return ; } - WritePrivateProfileStringUtf8( "Data", "MachineId", sMachId.c_str(), AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "MachineId", sMachId.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero il prodotto GetDlgItem( IDC_PROD)->GetWindowTextW( wszTemp) ; string sProd = wstrztoA( wszTemp) ; @@ -258,9 +319,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Prodotto vuoto o errato") ; return ; } - int nSelProd = ((CComboBox*)GetDlgItem( IDC_PROD))->GetCurSel() ; - nSelProd = max( nSelProd, 0) ; - WritePrivateProfileInt( "Data", "SelProduct", nSelProd, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Product", sProd.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero la versione GetDlgItem( IDC_VER)->GetWindowTextW( wszTemp) ; string sVer = wstrztoA( wszTemp) ; @@ -268,9 +327,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Versione vuota o errata") ; return ; } - int nSelVer = ((CComboBox*)GetDlgItem( IDC_VER))->GetCurSel() ; - nSelVer = max( nSelVer, 0) ; - WritePrivateProfileInt( "Data", "SelVer", nSelVer, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Ver", sVer.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero il livello GetDlgItem( IDC_LEV)->GetWindowTextW( wszTemp) ; string sLev = wstrztoA( wszTemp) ; @@ -278,9 +335,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Livello vuoto o errato") ; return ; } - int nSelLev = ((CComboBox*)GetDlgItem( IDC_LEV))->GetCurSel() ; - nSelLev = max( nSelLev, 0) ; - WritePrivateProfileInt( "Data", "SelLev", nSelLev, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileStringUtf8( "Licence", "Lev", sLev.c_str(), AfxGetApp()->m_pszProfileName) ; // recupero la data di scadenza int nDays ; CTime tTime ; @@ -292,7 +347,7 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Inserisci una Data valida") ; return ; } - WritePrivateProfileInt( "Data", "ExpTime", int( tTime.GetTime()), AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileInt( "Licence", "ExpDays", nDays, AfxGetApp()->m_pszProfileName) ; // recupero le opzioni unsigned int nOpt1 = 0 ; for ( int i = IDC_CHECK01, j = 0 ; i <= IDC_CHECK16 ; ++ i, ++ j) { @@ -304,6 +359,8 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Inserisci Opzioni valide") ; return ; } + WritePrivateProfileInt( "Licence", "Opt1", nOpt1, AfxGetApp()->m_pszProfileName) ; + WritePrivateProfileInt( "Licence", "Opt2", nOpt2, AfxGetApp()->m_pszProfileName) ; // recupero la data di scadenza delle opzioni int nOptDays ; CTime tOptTime ; @@ -315,6 +372,11 @@ CKeyGeneratorDlg::OnGenerate( void) AfxMessageBox( L"Inserisci una Data valida per le opzioni") ; return ; } + WritePrivateProfileInt( "Licence", "OptExpDays", nOptDays, AfxGetApp()->m_pszProfileName) ; + // verifico la protezione + string sPKey = GetPrivateProfileStringUtf8( "General", "Key", "", AfxGetApp()->m_pszProfileName) ; + if ( VerifyKey( sPKey, 1230, 16, 10) != KEY_OK) + return ; // calcolo la chiave if ( ! mKey.CalcKey()) { AfxMessageBox( L"Errore nel calcolo della chiave") ; diff --git a/KeyGeneratorDlg.h b/KeyGeneratorDlg.h index 4b59f61..c6cb20d 100644 --- a/KeyGeneratorDlg.h +++ b/KeyGeneratorDlg.h @@ -19,11 +19,12 @@ class CKeyGeneratorDlg : public CDialogEx { public : - CKeyGeneratorDlg( CWnd* pParent = NULL) ; + CKeyGeneratorDlg( const std::string& sFileToOpen, CWnd* pParent = NULL) ; protected: virtual void OnCancel( void) ; afx_msg void OnClose( void) ; + afx_msg void OnOpenFile( void) ; afx_msg void OnGenerate( void) ; protected : @@ -32,8 +33,12 @@ class CKeyGeneratorDlg : public CDialogEx afx_msg void OnPaint( void) ; afx_msg HCURSOR OnQueryDragIcon( void) ; - protected : + private : + bool LoadFile( const char* szFile) ; + + private : HICON m_hIcon ; + std::string m_sFileToOpen ; DECLARE_MESSAGE_MAP() } ; diff --git a/KeyMaker.cpp b/KeyMaker.cpp index cea2ff3..f9cec26 100644 --- a/KeyMaker.cpp +++ b/KeyMaker.cpp @@ -164,28 +164,102 @@ KeyMaker::GetKey( string& sKey) bool KeyMaker::SaveData( void) { - // determino path file di salvataggio + // direttorio di salvataggio string sDataDir = GetPrivateProfileStringUtf8( "General", "DataDir", "C:/EgtProg/KeyGenerator", AfxGetApp()->m_pszProfileName) ; TrimRight( sDataDir, "/\\") ; - string sFile = sDataDir + "/" + m_sCustomer + ".Kge" ; - // apro il file - ofstream ofOut( stringtoW( sFile), ios_base::out | ios_base::app) ; + + // path file di log + string sLogFile = sDataDir + "\\" + m_sCustomer + ".Kge" ; + // leggo indice ultimo salvataggio + int nLast = GetPrivateProfileInt( "Index", "Last", 0, sLogFile.c_str()) ; + // assegno nome sezione + string sSec = "Licence" + ToString( nLast) ; + // se cambiati i dati, aggiungo nuova versione di licenza + if ( DiffLicence( sLogFile.c_str())) { + // salvo nuovo indice salvataggio + ++ nLast ; + WritePrivateProfileInt( "Index", "Last", nLast, sLogFile.c_str()) ; + // aggiorno nome sezione + sSec = "Licence" + ToString( nLast) ; + // salvo i nuovi dati + if ( ! WriteLicence( sSec.c_str(), sLogFile.c_str(), true)) + return false ; + } + + // path file licenza + string sLicFile = sDataDir + "\\" + m_sCustomer + "_" + sSec + ".lic" ; + // linea per evitare problemi con BOM + ofstream ofOut( stringtoW( sLicFile), ios_base::out | ios_base::trunc) ; if ( ! ofOut.good()) return false ; - // inserisco la data - ofOut << CurrDateTime() << endl ; - ofOut << "Customer=" << m_sCustomer << endl ; - ofOut << "MachineId=" << m_sMachineId2 << endl ; - ofOut << "ClearMachineId=" << m_sMachineId << endl ; - ofOut << "Product=" << m_nProd << endl ; - ofOut << "Ver=" << m_nVer << endl ; - ofOut << "Lev=" << m_nLev << endl ; - ofOut << "ExpDays=" << m_nExpDays << endl ; - ofOut << "Opt1=" << m_nOpt1 << endl ; - ofOut << "Opt2=" << m_nOpt2 << endl ; - ofOut << "OptExpDays=" << m_nOptExpDays << endl ; - ofOut << "Key=" << m_sKey << endl ; - // chiudo il file + ofOut << "; Commento per evitare BOM con UTF-8" << endl ; ofOut.close() ; - return true ; + // salvo i nuovi dati + return WriteLicence( "Licence", sLicFile.c_str(), false) ; } + +//---------------------------------------------------------------------------- +bool +KeyMaker::DiffLicence( const char* szFile) +{ + // leggo indice ultimo salvataggio + int nLast = GetPrivateProfileInt( "Index", "Last", 0, szFile) ; + // sezione ultimo salvataggio + string sSec = "Licence" + ToString( nLast) ; + // leggo i dati dell'ultimo salvataggio e li confronto con gli attuali + string sCust = GetPrivateProfileStringUtf8( sSec.c_str(), "Customer", "", szFile) ; + if ( sCust != m_sCustomer) + return true ; + string sMachId = GetPrivateProfileStringUtf8( sSec.c_str(), "MachineId", "", szFile) ; + if ( sMachId != m_sMachineId2) + return true ; + string sClearMachId = GetPrivateProfileStringUtf8( sSec.c_str(), "ClearMachineId", "", szFile) ; + if ( sClearMachId != m_sMachineId) + return true ; + int nProd = GetPrivateProfileInt( sSec.c_str(), "Product", 0, szFile) ; + if ( nProd != m_nProd) + return true ; + int nVer = GetPrivateProfileInt( sSec.c_str(), "Ver", 0, szFile) ; + if ( nVer != m_nVer) + return true ; + int nLev = GetPrivateProfileInt( sSec.c_str(), "Lev", 0, szFile) ; + if ( nLev != m_nLev) + return true ; + int nExpDays = GetPrivateProfileInt( sSec.c_str(), "ExpDays", 0, szFile) ; + if ( nExpDays != m_nExpDays) + return true ; + int nOpt1 = GetPrivateProfileInt( sSec.c_str(), "Opt1", 0, szFile) ; + if ( nOpt1 != m_nOpt1) + return true ; + int nOpt2 = GetPrivateProfileInt( sSec.c_str(), "Opt2", 0, szFile) ; + if ( nOpt2 != m_nOpt2) + return true ; + int nOptExpDays = GetPrivateProfileInt( sSec.c_str(), "OptExpDays", 0, szFile) ; + if ( nOptExpDays != m_nOptExpDays) + return true ; + string sKey = GetPrivateProfileStringUtf8( sSec.c_str(), "Key", "", szFile) ; + if ( sKey != m_sKey) + return true ; + return false ; +} + +//---------------------------------------------------------------------------- +bool +KeyMaker::WriteLicence( const char* szSec, const char* szFile, bool bAll) +{ + if ( bAll) + WritePrivateProfileStringUtf8( szSec, "Date", CurrDateTime().c_str(), szFile) ; + WritePrivateProfileStringUtf8( szSec, "Customer", m_sCustomer.c_str(), szFile) ; + WritePrivateProfileStringUtf8( szSec, "MachineId", m_sMachineId2.c_str(), szFile) ; + if ( bAll) + WritePrivateProfileStringUtf8( szSec, "ClearMachineId", m_sMachineId.c_str(), szFile) ; + WritePrivateProfileInt( szSec, "Product", m_nProd, szFile) ; + WritePrivateProfileInt( szSec, "Ver", m_nVer, szFile) ; + WritePrivateProfileInt( szSec, "Lev", m_nLev, szFile) ; + WritePrivateProfileInt( szSec, "ExpDays", m_nExpDays, szFile) ; + WritePrivateProfileInt( szSec, "Opt1", m_nOpt1, szFile) ; + WritePrivateProfileInt( szSec, "Opt2", m_nOpt2, szFile) ; + WritePrivateProfileInt( szSec, "OptExpDays", m_nOptExpDays, szFile) ; + WritePrivateProfileStringUtf8( szSec, "Key", m_sKey.c_str(), szFile) ; + return true ; +} \ No newline at end of file diff --git a/KeyMaker.h b/KeyMaker.h index da0e8d0..ceea631 100644 --- a/KeyMaker.h +++ b/KeyMaker.h @@ -33,6 +33,10 @@ class KeyMaker bool GetKey( std::string& sKey) ; bool SaveData( void) ; + private : + bool DiffLicence( const char* szFile) ; + bool WriteLicence( const char* szSec, const char* szFile, bool bAll) ; + private : std::string m_sCustomer ; std::string m_sMachineId ; diff --git a/resource.h b/resource.h index d0173a8..b7afe04 100644 Binary files a/resource.h and b/resource.h differ