]> Creatis software - crea.git/blobdiff - lib/creaDevManagerLib/modelCDMBlackBox.cpp
Feature #1711
[crea.git] / lib / creaDevManagerLib / modelCDMBlackBox.cpp
index 5ea4a26cbfae621fd360a674a0044f096b5b17f5..295a4333b2a5eb537ded5e3c8a43a27f11d38935 100644 (file)
 
 #include "modelCDMBlackBox.h"
 
+#include<fstream>
+
+#include "CDMUtilities.h"
+
 #include<creaWx.h>
 #include"wx/dir.h"
 
 modelCDMBlackBox::modelCDMBlackBox()
 {
+  this->source = NULL;
+  this->header = NULL;
 }
 
-modelCDMBlackBox::modelCDMBlackBox(const std::string& hName, const std::string& path, const int& level)
+modelCDMBlackBox::modelCDMBlackBox(modelCDMIProjectTreeNode* parent, const std::string& path, const std::string& name, const int& level)
 {
-  this->name = this->nameBlackBox = hName.substr(2, hName.size()-4);
+  std::cout << "creating black box: " + name + " in " + path + "\n";
+  this->parent = parent;
+  this->name = name;
   this->path = path;
   this->level = level;
   this->type = wxDIR_DIRS;
+  this->source = NULL;
+  this->header = NULL;
+
+  std::string pathHeader = path + CDMUtilities::SLASH + "bb" + this->name + ".h";
+
+  std::ifstream confFile;
+  confFile.open((pathHeader).c_str());
+  std::string word;
+  while(confFile.is_open() && !confFile.eof())
+    {
+      //get BBTK's
+      std::getline(confFile,word,'(');
+      std::vector<std::string> wordBits;
+      CDMUtilities::splitter::split(wordBits,word," \n",CDMUtilities::splitter::no_empties);
+
+      if(wordBits[wordBits.size()-1] == "BBTK_NAME")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->nameBlackBox = word;
+        }
+      else if(wordBits[wordBits.size()-1] == "BBTK_AUTHOR")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->authors = word;
+        }
+      else if(wordBits[wordBits.size()-1] == "BBTK_DESCRIPTION")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->description = word;
+        }
+      else if(wordBits[wordBits.size()-1] == "BBTK_CATEGORY")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->categories = word;
+          if (this->categories == "")
+            this->categories = "empty";
+        }
+    }
+  confFile.close();
+
 }
 
 modelCDMBlackBox::~modelCDMBlackBox()
 {
+  this->header = NULL;
+  this->source = NULL;
 }
 
 const std::string& modelCDMBlackBox::GetNameBlackBox() const
@@ -63,11 +117,6 @@ const std::string& modelCDMBlackBox::GetAuthors() const
   return this->authors;
 }
 
-const std::string& modelCDMBlackBox::GetAuthorsEmail() const
-{
-  return this->authorsEmail;
-}
-
 const std::string& modelCDMBlackBox::GetCategories() const
 {
   return this->categories;
@@ -78,32 +127,119 @@ const std::string& modelCDMBlackBox::GetDescription() const
   return this->description;
 }
 
-const std::string& modelCDMBlackBox::GetVersion() const
-{
-  return this->version;
-}
-
 bool modelCDMBlackBox::SetAuthors(const std::string& authors, std::string*& result)
 {
-  //TODO: implement method
-  return true;
-}
+  std::vector<std::string> words;
+  CDMUtilities::splitter::split(words, authors, "/\\\"\n", CDMUtilities::splitter::no_empties);
+  std::string authorsReal = words[0];
+  for (int i = 1; i < (int)(words.size()); i++)
+    {
+      authorsReal += "," + words[i];
+    }
 
-bool modelCDMBlackBox::SetAuthorsEmail(
-    const std::string& email,
-    std::string*& result
-)
-{
-  //TODO: implement method
+  //opening original header
+  std::string pathHeader = this->header->GetPath();
+  std::ifstream in(pathHeader.c_str());
+  if( !in.is_open())
+    {
+      result = new std::string(pathHeader + " file failed to open.");
+      return false;
+    }
+  //opening temporal header
+  std::ofstream out((pathHeader + ".tmp").c_str());
+  if( !out.is_open())
+    {
+      result = new std::string(pathHeader + ".tmp file failed to open.");
+      return false;
+    }
+  //copying contents from original to temporal and making changes
+  std::string reading;
+  while (getline(in, reading, '('))
+    {
+      CDMUtilities::splitter::split(words, reading, "\n ", CDMUtilities::splitter::no_empties);
+      if(words[words.size() - 1] == "BBTK_AUTHOR")
+        {
+          out << reading << "(\"" << authorsReal << "\")";
+          getline(in, reading, ')');
+        }
+      else
+        {
+          out << reading;
+          if (!in.eof())
+            out << "(";
+        }
+    }
+  in.close();
+  out.close();
+  //delete old file and rename new file
+  std::string renameCommand = "mv \"" + pathHeader + ".tmp\" \"" + pathHeader + "\"";
+  if(system(renameCommand.c_str()))
+    {
+      result = new std::string("An error occurred while running '" + renameCommand + "'.");
+      return false;
+    }
+
+  this->authors = authorsReal;
   return true;
+
 }
 
 bool modelCDMBlackBox::SetCategories(
-    const std::string& version,
+    const std::string& categories,
     std::string*& result
 )
 {
-  //TODO: implement method
+  std::vector<std::string> words;
+  CDMUtilities::splitter::split(words, categories, "\"\\/", CDMUtilities::splitter::no_empties);
+  std::string catsReal = words[0];
+  for (int i = 1; i < (int)(words.size()); i++)
+    {
+      catsReal += "," + words[i];
+    }
+
+  //opening original header
+  std::string pathHeader = this->header->GetPath();
+  std::ifstream in(pathHeader.c_str());
+  if( !in.is_open())
+    {
+      result = new std::string(pathHeader + " file failed to open.");
+      return false;
+    }
+  //opening temporal header
+  std::ofstream out((pathHeader + ".tmp").c_str());
+  if( !out.is_open())
+    {
+      result = new std::string(pathHeader + ".tmp file failed to open.");
+      return false;
+    }
+  //copying contents from original to temporal and making changes
+  std::string reading;
+  while (getline(in, reading, '('))
+    {
+      CDMUtilities::splitter::split(words, reading, "\n ", CDMUtilities::splitter::no_empties);
+      if(words[words.size() - 1] == "BBTK_CATEGORY")
+        {
+          out << reading << "(\"" << catsReal << "\")";
+          getline(in, reading, ')');
+        }
+      else
+        {
+          out << reading;
+          if (!in.eof())
+            out << "(";
+        }
+    }
+  in.close();
+  out.close();
+  //delete old file and rename new file
+  std::string renameCommand = "mv \"" + pathHeader + ".tmp\" \"" + pathHeader + "\"";
+  if(system(renameCommand.c_str()))
+    {
+      result = new std::string("An error occurred while running '" + renameCommand + "'.");
+      return false;
+    }
+
+  this->categories = catsReal;
   return true;
 }
 
