#include #include #include #include #include #include #include #include "ba7200a.h" /////////////////////////////////////////////////////////// // Main app /////////////////////////////////////////////////////////// class TCopia_dati_app : public TSkeleton_application { bool copy_dir(const char* src, const char* dst) const; public: virtual void main_loop(); }; inline TCopia_dati_app& app() { return (TCopia_dati_app&)main_app(); } /////////////////////////////////////////////////////////// // Step 1 /////////////////////////////////////////////////////////// class TCopia_dati_mask : public TAutomask { public: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); TCopia_dati_mask() : TAutomask("ba7200a") { } }; bool TCopia_dati_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F01_DATIL: if (e == fe_close || e == fe_modify) { const TFilename n = o.get(); const bool esiste = n.exist(); if (strlen(n.name()) > 8) return error_box("L'area dati ha un nome troppo lungo: %s", (const char*)n.name()); if (esiste) return error_box("L'area dati in Lire esiste già"); } else if (e == fe_init) { TFilename src, dst; src = prefix().get_studio(); src.rtrim(1); set(F01_DATI, src); dst << src << "l"; set(F01_DATIL, dst); } break; default: break; } return TRUE; } int list_dirs( const char* filelist, // @parm Stringa contenente la maschera di estrazione TString_array& result) // @parm Array da riempire con la lista dei file { TWait_cursor hourglass; TFilename dir(filelist); int i; for (i = dir.len()-1; i >= 0; i--) if (dir[i] == '/' || dir[i] == '\\' || dir[i] == ':') break; TFilename mask(dir.mid(i+1)); dir.cut(i > 0 ? i+1 : 0); DIRECTORY curdir; xvt_fsys_get_dir(&curdir); if (dir.not_empty()) { DIRECTORY directory; xvt_fsys_convert_str_to_dir(dir.get_buffer(), &directory); BOOLEAN ok = xvt_fsys_set_dir(&directory); if (!ok) { error_box("Impossibile entrare in %s", (const char*)dir); return 0; } } SLIST files = xvt_fsys_list_files(DIR_TYPE, "", TRUE); const int count = xvt_slist_count(files); for (SLIST_ELT e = xvt_slist_get_first(files); e; e = xvt_slist_get_next(files, e)) { const char* f = xvt_slist_get(files, e, NULL); if (*f != '.' && f[1] != ':') { if (dir.not_empty()) { mask = dir; mask.add(f); result.add(mask); } else result.add(f); } } xvt_slist_destroy(files); xvt_fsys_set_dir(&curdir); return count; } bool TCopia_dati_app::copy_dir(const char* src, const char* dst) const { bool ok = TRUE; if (!fexist(dst)) make_dir(dst); TString_array files; TFilename file1, file2; file1 = src; file1.add("*.*"); list_dirs(file1, files); FOR_EACH_ARRAY_ROW(files, d, dir) { file1 = *dir; file2 = dst; file2.add(file1.name()); ok &= copy_dir(file1, file2); } files.destroy(); file1 = src; file1.add("*.*"); list_files(file1, files); TString str; str << "Copia da " << src << " a " << dst << "..."; TProgind pi(files.items(), str, FALSE, TRUE); FOR_EACH_ARRAY_ROW(files, i, file) { pi.addstatus(1); file1 = *file; file2 = dst; file2.add(file1.name()); ok &= fcopy(file1, file2); } return ok; } /////////////////////////////////////////////////////////// // Main /////////////////////////////////////////////////////////// void TCopia_dati_app::main_loop() { TCopia_dati_mask m; if (m.run() == K_ENTER) { prefix().set(NULL); const char* dir1 = m.get(F01_DATI); const char* dir2 = m.get(F01_DATIL); copy_dir(dir1, dir2); } } int ba7200(int argc, char* argv[]) { TCopia_dati_app ma; ma.run(argc, argv, "Copia Studio"); return 0; }