24ed90d54e
Files correlati : ca2.exe Ricompilazione Demo : [ ] Commento : Corretto comportamento dei sorted_cursor per le maschere. Ora la ricerca viene fatta sulla chiave di sort. Aggiunta modalità batch delle transazioni. Viene generato un log e l'esecuzione non viene interrotta da segnalazioni ( Da collaudare meglio alla prima occasione). Resa possibile la visualizzazione di record bloccati da un altro utente. Queste funzionalità sono presenti nelle relapp dall patch 274 e successive. git-svn-id: svn://10.65.10.50/branches/R_10_00@23210 c028cbd2-c16b-5b4b-a496-9718f37d4682
313 lines
8.6 KiB
C++
Executable File
313 lines
8.6 KiB
C++
Executable File
#include <checks.h>
|
||
#include <config.h>
|
||
#include <diction.h>
|
||
#include <dongle.h>
|
||
#include <keys.h>
|
||
#include <strings.h>
|
||
|
||
#ifdef WIN32
|
||
#define buildmsg() char msg[1024];va_list argptr;va_start(argptr,fmt);_vsnprintf_s(msg,sizeof(msg),_TRUNCATE,fmt,argptr);va_end(argptr);msg[1023] = '\0';
|
||
#else
|
||
#define buildmsg() char msg[1024];va_list argptr;va_start(argptr,fmt);vsprintf(msg,fmt,argptr);va_end(argptr)
|
||
#endif
|
||
|
||
static bool __batch = false;
|
||
TString_array __errors;
|
||
TString_array __warnings;
|
||
|
||
bool is_batch()
|
||
{
|
||
return __batch;
|
||
}
|
||
|
||
void batch(bool on)
|
||
{
|
||
__batch = on;
|
||
if (on)
|
||
{
|
||
__errors.destroy();
|
||
__warnings.destroy();
|
||
}
|
||
}
|
||
|
||
TString_array & errors()
|
||
{
|
||
return __errors;
|
||
}
|
||
|
||
TString_array & warnings()
|
||
{
|
||
return __warnings;
|
||
}
|
||
|
||
|
||
|
||
// @doc EXTERNAL
|
||
|
||
// @msg fatal_box | Crea una finestra di ERRORE FATALE con il relativo messaggio
|
||
bool fatal_box(
|
||
const char* fmt, ...) // @parm Messaggio da stampare nella finestra
|
||
// (il formato e' come nella printf del C)
|
||
// @comm Il programma viene interrotto al momento in cui si e' verificato l'errore.
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
__errors.add(msg);
|
||
else
|
||
xvt_dm_post_fatal_exit(msg);
|
||
return false;
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
|
||
// @msg error_box | Crea una finestra di ERRORE con il relativo messaggio
|
||
bool error_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK
|
||
// e l'icona punto esclamativo.
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
__errors.add(msg);
|
||
else
|
||
xvt_dm_post_error(msg);
|
||
return false;
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
// @msg warning_box | Crea una finestra di ATTENZIONE con il relativo messaggio
|
||
bool warning_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK
|
||
// e l'icona punto di domanda.
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
__warnings.add(msg);
|
||
else
|
||
xvt_dm_post_warning(msg);
|
||
return 0;
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
// @msg message_box | Crea una finestra di INFORMAZIONE con relativo il messaggio
|
||
bool message_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK
|
||
// e l'icona informazioni.
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
__warnings.add(msg);
|
||
else
|
||
xvt_dm_post_message(msg);
|
||
return false;
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
// @msg sorry_box | Crea una finestra di SCUSE con il relativo messaggio
|
||
bool sorry_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK
|
||
// e l'icona informazioni.
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
__warnings.add(msg);
|
||
else
|
||
xvt_dm_post_note(msg);
|
||
return false;
|
||
}
|
||
|
||
// @msg yesno_box | Crea una finestra di RICHIESTA con il relativo messaggio
|
||
bool noyes_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
{
|
||
__errors.add(msg);
|
||
return true;
|
||
}
|
||
ASK_RESPONSE r = xvt_dm_post_ask("No", "Si", NULL, msg);
|
||
return r == RESP_DEFAULT;
|
||
}
|
||
|
||
// @msg noyesall_box | Crea una finestra di RICHIESTA con il relativo messaggio
|
||
int noyesall_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
{
|
||
__errors.add(msg);
|
||
return K_NO;
|
||
}
|
||
ASK_RESPONSE r = xvt_dm_post_ask("No", "Si", "Si Tutti", msg);
|
||
return r == RESP_DEFAULT ? K_YES : (r == RESP_2 ? K_NO : K_SPACE);
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
// @msg yesno_box | Crea una finestra di RICHIESTA con il relativo messaggio
|
||
bool yesno_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
// @comm Se si opera in ambiente Windows crea la finestra con i bottni SI e NO
|
||
// e l'icona col punto di domanda.
|
||
//
|
||
// @rdesc Ritorna il risultato della richiesta:
|
||
//
|
||
// @flag 1 | Se viene premuto il taso SI
|
||
// @flag 0 | Se viene premuto il taso NO
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
{
|
||
__errors.add(msg);
|
||
return false;
|
||
}
|
||
ASK_RESPONSE r = xvt_dm_post_ask("Si", "No", NULL, msg);
|
||
return r == RESP_DEFAULT;
|
||
}
|
||
|
||
// @msg yesnoall_box | Crea una finestra di RICHIESTA con il relativo messaggio
|
||
int yesnoall_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
{
|
||
__errors.add(msg);
|
||
return K_NO;
|
||
}
|
||
ASK_RESPONSE r = xvt_dm_post_ask("No", "Si", "No Tutti", msg);
|
||
return r == RESP_DEFAULT ? K_NO : (r == RESP_2 ? K_YES : K_SPACE);
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
// @msg yesnofatal_box | Crea una finestra di RICHIESTA con il relativo
|
||
// messaggio, ma permette di terminare il programma
|
||
bool yesnofatal_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
|
||
// @comm Se si opera in ambiente Windows crea la finestra con i bottoni SI e NO
|
||
// e l'icona col punto di domanda.
|
||
// <nl>A differenza della <m yesno_box> permette di terminare il programma
|
||
// se viene premuto il tasto SI
|
||
//
|
||
// @rdesc Ritorna il risultato della richiesta:
|
||
//
|
||
// @flag 1 | Se viene premuto il tasto SI
|
||
// @flag 0 | Se viene premuto il tasto NO
|
||
//
|
||
// @xref <m yesno_box> <m yesnofatal_box>
|
||
{
|
||
buildmsg();
|
||
|
||
#ifdef DBG
|
||
char user[32]; xvt_sys_get_user_name(user, sizeof(user));
|
||
char s[sizeof(msg)+sizeof(user)];
|
||
sprintf_s(s, sizeof(s), "Sai %s cos'<27> successo?\n%s\nVuoi perseverare?", user, msg);
|
||
const bool ret = yesno_box(s);
|
||
if (!ret)
|
||
#endif
|
||
fatal_box(msg);
|
||
|
||
return false;
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
// @msg yesnocancel_box | Crea una finestra di RICHIESTA con il relativo messaggio
|
||
int yesnocancel_box(
|
||
const char* fmt, // @parm Messaggio da stampare nella finestra
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
// @comm Se si opera in ambiente Windows crea la finestra con i bottoni SI e NO
|
||
// e l'icona col punto di domanda.
|
||
//
|
||
// @rdesc Ritorna il risultato della richiesta:
|
||
//
|
||
// @flag K_YES | Se viene premuto il tasto SI
|
||
// @flag K_NO | Se viene premuto il tasto NO
|
||
// @flag K_ESC | Se viene premuto il tosto ESC
|
||
//
|
||
// @xref <m yesno_box> <m yesnofatal_box>
|
||
{
|
||
buildmsg();
|
||
if (__batch)
|
||
{
|
||
__errors.add(msg);
|
||
return K_NO;
|
||
}
|
||
ASK_RESPONSE r = xvt_dm_post_ask("Si", "No", "Annulla", msg);
|
||
return r == RESP_DEFAULT ? K_YES : (r == RESP_2 ? K_NO : K_ESC);
|
||
}
|
||
|
||
bool cantread_box(const char* filename)
|
||
{
|
||
return error_box(FR("Impossibile leggere '%s'"), filename);
|
||
}
|
||
|
||
bool cantwrite_box(const char* filename)
|
||
{
|
||
return error_box(FR("Impossibile scrivere '%s'"), filename);
|
||
}
|
||
|
||
bool cantaccess_box(const char* filename)
|
||
{
|
||
if (filename == NULL || *filename < ' ')
|
||
filename = TR("questa funzione");
|
||
return error_box(FR("L'utente %s non puo' accedere a %s"), (const char*)user(), filename);
|
||
}
|
||
|
||
bool delete_box(const char* fmt, ...)
|
||
{
|
||
ASK_RESPONSE r = RESP_DEFAULT;
|
||
buildmsg();
|
||
|
||
const bool no_def = ini_get_bool(CONFIG_GUI, "Colors", "NoOnDelete",
|
||
dongle().number() > 0 && dongle().active(LVAUT));
|
||
if (no_def)
|
||
r = xvt_dm_post_ask("No", "Si", NULL, msg);
|
||
else
|
||
r = xvt_dm_post_ask("Si", "No", NULL, msg);
|
||
return r == RESP_DEFAULT;
|
||
}
|
||
|
||
// @doc EXTERNAL
|
||
// @msg __trace | Permette di mandare dei messaggi nel file trace.log
|
||
bool __trace(
|
||
const char* fmt, // @parm Messaggio da stampare
|
||
...) // @parmvar Uno o piu' parametri corrispondenti ai codici in <p fmt>
|
||
// @comm Usato in fase di debug, permette di vedere se il programma ha
|
||
// fatto certe operazioni (deve essere definito il simbolo TRC in
|
||
// fase di compilazione).
|
||
//
|
||
// @rdesc Ritorna non 0 se riesca ad aprire il file trace.log
|
||
{
|
||
static FILE* f = NULL;
|
||
if (f == NULL)
|
||
fopen_s(&f, "trace.log", "w");
|
||
if (f != NULL)
|
||
{
|
||
buildmsg();
|
||
fprintf(f, "%s\n", msg);
|
||
fflush(f);
|
||
}
|
||
return f != NULL;
|
||
}
|
||
|
||
bool __tracemem(const char* msg)
|
||
{
|
||
unsigned long mem = xvt_sys_get_free_memory_kb();
|
||
return __trace("%5lu Kb - %s", mem, msg);
|
||
}
|
||
|