@@ -112,30 +248,136 @@ bool modelCDMBlackBox::SetDescription(
     std::string*& result
 )
 {
-  //TODO: implement method
+  std::vector<std::string> words;
+  CDMUtilities::splitter::split(words, description, "\"\n\\/", CDMUtilities::splitter::no_empties);
+  std::string descReal = words[0];
+  for (int i = 1; i < (int)(words.size()); i++)
+    {
+      descReal += "-" + words[i];
+    }
+
+  //opening original header
+  std::string pathHeader = this->header->GetPath();
+  std::ifstream in(pathHeader.c_str());
+  if( !in.is_open())
+    {
+      result = new std::string(pathHeader + " file failed to open.");
+      return false;
+    }
+  //opening temporal header
+  std::ofstream out((pathHeader + ".tmp").c_str());
+  if( !out.is_open())
+    {
+      result = new std::string(pathHeader + ".tmp file failed to open.");
+      return false;
+    }
+  //copying contents from original to temporal and making changes
+  std::string reading;
+  while (getline(in, reading, '('))
+    {
+      CDMUtilities::splitter::split(words, reading, "\n ", CDMUtilities::splitter::no_empties);
+      if(words[words.size() - 1] == "BBTK_DESCRIPTION")
+        {
+          out << reading << "(\"" << descReal << "\")";
+          getline(in, reading, ')');
+        }
+      else
+        {
+          out << reading;
+          if (!in.eof())
+            out << "(";
+        }
+    }
+  in.close();
+  out.close();
+  //delete old file and rename new file
+  std::string renameCommand = "mv \"" + pathHeader + ".tmp\" \"" + pathHeader + "\"";
+  if(system(renameCommand.c_str()))
+    {
+      result = new std::string("An error occurred while running '" + renameCommand + "'.");
+      return false;
+    }
+
+  this->description = descReal;
   return true;
 }
 
-bool modelCDMBlackBox::SetVersion(const std::string& version, std::string*& result)
+void modelCDMBlackBox::SetHeaderFile(modelCDMFile* file)
+{
+  this->header = file;
+}
+
+void modelCDMBlackBox::SetSourceFile(modelCDMFile* file)
 {
-  //TODO: implement method
-    return true;
+  this->source = file;
 }
 
 bool modelCDMBlackBox::OpenCxx(std::string*& result)
 {
-  //TODO: implement method
-  return true;
+  return !CDMUtilities::openTextEditor(this->source->GetPath());
 }
 
 bool modelCDMBlackBox::OpenHxx(std::string*& result)
 {
-  //TODO: implement method
-  return true;
+  return !CDMUtilities::openTextEditor(this->header->GetPath());
+}
+
+modelCDMFile* modelCDMBlackBox::GetHeaderFile() const
+{
+  return this->header;
+}
+
+modelCDMFile* modelCDMBlackBox::GetSourceFile() const
+{
+  return this->source;
 }
 
 const bool modelCDMBlackBox::Refresh(std::string*& result)
 {
-  //TODO: implement method
+  std::cout << "refreshing black box: " << this->nameBlackBox << std::endl;
+  std::string pathHeader = path + CDMUtilities::SLASH + "bb" + this->name + ".h";
+
+  std::ifstream confFile;
+  confFile.open((pathHeader).c_str());
+  std::string word;
+
+  if(!confFile.is_open())
+    return false;
+
+  while(confFile.is_open() && !confFile.eof())
+    {
+      //get BBTK's
+      std::getline(confFile,word,'(');
+      std::vector<std::string> wordBits;
+      CDMUtilities::splitter::split(wordBits,word," \n",CDMUtilities::splitter::no_empties);
+
+      if(wordBits[wordBits.size()-1] == "BBTK_NAME")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->nameBlackBox = word;
+        }
+      else if(wordBits[wordBits.size()-1] == "BBTK_AUTHOR")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->authors = word;
+        }
+      else if(wordBits[wordBits.size()-1] == "BBTK_DESCRIPTION")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->description = word;
+        }
+      else if(wordBits[wordBits.size()-1] == "BBTK_CATEGORY")
+        {
+          std::getline(confFile,word,'"');
+          std::getline(confFile,word,'"');
+          this->categories = word;
+          if (this->categories == "")
+            this->categories = "empty";
+        }
+    }
+  confFile.close();
   return true;
 }