From 06f27089fbf417ae62eb0b73a8218aff81b554f6 Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Tue, 29 Mar 2022 17:05:25 +0200 Subject: [PATCH] Patch level : 12.0 1130 Files correlati : ba1.exe Commento: Aggiunta una funzione "Recupero" per recuperare files che danno errori sulla lunghezza del record. Interno E' protetta da password [ADMIN e (giorno+mese)] --- src/ba/ba1100.cpp | 926 ++++++++++++++++++++++++---------------------- src/ba/ba1100.h | 159 +++++--- src/ba/ba1100a.h | 1 + src/ba/ba1101.cpp | 19 +- 4 files changed, 615 insertions(+), 490 deletions(-) diff --git a/src/ba/ba1100.cpp b/src/ba/ba1100.cpp index decb7c941..718983cf0 100755 --- a/src/ba/ba1100.cpp +++ b/src/ba/ba1100.cpp @@ -1,11 +1,11 @@ #ifdef WIN32 - #define _CRT_NONSTDC_NO_DEPRECATE 1 - #define _CRT_SECURE_NO_WARNINGS 1 - #include - #include +#define _CRT_NONSTDC_NO_DEPRECATE 1 +#define _CRT_SECURE_NO_WARNINGS 1 +#include +#include #else - #include - #include +#include +#include #endif #include @@ -18,7 +18,9 @@ #include #include #include +#include #include + #include #ifdef WIN32 @@ -35,69 +37,16 @@ #define Dir_file "dir.gen" #define Trc_file "trc.gen" -class TManutenzione_app : public TSkeleton_application -{ - TDir_sheet* _browse; - TArray _dirs; - TArray _recs; - TMask* _mask; - long _firm; - long _level; - long _history_firm; - TRec_sheet* _rec; - TLog_report* _log; - bool _print_log; - - bool _superprassi; - -protected: - virtual void main_loop(); - virtual bool create () ; - virtual bool destroy(); - void insert_riga(long, TToken_string&); - void edit_riga(long, TToken_string&); - void edit_riga(const TString&); - void delete_riga(long); - virtual bool extended_firm() const { return true; } - - bool set_converting(); - bool reset_converting(); - - bool try_to_recover(TSystemisamfile& f, int err); - void update(); - void update_dir(); - void convert_dir(); - virtual void print(); - virtual void do_print(TPrinter & p, TRec_sheet & r); - const char* dumpfilename(const FileDes& dep) const; - void load_des(); - void open_history(); - void put_history(const char* firm); - void close_history(); - void dump_trc(const char * dir, const bool des_too, const long modules); - void repair_file(int i); - void save_file(const char * file); - - void open_log(); - void write_log(const char* line, const int severity = 0); - void close_log(); - - bool moveable_file(int file) const; -public: - - TManutenzione_app(); -}; - HIDDEN bool browse_file_handler(TMask_field& f, KEY k) { if (k == K_F9) - { + { FILE_SPEC fs; memset(&fs, 0, sizeof(FILE_SPEC)); TFilename fname = f.get(); fname.ext("dbf"); xvt_fsys_convert_str_to_fspec(fname, &fs); xvt_fsys_get_default_dir(&fs.dir); if (xvt_dm_post_file_open(&fs, TR("Selezione file")) == FL_OK) - { + { TFilename n; xvt_fsys_convert_dir_to_str(&fs.dir, n.get_buffer(n.size()), n.size()); n.add(fs.name); @@ -105,7 +54,6 @@ HIDDEN bool browse_file_handler(TMask_field& f, KEY k) } f.set_focus(); } - return true; } @@ -117,51 +65,51 @@ TManutenzione_app::TManutenzione_app() : _browse(NULL), _mask(NULL), _firm(0), _ strncpy_s(fd.SysName, "$dir.gen", sizeof(fd.SysName)); strncpy_s(fd.Des, "Directory", sizeof(fd.Des)); strncpy_s(fd.FCalc, "0", sizeof(fd.FCalc)); - strncpy_s(fd.GenPrompt,"", sizeof(fd.GenPrompt)); - fd.LenR =160; + strncpy_s(fd.GenPrompt, "", sizeof(fd.GenPrompt)); + fd.LenR = 160; fd.EOD = fd.EOX = 1L; fd.Flags = 0; - + #ifdef WIN32 - int handle = sopen(Dir_file, O_RDWR|O_BINARY|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE); + int handle = sopen(Dir_file, O_RDWR | O_BINARY | O_CREAT, SH_DENYNO, S_IREAD | S_IWRITE); #else - int handle = open(Dir_file, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); + int handle = open(Dir_file, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); #endif if (handle != -1) { - if (write( handle, &fd, sizeof(FileDes)) == -1) - fatal_box("Impossibile scrivere il file dir.gen per dati standard: errore %d",errno); + if (write(handle, &fd, sizeof(FileDes)) == -1) + fatal_box("Impossibile scrivere il file dir.gen per dati standard: errore %d", errno); close(handle); } - else - fatal_box("Impossibile creare il file dir.gen per dati standard: errore %d",errno); + else + fatal_box("Impossibile creare il file dir.gen per dati standard: errore %d", errno); } if (!fexist(Trc_file)) { TTrec r; RecDes& rd = r.rec(); #ifdef WIN32 - int handle = sopen(Trc_file, O_RDWR|O_BINARY|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE); + int handle = sopen(Trc_file, O_RDWR | O_BINARY | O_CREAT, SH_DENYNO, S_IREAD | S_IWRITE); #else - int handle = open(Trc_file, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO); + int handle = open(Trc_file, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); #endif if (handle != -1) { - if (write( handle, (void*)&rd, sizeof(RecDes)) == -1) - fatal_box("Impossibile scrivere il file trc.gen per dati standard: errore %d",errno); + if (write(handle, (void*)&rd, sizeof(RecDes)) == -1) + fatal_box("Impossibile scrivere il file trc.gen per dati standard: errore %d", errno); close(handle); } - else - fatal_box("Impossibile creare il file trc.gen per dati standard: errore %d",errno); + else + fatal_box("Impossibile creare il file trc.gen per dati standard: errore %d", errno); } } void TManutenzione_app::do_print(TPrinter & p, TRec_sheet & r) { - const char* table[] = {"", TR("Alfanumerico"), TR("Intero"), TR("Intero Lungo"), + const char* table[] = { "", TR("Alfanumerico"), TR("Intero"), TR("Intero Lungo"), TR("Reale"), TR("Data"), TR("Intero"), TR("Carattere"), - TR("Booleano"), TR("Intero Zerofilled"), TR("Intero Lungo Zerofilled"),TR("Memo")}; + TR("Booleano"), TR("Intero Zerofilled"), TR("Intero Lungo Zerofilled"),TR("Memo") }; TPrintrow row; TToken_string s; TParagraph_string d("", 25); @@ -180,7 +128,7 @@ void TManutenzione_app::do_print(TPrinter & p, TRec_sheet & r) row.reset(); if (istab) - row.put(format(FR("Lista tabella %s "), (const char *) tab), 2); + row.put(format(FR("Lista tabella %s "), (const char *)tab), 2); else row.put(format(FR("Lista tracciato %s (%s)"), dir.des(), dir.name()), 2); row.put(TR("Pag. @#"), 69); @@ -199,10 +147,10 @@ void TManutenzione_app::do_print(TPrinter & p, TRec_sheet & r) row.put(riga, 1); p.setheaderline(3, row); p.setheaderline(5, row); - + int i; - - for (i = 0; i < rec.fields(); i ++) + + for (i = 0; i < rec.fields(); i++) { row.reset(); s = rec.fielddef(i); @@ -228,7 +176,7 @@ void TManutenzione_app::do_print(TPrinter & p, TRec_sheet & r) } p.print(row); wd = d.get(); - while(wd != NULL) + while (wd != NULL) { row.reset(); row.put(wd, 53); @@ -236,25 +184,25 @@ void TManutenzione_app::do_print(TPrinter & p, TRec_sheet & r) wd = d.get(); } } - } - + } + row.reset(); p.print(row); - + row.put(HR("Espressione chiave"), 7); row.put(HR("Duplicabile"), 68); p.setheaderline(4, row); if (p.rows_left() < 5) p.formfeed(); - else + else { p.print(row); row.put(riga, 1); - p.print(row); - } - - for (i = 0; i < rec.keys(); i ++) + p.print(row); + } + + for (i = 0; i < rec.keys(); i++) { row.reset(); s = rec.keydef(i); @@ -292,7 +240,7 @@ void TManutenzione_app::print() } } } - + TString_array list; items = list_files("recdesc/d???.des", list); if (items > 0) @@ -311,18 +259,17 @@ void TManutenzione_app::print() } } } - else + else do_print(p, *_rec); p.close(); } bool TManutenzione_app::create() // initvar e arrmask { - _firm = get_firm(); - - TString sw(argc()>2 ? argv(2) : ""); + TString sw(argc() > 2 ? argv(2) : ""); // Posso fare le operazione avanzate solo se sono ammistratore // e NON mi trovo su di una installazione di tipo client + xvt_vobj_show(TASK_WIN); _superprassi = user() == ::dongle().administrator() && !::dongle().demo(); if (_superprassi) @@ -330,7 +277,7 @@ bool TManutenzione_app::create() // initvar e arrmask const int type = ini_get_int(CONFIG_INSTALL, "Main", "Type"); _superprassi = (type == 1) || (type == 2); } - + if (argc() > 2 && sw == "-C") { update(); @@ -356,14 +303,15 @@ bool TManutenzione_app::create() // initvar e arrmask modules = atol(argv(5)); prefix().set(""); load_des(); - dump_trc(dir,des_too,modules); + dump_trc(dir, des_too, modules); return false; } else if (!::dongle().demo() && !set_firm()) return false; + _firm = atol(prefix().name()); load_des(); - + _mask = new TMask("ba1100a"); _browse = new TDir_sheet(TR("Manutenzione file di sistema"), _superprassi); if (_superprassi) @@ -396,7 +344,7 @@ void TManutenzione_app::open_log() } void TManutenzione_app::write_log(const char* line, const int severity) -{ +{ if (_log != NULL) { _log->log(severity, line); @@ -417,30 +365,30 @@ void TManutenzione_app::close_log() } void TManutenzione_app::save_file(const char * file) -{ +{ TFilename n(file); const TFilename source_path(n.path()); TFilename dest_path(source_path); - + n.ext("*"); TString_array files_to_copy; - + list_files(n, files_to_copy); - dest_path << "sav"; - + dest_path << "sav"; + if (!dest_path.exist()) make_dir(dest_path); - + FOR_EACH_ARRAY_ROW_BACK(files_to_copy, row, fname) - { + { TFilename source_file(*fname); - TFilename dest_file(dest_path); dest_file << '/' << (const char *) source_file.name(); - fcopy((const char *) source_file, dest_file); + TFilename dest_file(dest_path); dest_file << '/' << (const char *)source_file.name(); + fcopy((const char *)source_file, dest_file); } } -void TManutenzione_app::insert_riga (long riga_sel, TToken_string& riga) +void TManutenzione_app::insert_riga(long riga_sel, TToken_string& riga) { const int logicnum = int(riga_sel) + 1; const int num_files = (int)_browse->items(); @@ -449,30 +397,30 @@ void TManutenzione_app::insert_riga (long riga_sel, TToken_string& riga) _mask->disable(DLG_RECORD); _mask->disable(DLG_LOAD); _mask->disable(DLG_DUMP); - _mask->show(F_TAB, (logicnum >= LF_TABGEN && logicnum <= LF_TAB)||(logicnum == LF_TABMOD)); + _mask->show(F_TAB, (logicnum >= LF_TABGEN && logicnum <= LF_TAB) || (logicnum == LF_TABMOD)); _mask->hide(FLD_EXTEND); _mask->hide(FLD_EOX); - _mask->set (FLD_NUM, riga.get(0)); - _mask->reset (F_TAB); + _mask->set(FLD_NUM, riga.get(0)); + _mask->reset(F_TAB); if (_mask->run() == K_ENTER) { /* shift di uno in avanti degli elementi del direttorio partendo dall'ultimo */ - for (int i=num_files; i>=logicnum; i--) + for (int i = num_files; i >= logicnum; i--) { - _browse->dir().get (i, _nolock, _nordir, _sysdirop); - _browse->dir().put (i + 1, _nordir, _sysdirop); - _browse->rec().get (i); - _browse->rec().put (i + 1); + _browse->dir().get(i, _nolock, _nordir, _sysdirop); + _browse->dir().put(i + 1, _nordir, _sysdirop); + _browse->rec().get(i); + _browse->rec().put(i + 1); } _browse->dir().set(_mask->get(FLD_NOME), _mask->get_long(FLD_EOD), - _mask->get_long(FLD_FLAG), _mask->get (FLD_DESC), - _mask->get (FLD_FORMULA)); + _mask->get_long(FLD_FLAG), _mask->get(FLD_DESC), + _mask->get(FLD_FORMULA)); _browse->dir().put(logicnum, _nordir, _sysdirop); _browse->rec().zero(); _browse->rec().put(logicnum); _browse->dir().get(LF_DIR); - _browse->dir().set_eod(_browse->dir().eod()+1); + _browse->dir().set_eod(_browse->dir().eod() + 1); _browse->set_items(_browse->dir().eod()); _browse->dir().put(LF_DIR); } @@ -480,32 +428,32 @@ void TManutenzione_app::insert_riga (long riga_sel, TToken_string& riga) void TManutenzione_app::open_history() { - FILE *fp = fopen(History_file,"r"); + FILE *fp = fopen(History_file, "r"); if (fp != NULL) { char line[16]; - fgets(line,16,fp); + fgets(line, 16, fp); int l = strlen(line); - line[l > 0 ? l -1 : 0 ] = '\0'; - if (l==0) + line[l > 0 ? l - 1 : 0] = '\0'; + if (l == 0) _history_firm = -1; else _history_firm = atol(line); } else { - fp = fopen(History_file,"w"); + fp = fopen(History_file, "w"); _history_firm = -1; } - fclose (fp); + fclose(fp); } void TManutenzione_app::put_history(const char* firm) { - FILE * fp = fopen(History_file,"w"); - fprintf(fp,"%s\n",firm); - fclose (fp); + FILE * fp = fopen(History_file, "w"); + fprintf(fp, "%s\n", firm); + fclose(fp); } void TManutenzione_app::close_history() @@ -518,7 +466,7 @@ void TManutenzione_app::dump_trc(const char * dir, const bool des_too, const lon { TDir d; d.get(LF_DIR); - const int items = (int) d.eod(); + const int items = (int)d.eod(); const long flags = d.flags(); // livello archivi TFilename fn(dir); fn << "/level.dir"; @@ -526,12 +474,12 @@ void TManutenzione_app::dump_trc(const char * dir, const bool des_too, const lon ofstream of(fn); of << flags << '\n'; } - + TString s(TR("Scarico dei tracciati standard in ")); s << dir; TProgind p(items ? items : 1, s, false, true); p.setstatus(1); - for (int i=2;i<=items;i++) //Salta il primo (dir.gen) + for (int i = 2; i <= items; i++) //Salta il primo (dir.gen) { p.addstatus(1); TTrec& rc = (TTrec&)_recs[i]; @@ -541,16 +489,16 @@ void TManutenzione_app::dump_trc(const char * dir, const bool des_too, const lon TFilename descfname; descfname.format("%s/d%d.des", DESCDIR, i); if (!fexist(descfname)) // crea la descrizione se non esiste - { - FILE * fd = fopen(descfname, "w"); + { + FILE * fd = fopen(descfname, "w"); if (fd != NULL) fclose(fd); } - TConfig conf_des(descfname,DESCPAR); - + TConfig conf_des(descfname, DESCPAR); + if (des_too) rc.set_des(&conf_des); fn = dir; - fn << "/f";fn << i; + fn << "/f"; fn << i; fn.ext("trr"); ofstream out(fn); out << rc; @@ -573,24 +521,24 @@ const char* TManutenzione_app::dumpfilename(const FileDes& dep) const return tmp; } -void TManutenzione_app::edit_riga (const TString& name) +void TManutenzione_app::edit_riga(const TString& name) { const TFilename n(name); TExternisamfile* f = new TExternisamfile(n); - - _mask->set (FLD_NUM, ""); - _mask->set (FLD_NOME, n); - _mask->set (FLD_EOD, f->items()); - _mask->set (FLD_EOX, f->items()); - _mask->set (F_LEN, f->curr().len()); - _mask->set (FLD_DESC, f->description()); - _mask->set (FLD_FORMULA, ""); - _mask->set (FLD_FLAG, ""); - _mask->reset (FLD_EXTEND); - _mask->reset (F_TAB); + + _mask->set(FLD_NUM, ""); + _mask->set(FLD_NOME, n); + _mask->set(FLD_EOD, f->items()); + _mask->set(FLD_EOX, f->items()); + _mask->set(F_LEN, f->curr().len()); + _mask->set(FLD_DESC, f->description()); + _mask->set(FLD_FORMULA, ""); + _mask->set(FLD_FLAG, ""); + _mask->reset(FLD_EXTEND); + _mask->reset(F_TAB); _mask->disable(-1); _mask->enable(DLG_RECORD, _superprassi); - + KEY tasto = _mask->run(); switch (tasto) { @@ -612,7 +560,7 @@ void TManutenzione_app::edit_riga (const TString& name) } } -void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) +void TManutenzione_app::edit_riga(long riga_sel, TToken_string& riga) { const int logicnum = int(riga_sel) + 1; @@ -622,16 +570,16 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) _mask->enable(DLG_DUMP); _mask->show(F_TAB, logicnum >= LF_TABGEN && logicnum <= LF_TAB); - _mask->set (FLD_NUM, riga.get(0)); - _mask->set (FLD_NOME, riga.get()); - _mask->set (FLD_EOD, riga.get()); - _mask->set (FLD_EOX, riga.get()); - _mask->set (F_LEN, riga.get()); - _mask->set (FLD_DESC, riga.get()); - _mask->set (FLD_FORMULA, riga.get()); - _mask->set (FLD_FLAG, riga.get()); - _mask->reset (FLD_EXTEND); - _mask->reset (F_TAB); + _mask->set(FLD_NUM, riga.get(0)); + _mask->set(FLD_NOME, riga.get()); + _mask->set(FLD_EOD, riga.get()); + _mask->set(FLD_EOX, riga.get()); + _mask->set(F_LEN, riga.get()); + _mask->set(FLD_DESC, riga.get()); + _mask->set(FLD_FORMULA, riga.get()); + _mask->set(FLD_FLAG, riga.get()); + _mask->reset(FLD_EXTEND); + _mask->reset(F_TAB); const TRecnotype oldeox = _mask->get_long(FLD_EOX); const bool com = prefix().is_com() || !*prefix().name(); @@ -668,11 +616,11 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) case K_ENTER: { FileDes dep; - strncpy (dep.SysName,_mask->get(FLD_NOME), sizeof(dep.SysName)); - dep.EOD = atol(_mask->get (FLD_EOD)); - dep.Flags = atol(_mask->get (FLD_FLAG)); - strncpy (dep.Des,_mask->get (FLD_DESC), sizeof(dep.Des)); - strncpy (dep.FCalc,_mask->get (FLD_FORMULA), sizeof(dep.FCalc)); + strncpy(dep.SysName, _mask->get(FLD_NOME), sizeof(dep.SysName)); + dep.EOD = atol(_mask->get(FLD_EOD)); + dep.Flags = atol(_mask->get(FLD_FLAG)); + strncpy(dep.Des, _mask->get(FLD_DESC), sizeof(dep.Des)); + strncpy(dep.FCalc, _mask->get(FLD_FORMULA), sizeof(dep.FCalc)); const TRecnotype eox = _mask->get_bool(FLD_EXTEND) ? _mask->get_long(FLD_EOX) : oldeox; TDir& dir = _browse->dir(); @@ -689,7 +637,7 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) TFilename f_name(d.name()); f_name.ext("dbf"); - if (!f_name.exist()) + if (!f_name.exist()) f.build(); _browse->dir().get(logicnum, _nolock, _nordir, _sysdirop); @@ -698,7 +646,7 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) { f.packfile(true); f.packindex(true); -// le 4 righe seguenti servono per allineare i valori di EOD ed EOX dopo una compattazione forzata + // le 4 righe seguenti servono per allineare i valori di EOD ed EOX dopo una compattazione forzata dir.get(logicnum, _nolock, _nordir, _sysdirop); dir.set(dep.SysName, dep.EOD, dep.Flags, dep.Des, dep.FCalc); dir.set_eox(_browse->dir().eod()); @@ -732,8 +680,8 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) const int keyno = m.get_int(FLD_KEYNO); const TString4 tabella(_mask->get(F_TAB)); if (tabella.not_empty()) - { - TToken_string filter; + { + TToken_string filter; filter.add("COD"); filter.add(tabella); f.dump(nout, keyno, fs, fd, rs, true, withdel, filter); } @@ -770,19 +718,19 @@ void TManutenzione_app::edit_riga (long riga_sel, TToken_string& riga) } } -void TManutenzione_app::delete_riga (long riga_sel) +void TManutenzione_app::delete_riga(long riga_sel) { const int num_files = (int)_browse->items(); const int logicnum = int(riga_sel) + 1; - if (riga_sel == num_files-1 && yesno_box(FR("Si conferma l'eliminazione del file %d"), logicnum)) + if (riga_sel == num_files - 1 && yesno_box(FR("Si conferma l'eliminazione del file %d"), logicnum)) { /* shift di uno in avanti degli elementi del direttorio partendo dall'ultimo */ for (int i = logicnum + 1; i <= num_files; i++) { - _browse->dir().get (i, _nolock, _nordir, _sysdirop); - _browse->dir().put (i - 1, _nordir, _sysdirop); - _browse->rec().get (i); - _browse->rec().put (i - 1); + _browse->dir().get(i, _nolock, _nordir, _sysdirop); + _browse->dir().put(i - 1, _nordir, _sysdirop); + _browse->rec().get(i); + _browse->rec().put(i - 1); } _browse->dir().get(LF_DIR); @@ -790,7 +738,7 @@ void TManutenzione_app::delete_riga (long riga_sel) TTrec r; r.zero(); r.put(_browse->dir().eod()); - _browse->dir().set_eod(_browse->dir().eod()-1); + _browse->dir().set_eod(_browse->dir().eod() - 1); _browse->set_items(_browse->dir().eod()); _browse->dir().put(LF_DIR); _browse->force_update(); @@ -807,10 +755,10 @@ bool TManutenzione_app::try_to_recover(TSystemisamfile& f, int err) } void TManutenzione_app::repair_file(int i) -{ +{ TString s(_MAX_PATH + 50); // Messaggio di log - - TDir d(i); + + TDir d(i); const char* n = d.filename(); if (d.eod() == 0) @@ -829,13 +777,13 @@ void TManutenzione_app::repair_file(int i) d.get(i, _nolock, _nordir, _sysdirop); save_file(n); TExternisamfile ef(n); - + const RecDes& rd = ef.curr().rec_des(); - TTrec rec; rec.get(i); + TTrec rec; rec.get(i); const int oldreclen = rec.len(); rec.rec() = rd; - rec.put(i); - + rec.put(i); + const int reclen = rec.len(); d.set_len(reclen); d.put(i, _nordir, _sysdirop); @@ -855,210 +803,288 @@ bool TManutenzione_app::moveable_file(int file) const void TManutenzione_app::update_dir() { - if (prefix().get_codditta() <= _history_firm) - return; + if (prefix().get_codditta() <= _history_firm) + return; - const TString pref(prefix().name()); - const bool is_com = prefix().is_com(); - const int last_new_item = _dirs.last(); //quale è il numero dell'ultimo file nuovo? + const TString pref(prefix().name()); + const bool is_com = prefix().is_com(); + const int last_new_item = _dirs.last(); //quale è il numero dell'ultimo file nuovo? - TDir d(LF_DIR); // equivale a d.get(LF_DIR, _nolock, _nordir, _sysdirop); - const int last_curr_item = (int)d.eod(); //quale è il numero dell'ultimo file attualmente presente - - const int update_items = (last_new_item < last_curr_item) ? last_new_item : last_curr_item; - safely_close_closeable_isamfiles(); // Serve a premettere la chiamata ad fsize() in sicurezza + TDir d(LF_DIR); // equivale a d.get(LF_DIR, _nolock, _nordir, _sysdirop); + const int last_curr_item = (int)d.eod(); //quale è il numero dell'ultimo file attualmente presente - TString prompt(128); - if (is_com) - prompt << TR("Aggiornamento dati comuni"); - else + const int update_items = (last_new_item < last_curr_item) ? last_new_item : last_curr_item; + safely_close_closeable_isamfiles(); // Serve a premettere la chiamata ad fsize() in sicurezza + + TString prompt(128); + if (is_com) + prompt << TR("Aggiornamento dati comuni"); + else prompt << TR("Aggiornamento ditta") << ' ' << atol(pref); - prompt << ".\n"; + prompt << ".\n"; - TProgind p(update_items ? update_items : 1, prompt, false, true); - - int i; - for (i = LF_USER; i <= update_items; i++) - { - if (!p.setstatus(i)) - break; + TProgind p(update_items ? update_items : 1, prompt, false, true); - const TDir & ds = (const TDir &) _dirs[i]; - const bool is_firm = ds.is_firm(); - const bool to_create = (is_com ? ds.is_com() : ds.is_firm()); - - TFilename fd(ds.filename()); + int i; + for (i = LF_USER; i <= update_items; i++) + { + if (!p.setstatus(i)) + break; - bool towrite = false; + TDir & ds = (TDir &)_dirs[i]; + TTrec & rs = (TTrec &)_recs[i]; + const bool is_firm = ds.is_firm(); + const bool to_create = (is_com ? ds.is_com() : ds.is_firm()); + TFilename fd(ds.filename()); + bool towrite = false; + const long flags = ds.flags(); - const long flags = ds.flags(); - d.get(i, _nolock, _nordir, _sysdirop); - const bool old_is_firm = d.is_firm(); - - TFilename fs = d.filename(); + d.get(i, _nolock, _nordir, _sysdirop); - //modifica 03/06/09 Se un file si chiama fnnn (es. f106) nel vecchio set di tracciati, mentre esiste con nome.. - //valido nel nuovo set, viene considerato sempre NON esistente e vuoto (es. passaggio dalla 3.2 alla 10.0: ci.. - //sono files come f106 che nella 3.2 non esistevano (o esistevano nella cartella cesp) e nella 10.0 ci sono con.. - //..tanto di nome (pconana);la conversione andava in errore - const TString& fs_name = fs.name_only(); - if (fs_name.starts_with("f") && real::is_natural(fs_name.mid(1))) - fs.cut(0); - - if (!fs.exist()) - { - if (d.eox() > 0L) - { - d.get(i, _nolock, _nordir, _sysdirop); - d.reset_eox(); - d.put(i, _nordir, _sysdirop); - } - } - else - { - if (is_com) - { - if (old_is_firm && !moveable_file(i) && d.eod() == 0L) - { - const char* n = d.filename(); - save_file(n); + const bool old_is_firm = d.is_firm(); + TFilename fs = d.filename(); - TToken_string names; get_table_names(i, names, 0xF); - FOR_EACH_TOKEN(names, name) - xvt_fsys_remove_file(name); + //modifica 03/06/09 Se un file si chiama fnnn (es. f106) nel vecchio set di tracciati, mentre esiste con nome.. + //valido nel nuovo set, viene considerato sempre NON esistente e vuoto (es. passaggio dalla 3.2 alla 10.0: ci.. + //sono files come f106 che nella 3.2 non esistevano (o esistevano nella cartella cesp) e nella 10.0 ci sono con.. + //..tanto di nome (pconana);la conversione andava in errore + const TString& fs_name = fs.name_only(); + if (fs_name.starts_with("f") && real::is_natural(fs_name.mid(1))) + fs.cut(0); - TString msg(_MAX_PATH); - msg.format(FR("File n. %d - %s : eliminato file non utilizzato"), i, (const char *)d.filename()); - write_log(msg, 1); - } - } - if (i > LF_USER && is_firm == old_is_firm) - { - const long size = fsize(fs); - if (flags < 10000L && size > 0L && d.len() > 0) - { - TSystemisamfile b(i); - int err = b.is_valid(true); - // Aggiunto err==-60 per errore conversione sui file 98,99,125 in Pharmatex e dintorni - if ((err == _istrcerr || err == _ispatherr || err == -60) && (d.eod() == 0) && (size < 4096)) - { - bool kill = true; - //controllo solo all'aga - if (is_power_station()) - kill = yesno_box(FR("Il tracciato record del file %d è incoerente:\n" - "Si desidera eliminare il file vuoto %s?"), i, (const char*)fs); - if (kill) - { - TToken_string names; get_table_names(i, names, 0xF); - FOR_EACH_TOKEN(names, name) - xvt_fsys_remove_file(name); + if (!fs.exist()) + { + if (d.eox() > 0L) + { + d.get(i, _nolock, _nordir, _sysdirop); + d.reset_eox(); + d.put(i, _nordir, _sysdirop); + } + } + else + { + if (is_com) + { + if (old_is_firm && !moveable_file(i) && d.eod() == 0L) + { + const char* n = d.filename(); + save_file(n); - // se si decide di eliminare il file con tracciato del cazzo deve tenerne traccia nel log (nel caso di utonti.. - //..è sempre così, perchè kill è sempre true) - TString msg; - msg.format(TR("Eliminato il file %d avente tracciato record incoerente"), i); - write_log(msg, 2); + TToken_string names; get_table_names(i, names, 0xF); + FOR_EACH_TOKEN(names, name) + xvt_fsys_remove_file(name); + + TString msg(_MAX_PATH); + msg.format(FR("File n. %d - %s : eliminato file non utilizzato"), i, (const char *)d.filename()); + write_log(msg, 1); + } + } + if (i > LF_USER && is_firm == old_is_firm) + { + const long size = fsize(fs); + TSystemisamfile b(i); + + if (flags < 10000L && size > 0L && d.len() > 0) + { + int err = b.is_valid(true); + if ((err == _istrcerr || err == _ispatherr || err == -60) && (d.eod() == 0) && (size < 4096)) + { + bool kill = true; + //controllo solo all'aga + if (is_power_station()) + kill = yesno_box(FR("Il tracciato record del file %d è incoerente:\n" + "Si desidera eliminare il file vuoto %s?"), i, (const char*)fs); + if (kill) + { + TToken_string names; get_table_names(i, names, 0xF); + FOR_EACH_TOKEN(names, name) + xvt_fsys_remove_file(name); + + // se si decide di eliminare il file con tracciato del cazzo deve tenerne traccia nel log (nel caso di utonti.. + //..è sempre così, perchè kill è sempre true) + TString msg; + msg.format(TR("Eliminato il file %d avente tracciato record incoerente"), i); + write_log(msg, 2); continue; - } - } //if((err==_istrcerr... + } + } //if((err==_istrcerr... - if (err != NOERR && flags < 10000L) - { - TString msg(_MAX_PATH); - msg << prompt << TR("Recupero file ") << d.filename(); - p.set_text(msg); - if (err == _istrcerr || err == _isbadtrc) - { - repair_file(i); - err = NOERR; - } - if (err != NOERR && flags < 10000L) - { - if (!try_to_recover(b, err)) + if (err != NOERR && flags < 10000L) + { + TString msg(_MAX_PATH); + msg << prompt << TR("Recupero file ") << d.filename(); + p.set_text(msg); + + if (err == _istrcerr || err == _isbadtrc) + { + repair_file(i); + err = NOERR; + } + if (err != NOERR && flags < 10000L) + { + if (!try_to_recover(b, err)) { msg.format(TR("Impossibile compattare il file %d - %s : errore n.ro %d"), - i, (const char*)d.filename(), err); + i, (const char*)d.filename(), err); write_log(msg, 2); } - } - } //if(err!=NOERR && flags<10000L.. - } - else - { - if (flags < 10000L && to_create) - { - TToken_string names; - get_table_names(i, names, 0xF); - FOR_EACH_TOKEN(names, name) - xvt_fsys_remove_file(name); - d.get(i, _nolock, _nordir, _sysdirop); - d.reset_eox(); - d.put(i, _nordir, _sysdirop); - } - } - } - } - d.get(i, _nolock, _nordir, _sysdirop); - - bool cmn_file = false; - bool valid_file = moveable_file(i); - if (!is_com && valid_file && d.is_com()) - cmn_file = true; // Salta in questo caso: - // sto aggiornando le ditte, - // il file in questione e' uno di quelli che possono essere comuni - // il file e' in comune - // Serve per evitare che durante l'aggiornamento i file - // PCON, CLIFO, CAUS ed RCAUS vengano spostati da COM alla - // prima ditta - - if (to_create && !cmn_file) - { - d.set(ds.name(), d.eox(), 0L, ds.des(), d.expr()); - towrite = true; - } - else - { - towrite = TFixed_string(ds.des()) != d.des(); - if (towrite) - { - if (!valid_file) - d.set(ds.name(), d.eox(), d.eod(), ds.des(), d.expr()); - else - strcpy((char *) d.des(), ds.des()); - } - } - if (is_com && valid_file && d.name()[0] == '$') - { - TString name(d.name()); - name[0] = '%'; - d.set_name(name); - towrite = true; - } - if (towrite) - d.put(i, _nordir, _sysdirop); - } //for(i=LF_USER; i<=update_items; i++) + } + } //if(err!=NOERR && flags<10000L.. + } + else + { + if (flags < 10000L && to_create) + { + TToken_string names; + get_table_names(i, names, 0xF); + FOR_EACH_TOKEN(names, name) + xvt_fsys_remove_file(name); + d.get(i, _nolock, _nordir, _sysdirop); + d.reset_eox(); + d.put(i, _nordir, _sysdirop); + } + } + } + } + d.get(i, _nolock, _nordir, _sysdirop); - //se il numero totale di files nuovi è inferiore a quello dei files già presenti c'è qualcosa che probabilmente.. - //..non va (aggiornamento da un cd vecchio ad esempio); comunque ha finito il suo lavoro qui, perchè quello che.. - //..segue riguarda solo i files nuovi - if (last_curr_item >= last_new_item) - return; + bool cmn_file = false; + bool valid_file = moveable_file(i); + if (!is_com && valid_file && d.is_com()) + cmn_file = true; // Salta in questo caso: + // sto aggiornando le ditte, + // il file in questione e' uno di quelli che possono essere comuni + // il file e' in comune + // Serve per evitare che durante l'aggiornamento i file + // PCON, CLIFO, CAUS ed RCAUS vengano spostati da COM alla + // prima ditta - //aggiornatore degli EOX EOD ecc. dei files nuovi - for (i = last_curr_item + 1; i <= last_new_item; i++) - { - TDir d1((const TDir&)_dirs[i]); - d1.set_len(0); - d1.reset_eox(); - d1.set_flags(0); - d1.put(i, _nordir, _sysdirop); //scrive su dir.gen il nuovo file aggiunto (mettendo numero,eox,eod,flags) - } + if (to_create && !cmn_file) + { + d.set(ds.name(), d.eox(), 0L, ds.des(), d.expr()); + towrite = true; + } + else + { + towrite = TFixed_string(ds.des()) != d.des(); + if (towrite) + { + if (!valid_file) + d.set(ds.name(), d.eox(), d.eod(), ds.des(), d.expr()); + else + strcpy((char *)d.des(), ds.des()); + } + } + if (is_com && valid_file && d.name()[0] == '$') + { + TString name(d.name()); + name[0] = '%'; + d.set_name(name); + towrite = true; + } + if (towrite) + d.put(i, _nordir, _sysdirop); + } //for(i=LF_USER; i<=update_items; i++) - //allinea i valori di eox ed eod (eox non può mai essere < eod!) - d.get(LF_DIR, _nolock, _nordir, _sysdirop); - d.set_eod(last_new_item); - d.put(LF_DIR, _nordir, _sysdirop); + //se il numero totale di files nuovi è inferiore a quello dei files già presenti c'è qualcosa che probabilmente.. + //..non va (aggiornamento da un cd vecchio ad esempio); comunque ha finito il suo lavoro qui, perchè quello che.. + //..segue riguarda solo i files nuovi + if (last_curr_item >= last_new_item) + return; + + //aggiornatore degli EOX EOD ecc. dei files nuovi + for (i = last_curr_item + 1; i <= last_new_item; i++) + { + TDir d1((const TDir&)_dirs[i]); + d1.set_len(0); + d1.reset_eox(); + d1.set_flags(0); + d1.put(i, _nordir, _sysdirop); //scrive su dir.gen il nuovo file aggiunto (mettendo numero,eox,eod,flags) + } + + //allinea i valori di eox ed eod (eox non può mai essere < eod!) + d.get(LF_DIR, _nolock, _nordir, _sysdirop); + d.set_eod(last_new_item); + d.put(LF_DIR, _nordir, _sysdirop); +} + +void TManutenzione_app::recover() +{ + open_history(); + long firm = get_firm(); + TString pref; + if (firm == 0) + pref = prefix().name(); + prefix().set_codditta(0L); // COM + + safely_close_closeable_isamfiles(); // Serve a premettere la chiamata ad fsize() in sicurezza + + TDir d(LF_DIR); // equivale a d.get(LF_DIR, _nolock, _nordir, _sysdirop); + const int last = (int)d.eod(); //quale è il numero dell'ultimo file attualmente presente + + { + TString prompt(128); + + prompt << TR("Recupero dati comuni"); + prompt << ".\n"; + + TProgind p(last, prompt, false, true); + + load_des(); + for (int i = LF_USER; p.setstatus(i) && i <= last; i++) + { + + TDir & ds = (TDir &)_dirs[i]; + TTrec & rs = (TTrec &)_recs[i]; + TSystemisamfile f(i); + + if (ds.is_com()) + f.recover(ds, rs); + } //for(i=LF_USER; i<=update_items; i++) + } + + TPointer_array ditte; // Evita di aprire LF_NDITTE + const int nditte = prefix().firms(ditte); + + for (int i = 0; i < nditte; i++) + { + const long codditta = ditte.get_long(i); + if (prefix().exist(codditta) && set_firm(codditta)) + { + const TString pref(prefix().name()); + TString prompt(128); + + safely_close_closeable_isamfiles(); // Serve a premettere la chiamata ad fsize() in sicurezza + prompt << TR("Recupero ditta") << ' ' << atol(pref); + prompt << ".\n"; + + TProgind p(last, prompt, false, true); + + load_des(); + for (int i = LF_USER; p.setstatus(i) && i <= last; i++) + { + + TDir & ds = (TDir &)_dirs[i]; + TTrec & rs = (TTrec &)_recs[i]; + TSystemisamfile f(i); + + if (ds.is_firm()) + f.recover(ds, rs); + } //for(i=LF_USER; i<=update_items; i++) + } + } + + //chiude il log di conversione + close_log(); + + if (firm > 0) set_firm(firm); + else prefix().set(pref); + load_des(); + + close_history(); + + send_campo_xml(); // Spedisce situazione via ftp } void TManutenzione_app::convert_dir() @@ -1069,7 +1095,7 @@ void TManutenzione_app::convert_dir() const TString pref(prefix().name()); const bool is_com = prefix().is_com(); const int last_new_item = _dirs.last(); - + TDir d(LF_DIR); const int last_curr_item = (int)d.eod(); @@ -1077,10 +1103,10 @@ void TManutenzione_app::convert_dir() TString s; s << TR("Aggiornamento archivi "); - if (is_com) + if (is_com) s << TR("comuni"); else - s << TR("ditta ") << atol (pref); + s << TR("ditta ") << atol(pref); s << ".\n"; TProgress_monitor p(update_items, s, is_power_station()); @@ -1089,34 +1115,43 @@ void TManutenzione_app::convert_dir() if (!p.add_status()) break; - const TTrec& rs = (const TTrec&)_recs[i]; // Nuovo tracciato record - const TDir& ds = (const TDir&)_dirs[i]; + TTrec& rs = (TTrec&)_recs[i]; // Nuovo tracciato record + TDir& ds = (TDir&)_dirs[i]; const long flags = ds.flags(); if (ds.len() > 0) { if (flags >= 0L && flags < 10000L) { + int err = NOERR; + d.get(i, _nolock, _nordir, _sysdirop); TString msg = s; msg << d.filename(); + p.set_text(msg); const int module = abs((int)ds.flags()); + const bool to_convert = (is_com ? d.is_com() : d.is_firm()); + TSystemisamfile f(i); - int err = f.is_valid(true); - switch (err) - { - case -64: - case -60: - err = NOERR; // verif. - break; - default: - break; - } + + if (err == NOERR) + { + err = f.is_valid(true); + switch (err) + { + case -64: + case -60: + err = NOERR; // verif. + break; + default: + break; + } + } if (i > LF_USER && err != NOERR && ((is_com && d.is_com()) || (!is_com && d.is_firm()))) - { + { if (err == _istrcerr || err == _isbadtrc) { repair_file(i); @@ -1134,12 +1169,12 @@ void TManutenzione_app::convert_dir() } //if (i > 2 && err != NOERR &&... bool to_create = (is_com ? d.is_com() : d.is_firm()); - + // I files LF_PCON, LF_CAUS, LF_RCAUS, LF_CLIFO, LF_CFVEN, LF_INDSPED // vanno creati comunque nel direttorio COM, vuoti, (se non esistono gia'). if (is_com && !to_create && moveable_file(i)) to_create = true; - + if (to_create && has_module(module, CHK_DONGLE)) { const TDir df(i); @@ -1148,7 +1183,7 @@ void TManutenzione_app::convert_dir() //crea il nuovo file in base al tracciato record nuovo! if (!fname.exist() && ds.len() > 0 && rs.len() > 0) { - set_autoload_new_files(false); + set_autoload_new_files(false); f.build(rs); set_autoload_new_files(true); // Anche se il file non esisteva, prosegue, perche' possono esserci conversioni @@ -1183,7 +1218,7 @@ void TManutenzione_app::convert_dir() d.put(i, _nordir, _sysdirop); r.put(i); } //else di if(flags>=... - + } //if (ds.len() > 0... (la dimensione del tracciato e' > 0) else // altrimenti se la dimensione del tracciato e' zero... { @@ -1216,19 +1251,19 @@ void TManutenzione_app::load_des() int items = (int)d.eod(); long flags = d.flags(); const bool standard = pref.empty(); - + if (standard) // carica eventuali nuove descrizioni ed il nuovo livello archivi { // Cerca in RECDESC i files f[nnn].dir TString ws; TFilename fn; - TDir td,new_dir; + TDir td, new_dir; TTrec tr; - int ln = items,last_newln = items; + int ln = items, last_newln = items; tr.zero(); fn << DESCDIR << "/level.dir"; - + if (fexist(fn)) { ifstream infile(fn); @@ -1236,16 +1271,16 @@ void TManutenzione_app::load_des() infile >> fl; if (fl > flags) flags = fl; } - + // scandisce *.dir in RECDESC // eventuali "buchi" oltre al numero attuale di items vengono rimpiazzati // con tracciati vuoti. - fn.format("%s/f*.dir",DESCDIR); + fn.format("%s/f*.dir", DESCDIR); TString_array list; const int totfiles = list_files(fn, list); - + for (int n = 0; n < totfiles; n++) { fn = list.row(n); @@ -1258,48 +1293,48 @@ void TManutenzione_app::load_des() const bool is_new = ln > last_newln; // memorizza l'ultimo record scritto come nuovo if (is_new) // aggiunge i files che mancano { - for (int i = last_newln+1; i> r; - r.put(i); + r.put(i); d.set_len(r.len()); d.put(i, _nordir, _sysdirop); r.set_des(); - } } } + } _dirs.add(d, i); _recs.add(r, i); } @@ -1405,34 +1440,34 @@ void TManutenzione_app::update() open_history(); long firm = get_firm(); TString pref; - if (firm == 0) + if (firm == 0) pref = prefix().name(); prefix().set(""); load_des(); prefix().set_codditta(0L); // COM - + TString mxs; mxs = TR("Conversione dati comuni"); open_log(); - write_log(mxs); - write_log(""); + write_log(mxs); + write_log(""); TPointer_array ditte; // Evita di aprire LF_NDITTE const int nditte = prefix().firms(ditte); update_dir(); convert_dir(); - + for (int i = 0; i < nditte; i++) { const long codditta = ditte.get_long(i); if (codditta > _history_firm && prefix().exist(codditta) && set_firm(codditta)) { mxs.cut(0) << TR("Conversione Ditta ") << codditta; - write_log(""); - write_log(mxs); - write_log(""); + write_log(""); + write_log(mxs); + write_log(""); update_dir(); convert_dir(); } @@ -1440,14 +1475,14 @@ void TManutenzione_app::update() //chiude il log di conversione close_log(); - + if (firm > 0) set_firm(firm); else prefix().set(pref); load_des(); reset_converting(); close_history(); - + send_campo_xml(); // Spedisce situazione via ftp } @@ -1465,7 +1500,7 @@ void TManutenzione_app::main_loop() KEY key = _browse->run(); - if (key != K_ENTER && key != K_QUIT && key != K_ESC && + if (key != K_ENTER && key != K_QUIT && key != K_ESC && !_superprassi) { error_box(FR("Operazione non permessa all'utente %s"), (const char*)user()); @@ -1489,29 +1524,29 @@ void TManutenzione_app::main_loop() case K_F6: riga_selezionata = _browse->selected(); riga = _browse->row(); - insert_riga (riga_selezionata, riga); + insert_riga(riga_selezionata, riga); break; case K_ENTER: riga_selezionata = _browse->selected(); riga = _browse->row(); - edit_riga (riga_selezionata, riga); + edit_riga(riga_selezionata, riga); break; case K_DEL: riga_selezionata = _browse->selected(); delete_riga(riga_selezionata); break; case K_QUIT: - case K_ESC: - done = true; close_history(); - break; - case K_F7: - update(); + case K_ESC: + done = true; close_history(); break; + case K_F7: + update(); + break; case K_F8: _browse->add(); riga_selezionata = _browse->items() - 1; riga = _browse->row(riga_selezionata); - edit_riga (riga_selezionata, riga); + edit_riga(riga_selezionata, riga); break; case K_F5: // Other file { @@ -1521,6 +1556,18 @@ void TManutenzione_app::main_loop() edit_riga(other.get(101)); } break; + case K_SHIFT + K_F12: // recover + { + TMask pwdmask(TR("Richesta accesso"),1 , 40, 12); + TString pwd("ADMIN"); + + pwd << today.day() + today.month(); + pwdmask.add_string(101, 0, TR("Password"), 2, 1, 20, "*"); + pwdmask.add_button(DLG_OK, 0, "", -12, -2, 10 ,2); + pwdmask.add_button(DLG_CANCEL, 0, "", -22, -2, 10, 2); + if (pwdmask.run() == K_ENTER && pwdmask.get(101) == pwd) + recover(); + } default: break; } @@ -1529,9 +1576,8 @@ void TManutenzione_app::main_loop() } int ba1100(int argc, char** argv) -{ +{ TManutenzione_app a; a.run(argc, argv, TR("Gestione files")); return 0; -} - +} \ No newline at end of file diff --git a/src/ba/ba1100.h b/src/ba/ba1100.h index ff79ff996..1d9bfa505 100755 --- a/src/ba/ba1100.h +++ b/src/ba/ba1100.h @@ -1,6 +1,10 @@ #ifndef __BA1100_H #define __BA1100_H +#ifndef __APPLICAT_H +#include +#endif + #ifndef __CONFIG_H #include #endif @@ -17,6 +21,14 @@ class TMask_field; #endif +#ifndef __PRINTER_H +#include +#endif + +#ifndef __REPUTILS_H +#include +#endif + #include "ba1100a.h" /////////////////////////////////////////////////////////// @@ -25,71 +37,128 @@ class TMask_field; class TDir_sheet : public TSheet { - TTrec _rec; - TDir _dir; - FileDes _s_dir; - long _items; + TTrec _rec; + TDir _dir; + FileDes _s_dir; + long _items; -protected: - virtual long get_items() const { return _items; } - virtual void get_row(long n, TToken_string& r); +protected: + virtual long get_items() const { return _items; } + virtual void get_row(long n, TToken_string& r); public: - const TDir& dir() const { return _dir; } - TDir& dir() { return _dir; } - const TTrec& rec() const { return _rec; } - TTrec& rec(){ return _rec; } - void set_items(long items) { _items = items; } - void add(); - void rebuild() { _items = _dir.items();} + const TDir& dir() const { return _dir; } + TDir& dir() { return _dir; } + const TTrec& rec() const { return _rec; } + TTrec& rec() { return _rec; } + void set_items(long items) { _items = items; } + void add(); + void rebuild() { _items = _dir.items(); } - TDir_sheet(const char* title, bool superprassi); + TDir_sheet(const char* title, bool superprassi); }; class TRec_sheet : public TObject { - TTrec _rec; - TTrec _rec_old; - TDir _dir; - bool _comfile; - TConfig *_descr; - static TMask *_mask; - TFilename _descfname; - TString16 _tab; - bool _external; + TTrec _rec; + TTrec _rec_old; + TDir _dir; + bool _comfile; + TConfig *_descr; + static TMask *_mask; + TFilename _descfname; + TString16 _tab; + bool _external; protected: - bool check_key_expr(int key, const char* key_expr); - static bool key_notify(TSheet_field& s, int r, KEY k); - static bool fld_notify(TSheet_field& s, int r, KEY k); - void save(); - void save_desc(); - - virtual long get_items() const { return _rec.fields(); } + bool check_key_expr(int key, const char* key_expr); + static bool key_notify(TSheet_field& s, int r, KEY k); + static bool fld_notify(TSheet_field& s, int r, KEY k); + void save(); + void save_desc(); + + virtual long get_items() const { return _rec.fields(); } public: - const TDir& dir() const { return _dir; } - const TTrec& rec() const { return _rec; } - const char* descfname() const { return _descfname;} - const char* tab() const { return _tab; } - void edit(); + const TDir& dir() const { return _dir; } + const TTrec& rec() const { return _rec; } + const char* descfname() const { return _descfname; } + const char* tab() const { return _tab; } + void edit(); - TRec_sheet(int logicnum, const char* tab); - TRec_sheet(TExternisamfile* file); - virtual ~TRec_sheet(); + TRec_sheet(int logicnum, const char* tab); + TRec_sheet(TExternisamfile* file); + virtual ~TRec_sheet(); }; class TEdit_file : public TObject { protected: - void edit_record(TRectype& rec); - bool browse_cursor(TCursor& cur, const TFilename& name); + void edit_record(TRectype& rec); + bool browse_cursor(TCursor& cur, const TFilename& name); public: - bool browse_file(int logicnum, const TFilename& name, const TString& tab, const int selKey = 1); - bool browse_file(TExternisamfile* file, const TFilename& name); - TEdit_file() {} - virtual ~TEdit_file() {} + bool browse_file(int logicnum, const TFilename& name, const TString& tab, const int selKey = 1); + bool browse_file(TExternisamfile* file, const TFilename& name); + TEdit_file() {} + virtual ~TEdit_file() {} }; +class TManutenzione_app : public TSkeleton_application +{ + TDir_sheet* _browse; + TArray _dirs; + TArray _recs; + TMask* _mask; + long _firm; + long _level; + long _history_firm; + TRec_sheet* _rec; + TLog_report* _log; + bool _print_log; + + bool _superprassi; + +protected: + virtual void main_loop(); + virtual bool create(); + virtual bool destroy(); + void insert_riga(long, TToken_string&); + void edit_riga(long, TToken_string&); + void edit_riga(const TString&); + void delete_riga(long); + virtual bool extended_firm() const { return true; } + + bool set_converting(); + bool reset_converting(); + + bool try_to_recover(TSystemisamfile& f, int err); + void update(); + void update_dir(); + void recover(); + void convert_dir(); + virtual void print(); + virtual void do_print(TPrinter & p, TRec_sheet & r); + const char* dumpfilename(const FileDes& dep) const; + void load_des(); + void open_history(); + void put_history(const char* firm); + void close_history(); + void dump_trc(const char * dir, const bool des_too, const long modules); + void repair_file(int i); + void save_file(const char * file); + + void open_log(); + void write_log(const char* line, const int severity = 0); + void close_log(); + + bool moveable_file(int file) const; +public: + long get_firm() const { return _firm; } + + TManutenzione_app(); +}; + +inline TManutenzione_app & app() { return (TManutenzione_app &)main_app(); } + #endif diff --git a/src/ba/ba1100a.h b/src/ba/ba1100a.h index b7b04fd94..4e986f8e7 100755 --- a/src/ba/ba1100a.h +++ b/src/ba/ba1100a.h @@ -49,5 +49,6 @@ #define DLG_ADDFILE 609 #define DLG_INSFILE 610 #define DLG_OTHERFILE 611 +#define DLG_RECOVER 612 #endif diff --git a/src/ba/ba1101.cpp b/src/ba/ba1101.cpp index ac861a92d..38b2c86ec 100755 --- a/src/ba/ba1101.cpp +++ b/src/ba/ba1101.cpp @@ -36,8 +36,9 @@ TDir_sheet::TDir_sheet(const char* title, bool superprassi) if (superprassi) { add_button(DLG_OTHERFILE, TR("File Esterni"), K_F5, 113); - add_button(DLG_CONVERT, TR("Conversione"), K_F7, 156); - if (is_power_station()) + add_button(DLG_CONVERT, TR("Conversione"), K_F7, 156); + add_button(DLG_RECOVER, TR("Recupero"), K_SHIFT + K_F12, 131); + if (is_power_station()) add_button(DLG_ADDFILE, TR("Nuovo file"), K_F8, TOOL_NEWREC); add_button(DLG_NULL, "", 0); // Separatore } @@ -275,9 +276,17 @@ void TRec_sheet::edit() } f2.set_notify(key_notify); f2.set_append(FALSE); - int nkeys = _rec.keys(); - for (i = 0; i < nkeys; i++) f2.row(i) = _rec.keydef(i); - f2.disable_cell(0, 1); + + int nkeys = _rec.keys(); + + for (i = 0; i < nkeys; i++) + f2.row(i) = _rec.keydef(i); + f2.disable_cell(0, 1); + + const bool enable_save = (_dir.is_com() && app().get_firm() == 0) || + (_dir.is_firm() && app().get_firm() > 0); + + _mask->enable(DLG_SAVEREC, enable_save); while (true) { f1.force_update(0); // Non togliere, serve per fare l'update della descrizione quando si fa l'import!!