diff --git a/include/applicat.cpp b/include/applicat.cpp index c5d9100a8..78b6d5bb6 100755 --- a/include/applicat.cpp +++ b/include/applicat.cpp @@ -350,7 +350,7 @@ void TApplication::stop_run() #ifdef _DEMO_ { const TString16 hname(encode("ORA")); - TConfig c(CONFIG_STUDIO, "Main"); + TConfig c(CONFIG_INSTALL, "Main"); real remaining_time(decode(c.get(hname))); if (name() != "ba0100") { diff --git a/include/archives.cpp b/include/archives.cpp index e77e53392..2512f4207 100755 --- a/include/archives.cpp +++ b/include/archives.cpp @@ -1,18 +1,26 @@ #include -#include +#if XVT_OS == XVT_OS_WIN #define XVT_INCL_NATIVE #define STRICT +#endif #include #include +#include +#include #include #include -#include +#include +#include #include #include #include +#if XVT_OS == XVT_OS_WIN + +#include + /////////////////////////////////////////////////////////// // TProgress_win declaration /////////////////////////////////////////////////////////// @@ -32,6 +40,7 @@ public: ~TProgress_win(); }; +#endif /////////////////////////////////////////////////////////// // TArchive @@ -53,13 +62,15 @@ FILE* TArchive::ask_disk( // @flag FALSE | Apre il file in scrittura { TFilename prev(name); - prev.ext(format("%03d", disk-1)); // File precedente + TString16 ext; ext.format("%03d", disk-1); + prev.ext(ext); // File precedente bool first = TRUE; do { if (first) { - message_box("Inserire il disco %d nel drive %c:", disk, floppy); + message_box("Inserire il disco %d nel drive %c:\n" + "File %s", disk, floppy, (const char*)name); first = FALSE; } else @@ -70,8 +81,9 @@ FILE* TArchive::ask_disk( if (!ok) return NULL; } } while (prev.exist()); // Non facciamo i furbetti! - - name.ext(format("%03d", disk)); // File attuale + + ext.format("%03d", disk); + name.ext(ext); // File attuale FILE* f = NULL; bool retry = TRUE; @@ -108,14 +120,17 @@ int TArchive::build_backup_list(long firm, TString_array& fl) const TLocalisamfile ditte(LF_NDITTE); for (int err = ditte.first(); err == NOERR; err = ditte.next()) { - const char* dir = firm2dir(ditte.get_long("CODDITTA")); - if (fexist(dir)) + const long cod = ditte.get_long("CODDITTA"); + if (prefix().exist(cod)) + { + TFilename dir = firm2dir(cod); fl.add(dir); + } } TFilename name(firm2dir(-1)); // __ptprf name.add("config"); // Aggiungi configurazioni - if (fexist(name)) + if (name.exist()) fl.add(name); } else @@ -169,7 +184,7 @@ int TArchive::build_restore_list( // // @rdesc Ritorna se e' riuscito a spezzare il file bool TArchive::fsplit( - const char* filename, // @parm Nome del file da spezare + const char* filename, // @parm Nome del file da spezzare char floppy, // @parm Floppy su cui scaricare il file const char* desc) const // @parm Descrizione dell'archivio { @@ -237,13 +252,14 @@ bool TArchive::fsplit( TConfig c(ini, parag); const char* oggi = TDate(TODAY).string(); - c.set("Size", tot , NULL, TRUE); - c.set("Disk", disk, NULL, TRUE); - c.set("Description", desc, NULL, TRUE); - c.set("Date", oggi, NULL, TRUE); + c.set("Size", tot); + c.set("Disk", disk); + c.set("Description", desc); + c.set("Date", oggi); ok = (letti > 0) ? (fwrite((char*)(const char*)buffer, letti, 1, o) == 1) : TRUE; - if (!ok) error_box("Impossibile scrivere i dati sul dischetto"); + if (!ok) + error_box("Impossibile scrivere i dati sul dischetto"); else scritti +=letti; } @@ -312,7 +328,7 @@ bool TArchive::fbuild( if (disk == 1) { TFilename ini("a:/backup.ini"); ini[0] = floppy; - if (fexist(ini)) + if (ini.exist()) { TFilename parag(name.name()); parag.ext(""); TConfig c(ini, parag); @@ -361,9 +377,7 @@ bool TArchive::fbuild( bool TArchive::backup( const char* dir, // @parm Directory di cui effettuare il backup char floppy, // @parm Floppy su cui effettuare il backup - const char* desc, // @parm Descrizione da assegnare al backup - bool pr_set) // @parm Se TRUE setta il prefix come vuoto (default TRUE) - // @parm long | firm | Ditta di cui effettuare il backup + const char* desc) // @parm Descrizione da assegnare al backup // @syntax bool backup(const char* dir, char floppy, const char* desc, bool pr_set); // @syntax bool backup(long firm, char floppy, const char* desc, bool pr_set); @@ -372,8 +386,7 @@ bool TArchive::backup( { const TString16 old(prefix().name()); - if (pr_set) - prefix().set(NULL); + prefix().set(NULL); xvt_fsys_save_dir(); chdir(dir); @@ -404,13 +417,12 @@ bool TArchive::backup( remove(work); xvt_fsys_restore_dir(); - if (pr_set) - prefix().set(old); + prefix().set(old); return ok; } -bool TArchive::backup(long firm, char floppy, const char* desc, bool pr_set) +bool TArchive::backup(long firm, char floppy, const char* desc) { TString_array fl; const int num_ditte = build_backup_list(firm, fl); @@ -418,7 +430,7 @@ bool TArchive::backup(long firm, char floppy, const char* desc, bool pr_set) bool ok = TRUE; for (int f = 0; f < num_ditte; f++) { - ok = backup(fl.row(f), floppy, desc, pr_set); + ok = backup(fl.row(f), floppy, desc); if (!ok) break; } @@ -433,14 +445,11 @@ bool TArchive::backup(long firm, char floppy, const char* desc, bool pr_set) bool TArchive::restore( const char* dir, // @parm Directory di cui effettuare il restore char floppy, // @parm Floppy da cui leggere i dati - bool tmp, // @parm Directory temporanea da utilizzare - bool pr_set) // @parm Se TRUE setta il prefix come vuoto (default TRUE) + bool tmp) // @parm Directory temporanea da utilizzare // @syntax bool restore(const char* dir, char floppy, bool temp, bool pr_set); // @syntax bool restore(long firm, char floppy, bool temp, bool pr_set); -// @comm Il parametro

