From 7ee82412b988d72879bd55a801509678dfbb49a7 Mon Sep 17 00:00:00 2001
From: guy <guy@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Tue, 11 Nov 1997 12:03:20 +0000
Subject: [PATCH] ba0.cpp  Usato metodo remove_all dei TConfig per settare
 corretamente dirty ba1600*  Mitico fascicolator ba1700*  Mistico
 sfascicolator

git-svn-id: svn://10.65.10.50/trunk@5598 c028cbd2-c16b-5b4b-a496-9718f37d4682
---
 ba/ba0.cpp     |   5 +-
 ba/ba1600.cpp  | 143 ++++++++++++++++++++++++++++++++++++++++++++++---
 ba/ba1600.h    |  30 +++++------
 ba/ba1600a.h   |   2 +
 ba/ba1600a.uml |   6 +--
 ba/ba1700.cpp  |   4 +-
 6 files changed, 161 insertions(+), 29 deletions(-)

diff --git a/ba/ba0.cpp b/ba/ba0.cpp
index 9e8a2badc..4d33c7fb6 100755
--- a/ba/ba0.cpp
+++ b/ba/ba0.cpp
@@ -1449,13 +1449,14 @@ bool TMenu_application::choose_editors()
   
   if (m.run() == K_ENTER)
   {          
-    var.destroy();
+    link.remove_all();
     for (int r = sheet.items()-1; r >= 0; r--)
     {
       TToken_string& row = sheet.row(r);
       TString16 ext = row.get(0);
       if (!ext.blank())
-      {
+      {                
+        ext.lower();
         TFilename prg = row.get();
         link.set(ext, prg);
       }  
diff --git a/ba/ba1600.cpp b/ba/ba1600.cpp
index 0b3c3cd73..73899e4c3 100755
--- a/ba/ba1600.cpp
+++ b/ba/ba1600.cpp
@@ -3,6 +3,7 @@
 #include <applicat.h>
 #include <execp.h>
 #include <msksheet.h>
+#include <prefix.h>
 #include <progind.h>
 #include <urldefid.h>
 #include <utility.h>
@@ -71,12 +72,12 @@ int TInstall_ini::build_complete_list(const TString& module, TString_array& a,
   FOR_EACH_TOKEN(altri, mod)
   {
     const TString submodule = mod;
-    copy_paragraph(submodule, sommario);
+    export_paragraph(submodule, sommario);
   }
   return a.items();
 }
 
-void TInstall_ini::copy_paragraph(const char* module, const char* summary)
+void TInstall_ini::export_paragraph(const char* module, const char* summary)
 {                             
   TConfig sum(summary, module);
   TAssoc_array& ass = (TAssoc_array&)list_variables(module);
@@ -84,7 +85,7 @@ void TInstall_ini::copy_paragraph(const char* module, const char* summary)
     sum.set(key, str);
 }   
 
-void TInstall_ini::copy_module_paragraphs(const char* module, const char* summary)
+void TInstall_ini::export_module_paragraphs(const char* module, const char* summary)
 {
   TString mod;
   for (int sub = -1; ; sub++)
@@ -92,12 +93,64 @@ void TInstall_ini::copy_module_paragraphs(const char* module, const char* summar
     mod = module;  
     if (sub >= 0) mod << sub;
     if (set_paragraph(mod))
-      copy_paragraph(module, summary);
+      export_paragraph(mod, summary);
     else
       break;
   }
 }
 
+///////////////////////////////////////////////////////////
+// TFconv_ini
+///////////////////////////////////////////////////////////
+
+class TFconv_ini : public TConfig
+{
+public:         
+  void export_module(const char* module, const char* summary);
+  
+  TFconv_ini(const char* path = "fconv.ini") : TConfig(path) { }
+  virtual ~TFconv_ini() { }
+};
+
+void TFconv_ini::export_module(const char* module, const char* summary)
+{
+  TScanner scanner("prassi.aut");
+  int module_code;
+  for (module_code = 0; scanner.line().not_empty(); module_code++)
+  {
+    if (scanner.token().compare(module, 2, TRUE) == 0)
+      break;
+  }
+  scanner.close();
+
+  TConfig sommario(summary);
+            
+  TString_array paragraphs;
+  list_paragraphs(paragraphs);
+  paragraphs.sort();
+  
+  FOR_EACH_ARRAY_ROW(paragraphs, p, para)
+  {
+    set_paragraph(*para);
+    TAssoc_array& variables = (TAssoc_array&)list_variables();
+    FOR_EACH_ASSOC_STRING(variables, obj, key, str)
+    {
+      const char* parenthesis = strchr(key, '(');
+      if (parenthesis)
+      {
+        const int logic_num = atoi(parenthesis+1);
+        if (logic_num > 0)
+        {
+          TDir dirinfo; dirinfo.get(logic_num);
+          const long flags = dirinfo.flags() % 10000;
+          if (flags == module_code)
+            sommario.set(key, str, module);
+        }    
+      }
+    }
+  }
+}
+
 ///////////////////////////////////////////////////////////
 // TAuto_token_string
 ///////////////////////////////////////////////////////////
@@ -485,11 +538,14 @@ class TFascicolator_mask : public TMask
 protected:
   static bool list_handler(TMask_field& f, KEY k);
   static bool save_handler(TMask_field& f, KEY k);
+  static bool import_export_handler(TMask_field& f, KEY k);
   
   bool zip_file(const char* archive, const char* file) const;
   int  split_file(const TFilename& file, long size) const;
   bool move_file(const TFilename& file, const char* dir) const;
   bool zip_module(const TString& module, bool agg) const;
+  
+  const TFilename& build_export_path(TFilename& path) const;
        
 public:
   void load();
@@ -535,6 +591,77 @@ bool TFascicolator_mask::save_handler(TMask_field& f, KEY k)
   return TRUE;
 }  
 
+bool TFascicolator_mask::import_export_handler(TMask_field& f, KEY k)
+{
+  if (k == K_SPACE)
+  {                 
+    const bool is_export = f.dlg() == S_EXPORT;
+    const TMask& m = f.mask();
+    const TString& module = m.get(S_MODULE);
+                              
+    const TFascicolator_mask& fm = (const TFascicolator_mask&)m.get_sheet()->mask();                          
+    TFilename path;
+    fm.build_export_path(path);
+
+    FILE_SPEC fs;
+    xvt_fsys_convert_str_to_dir(path.get_buffer(), &fs.dir);
+    path.add(module); path << "inst.ini"; path.lower();
+    strcpy(fs.type, "ini");
+    strcpy(fs.name, path.name());
+    strcpy(fs.creator, "INST");
+    
+    bool ok;
+    
+    DIRECTORY dir; 
+    xvt_fsys_get_dir(&dir); // Salva directory corrente (Non usare la bacata xvt_fsys_save_dir)
+    if (is_export)
+      ok = xvt_dm_post_file_save(&fs, "Esporta il modulo in:") == FL_OK;
+    else
+      ok = xvt_dm_post_file_open(&fs, "Importa il modulo da:") == FL_OK;
+    xvt_fsys_set_dir(&dir); // Ripristina directory corrente
+    
+    if (ok)
+    {
+      if (is_export)
+      {
+        TInstall_ini inst;
+        inst.export_module_paragraphs(module, path);
+        
+        TFconv_ini fconv; 
+        path = path.path();
+        path.add(module); path << "fconv.ini";
+        fconv.export_module(module, path);
+      }  
+      else
+      { 
+        TInstall_ini ini(path);
+        ini.export_module_paragraphs(module, ini.default_name());
+
+        path = path.path();
+        path.add(module); path << "fconv.ini";
+        TFconv_ini fconv(path); 
+        fconv.export_module(module, "fconv.ini");
+      }
+    }
+  }
+  return TRUE;
+}
+
+const TFilename& TFascicolator_mask::build_export_path(TFilename& path) const
+{   
+  const TString& module = get(S_MODULE);
+  path.cut(0);
+  path << SLASH << 'u' << SLASH << user() << SLASH << "src" << SLASH << module;
+  if (!fexist(path)) 
+  {
+    path.cut(0);  
+    path << SLASH << 'u' << SLASH << user() << SLASH << "p.due" << SLASH << module;
+  }  
+  if (!fexist(path))     
+    path.tempdir();
+  return path;
+}
+
 void TFascicolator_mask::load()
 { 
   TWait_cursor hourglass;
@@ -622,7 +749,7 @@ void TFascicolator_mask::save()
 bool TFascicolator_mask::zip_file(const char* archive, const char* file) const
 {  
   TWait_cursor hourglass;
-  TFilename cmd(120);
+  TFilename cmd;
   cmd << "zip.pif " << archive << ' ' << file;
   TExternal_app app(cmd);
   int err = app.run(FALSE, FALSE, FALSE, FALSE);
@@ -761,7 +888,7 @@ bool TFascicolator_mask::zip_module(const TString& main_module, bool agg) const
   msg << "Creazione del file " << archivio << " ...";
 
   TProgind pi(arr.items(), msg, TRUE, TRUE); 
-  TFilename cmd;
+  TString cmd(120);
   
   FOR_EACH_ARRAY_ROW_BACK(arr, i, row)
   {                    
@@ -793,7 +920,7 @@ bool TFascicolator_mask::zip_module(const TString& main_module, bool agg) const
   
   // Memorizza il numero dei dischetti nel sommario
   ini.set("Dischi", disks, main_module);     // Aggiorna install.ini
-  ini.copy_paragraph(main_module, sommario); // Aggiorna sommario
+  ini.export_paragraph(main_module, sommario); // Aggiorna sommario
   
   // Se non specifico un path ho gia' finito
   const TFilename path = get(F_DISKPATH);
@@ -839,6 +966,8 @@ TFascicolator_mask::TFascicolator_mask()
   m.set_handler(S_LIST, list_handler);
   m.set_handler(S_SAVE, save_handler);
   m.set_handler(S_SAVEAGG, save_handler);
+  m.set_handler(S_IMPORT, import_export_handler);
+  m.set_handler(S_EXPORT, import_export_handler);
 }
 
 ///////////////////////////////////////////////////////////
diff --git a/ba/ba1600.h b/ba/ba1600.h
index acca66a91..362ad81d7 100755
--- a/ba/ba1600.h
+++ b/ba/ba1600.h
@@ -13,8 +13,8 @@ public:
   int build_complete_list(const TString& m, TString_array& a, 
                           const char* s = NULL, bool agg = FALSE);
 
-  void copy_paragraph(const char* module, const char* summary);
-  void copy_module_paragraphs(const char* module, const char* summary);
+  void export_paragraph(const char* module, const char* summary);
+  void export_module_paragraphs(const char* module, const char* summary);
   
   static const char* default_name() { return "install.ini"; }
 
@@ -39,31 +39,31 @@ public:
   virtual ~TAuto_token_string() { }
 };    
 
-#define FOR_EACH_SHEET_ROW(__sheet, __r, __riga)                           \
-  TToken_string* __riga;                                                   \
-  for (int __r = 0;                                                        \
-       __r < __sheet.items() && (const char*)(__riga = &__sheet.row(__r)); \
-       __r++)
-
-#define FOR_EACH_SHEET_ROW_BACK(__sheet, __r, __riga)                      \
-  TToken_string* __riga;                                                   \
-  for (int __r = __sheet.items()-1;                                        \
-       __r >= 0  && (const char*)(__riga = &__sheet.row(__r));             \
-       __r--)
+#define FOR_EACH_ARRAY_ROW(__arr, __r, __riga)               \
+  TToken_string* __riga;                                     \
+  for (int __r = __arr.first();                              \
+       __riga = (TToken_string*)__arr.objptr(__r);           \
+       __r = __arr.succ(__r))
 
 #define FOR_EACH_ARRAY_ROW_BACK(__arr, __r, __riga)          \
   TToken_string* __riga;                                     \
   for (int __r = __arr.last();                               \
-       __r >= 0  && (const char*)(__riga = &__arr.row(__r)); \
+       __riga = (TToken_string*)__arr.objptr(__r);           \
        __r = __arr.pred(__r))
 
+#define FOR_EACH_SHEET_ROW(__sheet, __r, __riga)             \
+  FOR_EACH_ARRAY_ROW(__sheet.rows_array(), __r, __riga)                           
+
+#define FOR_EACH_SHEET_ROW_BACK(__sheet, __r, __riga)        \
+  FOR_EACH_ARRAY_ROW_BACK(__sheet.rows_array(), __r, __riga)                           
+       
 #define FOR_EACH_ASSOC_STRING(__ass, __obj, __key, __str)                     \
   const char *__key, *__str; __ass.restart;                                   \
   for (THash_object* __obj = __ass.get_hashobj();                             \
        __obj && (__str = (const TString&)__obj->obj(), __key = __obj->key()); \
        __obj = __ass.get_hashobj()) 
 
-#define FOR_EACH_TOKEN(__tok, __str) \
+#define FOR_EACH_TOKEN(__tok, __str)                         \
   for (const char* __str = __tok.get(0); __str; __str = __tok.get())
 
 #endif
diff --git a/ba/ba1600a.h b/ba/ba1600a.h
index b20dc4cdd..93aec3092 100755
--- a/ba/ba1600a.h
+++ b/ba/ba1600a.h
@@ -19,5 +19,7 @@
 #define S_LIST        100
 #define S_SAVE        151
 #define S_SAVEAGG     152
+#define S_IMPORT      153
+#define S_EXPORT      154
 
 #endif
diff --git a/ba/ba1600a.uml b/ba/ba1600a.uml
index dba33f1f2..08d551d32 100755
--- a/ba/ba1600a.uml
+++ b/ba/ba1600a.uml
@@ -86,7 +86,7 @@ BEGIN
   PROMPT 1 5 "Post-processing "
 END
 
-BUTTON DLG_OK 14 2
+BUTTON DLG_CANCEL 14 2
 BEGIN
   PROMPT -13 -3 ""
 END
@@ -108,12 +108,12 @@ END
 
 BUTTON S_IMPORT 14 2
 BEGIN
-  PROMPT -33 -3 "&Versione"
+  PROMPT -33 -3 "&Importa"
 END
 
 BUTTON S_EXPORT 14 2
 BEGIN
-  PROMPT -33 -1 "&Aggiornamento"
+  PROMPT -33 -1 "&Esporta"
 END
 
 ENDPAGE
diff --git a/ba/ba1700.cpp b/ba/ba1700.cpp
index bf7e092d8..547446fd4 100755
--- a/ba/ba1700.cpp
+++ b/ba/ba1700.cpp
@@ -284,7 +284,7 @@ bool TInstaller_mask::install(const TString& module)
     if (ok)
     { 
       post_process(ini, module);
-      ini.copy_module_paragraphs(module, ini.default_name());
+      ini.export_module_paragraphs(module, ini.default_name());
     }  
   }
   else
@@ -317,7 +317,7 @@ bool TInstaller_mask::install(const TString& module)
 
         if (ok)
         {
-          ini.copy_module_paragraphs(module, ini.default_name());
+          ini.export_module_paragraphs(module, ini.default_name());
           post_process(ini, module);
         }  
       }