Salome HOME
Compilation under Windows: add missing header
[modules/kernel.git] / src / Launcher / Launcher_XML_Persistence.cxx
index 8da04042330c85370451b42573650a5faf659423..ff1c2bff1e3906411ecfa9d61b3cf5804d036d91 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -24,6 +24,7 @@
 
 #include "Launcher_XML_Persistence.hxx"
 #include "Launcher_Job_Command.hxx"
+#include "Launcher_Job_CommandSALOME.hxx"
 #include "Launcher_Job_YACSFile.hxx"
 #include "Launcher_Job_PythonSALOME.hxx"
 
@@ -241,11 +242,13 @@ XML_Persistence::createJobFromXmlNode(xmlNodePtr job_node)
   string job_type = getAttrValue(job_node, "type");
   if (job_type.empty())
     throw LauncherException(string("Invalid job \"") + job_name + "\": type is not defined");
-  if (job_type == "command")
+  if (job_type == Launcher::Job_Command::TYPE_NAME)
     new_job = new Launcher::Job_Command();
-  else if (job_type == "yacs_file")
+  else if (job_type == Launcher::Job_CommandSALOME::TYPE_NAME)
+    new_job = new Launcher::Job_CommandSALOME();
+  else if (job_type == Launcher::Job_YACSFile::TYPE_NAME)
     new_job = new Launcher::Job_YACSFile();
-  else if (job_type == "python_salome")
+  else if (job_type == Launcher::Job_PythonSALOME::TYPE_NAME)
     new_job = new Launcher::Job_PythonSALOME();
   else
   {
@@ -512,4 +515,72 @@ XML_Persistence::addAttr(xmlNodePtr node, const string & name, const string & va
   xmlFree(xmlStrValue);
 }
 
+Job*
+XML_Persistence::createJobFromString(const std::string& jobDump)
+{
+  xmlDocPtr doc;
+  doc = xmlReadMemory(jobDump.c_str(), (int)jobDump.length(), "noname.xml", NULL, 0); //TODO: conversion from size_t to int, possible loss of data
+  if (doc == NULL)
+  {
+    std::string error = "Error in xmlReadMemory in XML_Persistence::createJobFromString, could not parse string: " + jobDump;
+    LAUNCHER_INFOS(error);
+    throw LauncherException(error);
+  }
+
+  // Step 3: Find jobs
+  Job * result = NULL;
+  xmlNodePtr root_node = xmlDocGetRootElement(doc);
+  if (xmlStrToString(root_node->name) == "jobs")
+  {
+    xmlNodePtr xmlCurrentNode = root_node->xmlChildrenNode;
+    while(xmlCurrentNode != NULL && result == NULL)
+    {
+      if (xmlStrToString(xmlCurrentNode->name) == "job")
+      {
+        LAUNCHER_INFOS("A job is found");
+        result = createJobFromXmlNode(xmlCurrentNode);
+      }
+      xmlCurrentNode = xmlCurrentNode->next;
+    }
+  }
+  else
+  {
+    xmlFreeDoc(doc);
+    std::string error = "Error while parsing job dump: " + jobDump;
+    LAUNCHER_INFOS(error);
+    throw LauncherException(error);
+  }
+
+  // Clean
+  xmlFreeDoc(doc);
+  return result;
+}
+
+std::string
+XML_Persistence::dumpJob(const Job& job)
+{
+  // Initialization
+  xmlKeepBlanksDefault(0);
+  xmlDocPtr doc = xmlNewDoc(xmlCharStrdup("1.0"));
+  xmlNodePtr root_node = xmlNewNode(NULL, xmlCharStrdup("jobs"));
+  xmlDocSetRootElement(doc, root_node);
+  xmlNodePtr doc_comment = xmlNewDocComment(doc, xmlCharStrdup("SALOME Launcher job"));
+  xmlAddPrevSibling(root_node, doc_comment);
+
+  addJobToXmlDocument(root_node, job);
+
+  // Final step: write to result
+  xmlChar *xmlbuff;
+  int buffersize;
+  xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1);
+  std::string result;
+  if(buffersize > 0)
+    result = (const char*) xmlbuff;
+
+  // Clean
+  xmlFree(xmlbuff);
+  xmlFreeDoc(doc);
+  return result;
+}
+
 }