#include "comandi.h"
// un puntatore a un buffer per il percorso del file
static char *gPercFile = NULL;
void Codifica( HWND hwnd ) {
char *percFile;
try {
CDF *pCdf = (CDF*) GetWindowLong( hwnd, GWL_USERDATA );
pCdf->elabora();
percFile = ScegliFile( hwnd, kCDFEstensioneFileCodificato,
CreaPercorsoFileOutput(kCDFEstensioneFileCodificato) );
pCdf->salva_dati( percFile );
AggiornaPulsanti( hwnd, pCdf );
} catch( const char *strErr ) {
Errore( strErr, hwnd );
}
}
void Decodifica( HWND hwnd ) {
char *percFile;
try {
CDF *pCdf = (CDF*) GetWindowLong( hwnd, GWL_USERDATA );
pCdf->elabora();
percFile = ScegliFile( hwnd, kCDFEstensioneFileInChiaro,
CreaPercorsoFileOutput(kCDFEstensioneFileInChiaro) );
pCdf->salva_dati( percFile );
AggiornaPulsanti( hwnd, pCdf );
} catch( const char *strErr ) {
Errore( strErr, hwnd );
}
}
void CaricaChiave( HWND hwnd ) {
unsigned long lStrChiave;
char *strChiave = RicavaAppuntiTxt( NULL, &lStrChiave );
CDF *pCdf = (CDF*) GetWindowLong( hwnd, GWL_USERDATA );
try {
pCdf->imposta_chiave( strChiave, lStrChiave );
delete[] strChiave;
} catch( const char *strErr ) {
delete[] strChiave;
Errore( strErr, hwnd );
}
PopolaListaCaratteriMancanti( hwnd, pCdf );
AggiornaInformazioniChiave( hwnd, pCdf );
AggiornaPulsanti( hwnd, pCdf );
}
void CaricaDati( HWND hwnd, int tipoDati ) {
delete[] gPercFile;
if( tipoDati == kCDFInChiaro )
gPercFile = ScegliFile( hwnd, kCDFEstensioneFileInChiaro );
else gPercFile = ScegliFile( hwnd, kCDFEstensioneFileCodificato );
if( gPercFile == NULL ) return;
CompletaCaricamentoDati( hwnd, gPercFile );
}
void CaricaDati( HWND hwnd, LPSTR dd ) {
delete[] gPercFile;
gPercFile = RicavaPrimoFileTrascinato(dd);
if( gPercFile == NULL ) return;
CompletaCaricamentoDati( hwnd, gPercFile );
}
void CompletaCaricamentoDati( HWND hwnd, const char *percFile ) {
if( percFile == NULL ) return;
const char *est = TrovaEstensione( percFile );
if( est == NULL ) return;
int tipoDati = DeterminaTipoDati( est );
if( tipoDati == kCDFNoDati ) return;
unsigned long dimFile;
char *pDati = CaricaDatiDaFile( percFile, &dimFile );
CDF *pCdf = (CDF*) GetWindowLong( hwnd, GWL_USERDATA );
if( pDati != NULL ) {
try {
pCdf->imposta_dati( tipoDati, pDati, dimFile );
delete[] pDati;
} catch( const char *strErr ) {
delete[] pDati;
Errore( strErr, hwnd );
}
}
else {
Errore( "File non caricato.", hwnd );
return;
}
PopolaListaCaratteriMancanti( hwnd, pCdf );
AggiornaInformazioniChiave( hwnd, pCdf );
AggiornaPulsanti( hwnd, pCdf );
}
char *CaricaDatiDaFile( const char *nomeFile, unsigned long *dimFile ) {
FILE *f = fopen( nomeFile, "r" );
if( f != NULL ) {
char *d = NULL;
unsigned long i, l;
int c;
for( l=0, c=fgetc(f); c!=EOF; c=fgetc(f), ++l );
rewind(f);
try {
d = new char[l+1];
for( i=0; i<l; ++i )
d[i] = fgetc(f);
d[i] = '\0';
*dimFile = i;
} catch( ... ) {
fclose(f);
return NULL;
}
fclose(f);
return d;
}
else {
return NULL;
}
}
const char *TrovaEstensione( const char *s, unsigned long l ) {
if( s == NULL ) return NULL;
l = l!=0xFFFFFFFF ? l : strlen( s );
const char *p = s + l;
while( *(--p)!='.' && l-- );
if( l == 0xFFFFFFFF )
return NULL;
else return ++p;
}
int DeterminaTipoDati( const char *est ) {
if( !strcmp(est,kCDFEstensioneFileCodificato) )
return kCDFCodificati;
else if( !strcmp(est,kCDFEstensioneFileInChiaro) )
return kCDFInChiaro;
else return kCDFNoDati;
}
char *CreaPercorsoFileOutput( const char *estensione ) {
unsigned long lPercFile = strlen( gPercFile );
const char *p = TrovaEstensione( gPercFile );
if( p == NULL ) {
delete[] gPercFile;
gPercFile = NULL;
return gPercFile;
}
unsigned long lVecchiaEstensione = strlen( p );
unsigned long lNuovaEstensione = strlen( estensione );
try {
char *pfu = new char[lPercFile-lVecchiaEstensione+lNuovaEstensione+1];
strcpy( pfu, gPercFile );
strcpy( pfu+(p-gPercFile), estensione );
delete[] gPercFile;
gPercFile = pfu;
return gPercFile;
} catch( ... ) {
return NULL;
}
}