e' utilizzato per evitare errori di riaperture di files. - { TFilename work; if (tmp) @@ -470,8 +479,7 @@ bool TArchive::restore( } const TString16 old(prefix().name()); - if(pr_set) - prefix().set(NULL); + prefix().set(NULL); ok = fbuild(output, floppy); @@ -518,13 +526,12 @@ bool TArchive::restore( } xvt_fsys_restore_dir(); - if(pr_set) - prefix().set(old); + prefix().set(old); return ok; } -bool TArchive::restore(long firm, char floppy, bool temp, bool pr_set) +bool TArchive::restore(long firm, char floppy, bool temp) { TString_array fl; const int num_ditte = build_restore_list(firm, floppy, fl); @@ -532,12 +539,14 @@ bool TArchive::restore(long firm, char floppy, bool temp, bool pr_set) bool ok = TRUE; for (int f = 0; f < num_ditte; f++) { - ok = restore(fl.row(f), floppy, temp, pr_set); + ok = restore(fl.row(f), floppy, temp); if (!ok) break; } return ok; } +#if XVT_OS == XVT_OS_WIN + void TArchive::stop_job() { if (_arc != NULL) @@ -560,11 +569,9 @@ TProgress_win::TProgress_win(const char* title, TArchive* arc) add_button(DLG_USER, 0, "Cancel", -11, -1, 10, 2, "", BMP_CANCEL); set_handler(DLG_USER, cancel_handler); -#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 HWND txt = (HWND)xvt_vobj_get_attr(wtxt, ATTR_NATIVE_WINDOW); HWND num = (HWND)xvt_vobj_get_attr(wnum, ATTR_NATIVE_WINDOW); _monitor = new ALWindowsMessage(AL_MONITOR_OBJECTS, txt, AL_SEND_RATIO, num); -#endif } TProgress_win::~TProgress_win() @@ -583,4 +590,353 @@ bool TProgress_win::cancel_handler(TMask_field& f, KEY k) return TRUE; } +#endif +bool TArchive::move_file(const TFilename& file, const char* dir) const +{ + TFilename dest(dir); + dest.add(file.name()); + + long filesize = ::fsize(file); + filesize -= ::fsize(dest); + + bool space_ok = filesize <= 0; + while (!space_ok) + { + space_ok = ::os_test_disk_free_space(dest, filesize); + if (!space_ok) + { + TString msg(128); + msg << "Lo spazio sull'unita' e' insufficiente:\n"; + if (::os_is_removable_drive(dest)) + msg << "Inserire un nuovo disco e ritentare?"; + else + msg << "Liberare dello spazio e ritentare?"; + if (!yesno_box(msg)) + return FALSE; + } + } + + bool write_ok = TRUE; + bool user_abort = FALSE; + do + { + write_ok = ::fcopy(file, dest); + if (write_ok) + ::remove(file); + else + { + if (!yesno_box("Errore di copia del file %s.\nSi desidera riprovare?", + (const char*)file)) + user_abort = TRUE; + } + } while (!write_ok && !user_abort); + + return write_ok; +} + +bool TArchive::fsplit_zip( + const char* filename, // @parm Nome del file da spezzare + char floppy, // @parm Floppy su cui scaricare il file + const char* desc) const // @parm Descrizione dell'archivio +{ + const TFilename archive(filename); + + unsigned long size = 0; + TFilename path; path << floppy << ':'; + + while (size <= 0) + { + message_box("Inserire il disco 1 nel drive %c:", floppy); + size = os_get_disk_size(path) - (64L*1024L); + if (size <= 0) + { + if (!yesno_box("Errore di accesso al drive %c\nSi desidera ritentare?", floppy)) + return FALSE; + } + do_events(); + } + + const long minsize = 360*1024L; + if (size < minsize) + size = minsize; + + // Costruisce percorso dello splitter + TFilename cmd("zipsplit.pif"); + cmd << " -n " << (long)size << " -b " << archive.path() << ' ' << archive; + + // Esegue lo splitter nella directory temporanea + TExternal_app app(cmd); + int err = app.run(FALSE, FALSE, FALSE, FALSE); + + if (err != NOERR) + return error_box("Errore %d durante lo splitting del file %s", + err, (const char*)archive); + + size = ::fsize(archive); + ::remove(archive); + + for (int d = 1; ; d++) + { + TFilename src(archive); + src.ext(""); + src << d; + src.ext("zip"); + if (src.exist()) + { + if (d > 1) + { + message_box("Inserire il disco %d nel drive %c:", d, floppy); + do_events(); + } + + if (move_file(src, path)) + { + TFilename ini(path); + ini.add("backup.ini"); + TConfig c(ini, archive.name()); + c.set("Size", size); + c.set("Disk", d); + c.set("Description", desc); + c.set("Date", TDate(TODAY).string()); + } + else + break; + } + else + break; + } + + return TRUE; +} + +const char* const file[] = { "zip.pif", "zip386.bat", "zip386.exe", "ziplist.txt", NULL }; + +bool TArchive::copy_zipper(const char* dir) const +{ + bool ok = TRUE; + TFilename dest; + for (int f = 0; ok && file[f]; f++) + { + dest = dir; + dest.add(file[f]); + ok &= ::fcopy(file[f], dest); + } + return ok; +} + +bool TArchive::remove_zipper(const char* dir) const +{ + TFilename dest; + for (int f = 0; file[f]; f++) + { + dest = dir; + dest.add(file[f]); + ::remove(dest); + } + return TRUE; +} + +void TArchive::add_zipper_list(TString& str) const +{ + for (int f = 0; file[f]; f++) + str << ' ' << file[f]; +} + + +// @doc EXTERNAL + +// @mfunc Effettua il backup della directory +// +// @rdesc Ritorna il risultato dell'operazione +bool TArchive::zip( + const char* dir, // @parm Directory di cui effettuare il backup + char floppy, // @parm Floppy su cui effettuare il backup + const char* desc) // @parm Descrizione da assegnare al backup + // @parm long | firm | Ditta di cui effettuare il backup + +// @syntax bool backup(const char* dir, char floppy, const char* desc, bool pr_set); +// @syntax bool backup(long firm, char floppy, const char* desc, bool pr_set); + +// @comm Il parametro

