Salome HOME
Copyright update 2022
[modules/hexablock.git] / src / HEXABLOCK / Hex.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 08a672d..d3a7e6a
@@ -1,12 +1,12 @@
 
 // C++ : La clase principale de Hexa
 
-// Copyright (C) 2009-2012  CEA/DEN, EDF R&D
+// Copyright (C) 2009-2022  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 //
 #include "Hex.hxx"
 
+#include "HexEltBase.hxx"
 #include "HexDocument.hxx"
+#include "HexGlobale.hxx"
 #include <clocale>
 
 BEGIN_NAMESPACE_HEXA
 
+Hex* Hex::first_instance = NULL;
+
 // ======================================================== Constructeur
 Hex::Hex ()
 {
-   setlocale (LC_NUMERIC, "C");
+   //setlocale (LC_NUMERIC, "C"); // VSR 2020-03-11: commented out - initial locale has to be restored somewhere...
+   glob = Globale::getInstance ();
 }
 // ======================================================== Destructeur
 Hex::~Hex ()
 {
-#ifndef NO_CASCADE
    int nbre = liste_documents.size();
    for (int nd=0 ; nd<nbre ; nd++) 
        delete liste_documents [nd];
-#endif
 }
 // ======================================================== countDocument
 int Hex::countDocument ()
@@ -56,6 +59,10 @@ Document* Hex::getDocument (int nro)
 // ======================================================== removeDocument
 void Hex::removeDocument (Document* doc)
 {
+   bool actif = glob->dump.start ("hexablock", "removeDocument");
+   if (actif)
+       glob->dump << doc;
+
    int nbre = liste_documents.size();
    for (int nd=0 ; nd<nbre ; nd++) 
        {
@@ -63,24 +70,162 @@ void Hex::removeDocument (Document* doc)
           {
           liste_documents.erase (liste_documents.begin()+nd);
           delete doc;
+          glob->dump.close (actif);
           return;
           }
        }
                       // Pas trouve dans la liste. On detruit quand meme
+    glob->dump.close (actif);
     delete doc;
 }
 // ======================================================== addDocument
 Document* Hex::addDocument (cpchar nomdoc)
 {
-   Document* doc = new Document (nomdoc);
+   bool actif = glob->dump.start ("hexablock", "addDocument");
+   if (actif)
+       glob->dump << nomdoc;
+
+   std::string name;
+   makeName (nomdoc, name);
+   Document* doc = new Document (name.c_str(), this);
+
    liste_documents.push_back (doc);
+
+   glob->dump.close (actif, doc);
    return doc;
 }
 // ======================================================== loadDocument
-Document* Hex::loadDocument (const char* filename)
+Document* Hex::loadDocument (cpchar filename)
 {
-   Document* doc = addDocument ("xxxx");
+   bool actif = glob->dump.start ("hexablock", "loadDocument");
+   if (actif)
+       glob->dump << filename;
+
+   Document* doc = addDocument ("default");
    doc->loadXml (filename);
+
+   glob->dump.close (actif, doc);
    return doc;
 }
+// ======================================================== loadAllDocs
+int Hex::loadAllDocs (cpchar stream)
+{
+   int posit  = 0;
+   int car    = ' '; 
+   int nbdocs = 0;
+
+   while ( (car=stream[posit++]) != '>')
+         if (car>='0' && car <='9')
+            nbdocs = 10*nbdocs + car - '0';
+            
+   for (int nro = 0; nro<nbdocs ; nro++)
+       {
+       Document* doc = addDocument ("xxxx");
+       doc->setXml (stream, posit);
+       }
+
+   PutData (posit);
+   return HOK;
+}
+// ======================================================== saveAllDocs
+int Hex::saveAllDocs (cpchar filename)
+{
+   FILE* fic = fopen (filename, "w");
+   if (fic==NULL)
+      return HERR;
+
+   int nbdocs = countDocument ();
+   fprintf (fic, "<%d>", nbdocs);
+
+   for (int nro = 0; nro<nbdocs ; nro++)
+       {
+       Document* doc = getDocument (nro);
+       if (doc!=NULL)
+           doc->appendXml (fic);
+       }
+
+   fclose  (fic);
+   return HOK;
+}
+// ======================================================== findDocument
+Document* Hex::findDocument (cpchar name)
+{
+   int nbdocs   = liste_documents.size();
+   for (int nro = 0; nro<nbdocs ; nro++)
+       {
+       Document*  doc = getDocument (nro);
+       if (doc!=NULL && Cestegal (name, doc->getName ()))
+          return doc;
+       }
+   return NULL;
+}
+// ======================================================== makeName
+void Hex::makeName (cpchar radical, std::string& name)
+{
+   char cnum [8];
+   int  numero = 0;
+   while (true)
+       {
+       name = radical;
+       if (numero>0)
+          {
+          sprintf (cnum, "_%d", numero);
+          name += cnum;
+          }
+       numero ++;
+       if (findDocument (name)==NULL)
+          return;
+       }
+}
+// ======================================================== lockDump
+void Hex::lockDump ()
+{
+   glob->dump.lock ();
+}
+// ======================================================== restoreDump
+void Hex::restoreDump ()
+{
+   glob->dump.restore (DumpActif);
+}
+// ====================================================== getInstance
+Hex* Hex::getInstance  ()
+{
+   if (first_instance==NULL) 
+       first_instance = new Hex ();
+
+   return first_instance;
+}
+// ======================================================== what (?)
+void Hex::what ()
+{
+   bool actif = glob->dump.start ("hexablock", "what", false);
+
+   Globale* glob = Globale::getInstance  ();
+   glob->mess.printMessage();
+
+   glob->dump.close (actif);
+}
+// ======================================================== sizeofMessage
+int Hex::sizeofMessage ()
+{
+   return glob->mess.sizeofMessage (); 
+}
+// ======================================================== getMessageLine
+cpchar Hex::getMessageLine (int nlig)
+{ 
+   return glob->mess.getLine (nlig);
+}
+// ======================================================== hex_instance
+Hex* hex_instance ()
+{
+   Hex*   hexa = Hex::getInstance ();
+   return hexa;
+}
+// ======================================================== what (fonction)
+void what ()
+{
+   Hex* hexa = Hex::getInstance ();
+   hexa->what ();
+}
+
 END_NAMESPACE_HEXA