e' utilizzato per evitare errori di riaperture di files. + +{ + const TString16 old(prefix().name()); + prefix().set(NULL); + + const TFilename workdir(dir); + + TString16 name(workdir.name()); + // Trasforma com in datcom altrimenti lo splitter lo trasforma in com1 e com2! + if (name.compare("com", -1, TRUE) == 0) + name = "datcom"; + + // Nome del file compresso + TFilename work; work.tempdir(); work.add(name); work.ext("zip"); + + TString title("Archiviazione di "); title << workdir; + TIndwin waitw(100,title,FALSE,FALSE); + TWait_cursor hourglass; + + // Crea il file con la lista dei file da comprimere + const char* const ZIPLIST = "ziplist.txt"; + FILE* flist = fopen(ZIPLIST, "w"); + fprintf(flist, "*.*"); + fclose(flist); + + copy_zipper(workdir); + + // Esegui lo zippatore + TFilename cmd = workdir; + cmd.add("zip.pif"); + cmd << ' ' << work << ' ' << ZIPLIST << " -D -r"; + + TExternal_app zipapp(cmd); + int err = zipapp.run(FALSE, FALSE, FALSE, FALSE); + + // Elimina files temporanei dallo zip +/* + cmd = workdir; + cmd.add("zip386.exe"); + cmd << ' ' << work << " -d"; + add_zipper_list(cmd); + TExternal_app zipdel(cmd); + zipdel.run(FALSE, FALSE, FALSE, FALSE); +*/ + + // Elimina i file temporanei dalla directory + remove_zipper(workdir); + + // Splitta su floppy + bool ok = err == 0; + if (ok) + ok = fsplit_zip(work, floppy, desc); + else + error_box("Compressione degli archivi errata o incompleta"); + + prefix().set(old); + + return ok; +} + +bool TArchive::zip(long firm, char floppy, const char* desc) +{ + TString_array fl; + const int num_ditte = build_backup_list(firm, fl); + + bool ok = TRUE; + for (int f = 0; f < num_ditte; f++) + { + ok = zip(fl.row(f), floppy, desc); + if (!ok) break; + } + + return ok; +} + +// @doc EXTERNAL + +// @mfunc Effettua il restore della directory +// +// @rdesc Ritorna il risultato dell'operazione +bool TArchive::unzip( + const char* dir, // @parm Directory di cui effettuare il restore + char floppy, // @parm Floppy da cui leggere i dati + bool tmp) // @parm Directory temporanea da utilizzare +// @syntax bool restore(const char* dir, char floppy, bool temp, bool pr_set); +// @syntax bool restore(long firm, char floppy, bool temp, bool pr_set); +// @comm Il parametro

e' utilizzato per evitare errori di riaperture di files. +{ + TFilename work; + if (tmp) + work.tempdir(); + else + work = dir; + + TFilename output(dir); + output = output.name(); + if (output.compare("com", -1, TRUE) == 0) + output = "datcom"; + output.ext("zip"); + + if (!yesno_box("Attenzione l'archivio %c:%s verra' ripristinato\n" + "nel direttorio %s. Continuare?", + floppy, (const char*)output, (const char*)work)) + return FALSE; + + bool ok = work.exist(); + if (!ok) + { + ok = yesno_box("Non esiste il direttorio %s: si desidera crearlo?", (const char*)work); + if (ok) + { + make_dir(work); + ok = work.exist(); + } + if (!ok) + return error_box("Impossibile accedere a %s", (const char*)work); + } + + TString title("Ripristino di "); title << output; + TIndwin waitw(100,title,FALSE,FALSE); + + const TString16 old(prefix().name()); + prefix().set(NULL); + + TFilename cfg; + cfg << floppy << ':'; + cfg.add("backup.ini"); + TConfig c(cfg, output.name()); + long total_size = c.get_long("Size"); + long read_size = 0; + for (int d = 1; read_size < total_size; d++) + { + TFilename src; + src << floppy << ':' << SLASH << output.name(); + src.ext(""); + src << d << ".zip"; + + message_box("Inserire il disco %d contenente il file %s", d, (const char*)src); + while (!src.exist()) + { + if (!yesno_box("Impossibile aprire il file %s:\nSi desidera ritentare?", + (const char *)src)) + break; + } + + if (src.exist()) + { + TFilename cmd; + cmd << "unzip.pif -o " << src << " -d " << work; + TExternal_app app(cmd); + int err = app.run(FALSE, FALSE, FALSE, FALSE); + if (err == 0) + read_size += ::fsize(src); + else + { + error_box("Errore %d durante il ripristino del file %s", err, (const char*)src); + break; + } + } + else + break; + } + + prefix().set(old); + + return ok; +} + +bool TArchive::unzip(long firm, char floppy, bool temp) +{ + TString_array fl; + const int num_ditte = build_restore_list(firm, floppy, fl); + + bool ok = TRUE; + for (int f = 0; f < num_ditte; f++) + { + ok = unzip(fl.row(f), floppy, temp); + if (!ok) break; + } + return ok; +} diff --git a/include/archives.h b/include/archives.h index 315f75f46..b6e4114fe 100755 --- a/include/archives.h +++ b/include/archives.h @@ -33,16 +33,21 @@ class TArchive : public TObject // @access Protected Member protected: - // @cmember NON IMPLEMENTATA - KEY query() const; // @cmember Funzione per richiedere all'utente il dischetto e per controllare la - // corretta sequenza dei dischetti da inserire + // corretta sequenza dei dischetti da inserire FILE* ask_disk(TFilename& name, int disk, char floppy, bool lettura) const; // @cmember Ritorna la dimensione del file

- long fsize(FILE* f) const; + long fsize(FILE* f) const; + + // @cmember Sposta il file nella directory dir + bool move_file(const TFilename& file, const char* dir) const; + // @cmember Spezza il file in modo da farlo stare sul dischetto bool fsplit(const char* filename, char floppy, const char* desc = "") const; + // @cmember Spezza il file.zip in modo da farlo stare sul dischetto + bool fsplit_zip(const char* filename, char floppy, const char* desc = "") const; + // @cmember Ricostruisce il file spezzato bool fbuild(const char* filename, char floppy) const; @@ -50,21 +55,38 @@ protected: int build_backup_list(long firm, TString_array& fl) const; // @cmember Costruisce la lista delle directory da scompattare int build_restore_list(long firm, char floppy, TString_array& fl) const; + + bool copy_zipper(const char* dir) const; + bool remove_zipper(const char* dir) const; + void add_zipper_list(TString& str) const; // @access Public Member public: // @cmember Effettua il backup della directory - bool backup(const char* dir, char floppy, const char* desc, bool pr_set=TRUE); + bool backup(const char* dir, char floppy, const char* desc); // @cmember Effettua il backup della ditta - bool backup(long firm, char floppy, const char* desc, bool pr_set=TRUE); + bool backup(long firm, char floppy, const char* desc); // @cmember Effettua il restore della directory - bool restore(const char* dir, char floppy, bool temp, bool pr_set=TRUE); + bool restore(const char* dir, char floppy, bool temp); // @cmember Effettua il restore della ditta - bool restore(long firm, char floppy, bool temp, bool pr_set=TRUE); + bool restore(long firm, char floppy, bool temp); // @cmember Interrompe le operazioni void stop_job(); + + // @cmember Effettua il backup della directory + bool zip(const char* dir, char floppy, const char* desc); + // @cmember Effettua il backup della ditta + bool zip(long firm, char floppy, const char* desc); + + // @cmember Effettua il restore della directory + bool unzip(const char* dir, char floppy, bool temp); + // @cmember Effettua il restore della ditta + bool unzip(long firm, char floppy, bool temp); + + TArchive() { } + virtual ~TArchive() { } }; #endif diff --git a/include/array.cpp b/include/array.cpp index a5f6df224..0cd066cf2 100755 --- a/include/array.cpp +++ b/include/array.cpp @@ -163,7 +163,7 @@ bool TArray::destroy( if (index < 0) { - for (int i = size()-1; i >= 0; i--) if (_data[i] != NULL) + for (int i = last(); i >= 0; i--) if (_data[i] != NULL) { delete _data[i]; _data[i] = NULL; diff --git a/include/array.h b/include/array.h index 1a28d5ef8..cc63e7b01 100755 --- a/include/array.h +++ b/include/array.h @@ -203,6 +203,19 @@ inline TObject& TArray::operator[] (int index) const } #endif +#define FOR_EACH_ARRAY_ITEM(__arr, __r, __obj) \ + TObject* __obj; \ + for (int __r = __arr.first(); \ + __obj = __arr.objptr(__r); \ + __r = __arr.succ(__r)) + +#define FOR_EACH_ARRAY_ITEM_BACK(__arr, __r, __obj) \ + TObject* __obj; \ + for (int __r = __arr.last(); \ + __obj = __arr.objptr(__r); \ + __r = __arr.pred(__r)) + + class TPointer_array : public TArray { public: @@ -213,6 +226,7 @@ public: virtual TPointer_array& operator= (const TArray& a); long get_long(int index) const { return (long)objptr(index); } + int get_int(int index) const { return (int)get_long(index); } int add_long(long value, int index = -1) { return add((TObject*)value, index); } int insert_long(long value, int index = -1) { return TArray::insert((TObject*)value, index, TRUE); }