]> Creatis software - crea.git/blobdiff - lib/creaDevManagerLib/modelCDMProject.cpp
Feature #1711 CreaDevManager application implementation
[crea.git] / lib / creaDevManagerLib / modelCDMProject.cpp
index 14422b6286332463bbe1fa7f82e6b9db64d8ed32..c39463376e247080cecea63f49a45723ac5e4de9 100644 (file)
@@ -263,7 +263,11 @@ bool modelCDMProject::SetVersion(const std::string& version, std::string*& resul
   time_t now = time(0);
 
   tm ltm;
+#ifdef _WIN32
   localtime_s(&ltm, &now);
+#else
+  ltm = *(localtime(&now));
+#endif
 
   std::stringstream date;
   date << ltm.tm_mday << "/" << 1 + ltm.tm_mon << "/" << 1900 + ltm.tm_year;
@@ -297,7 +301,11 @@ bool modelCDMProject::SetVersion(const std::string& version, std::string*& resul
   in.close();
   out.close();
   //delete old file and rename new file
+#ifdef _WIN32
+  std::string renameCommand = "move /Y \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt\"";
+#else
   std::string renameCommand = "mv \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + "CMakeLists.txt\"";
+#endif
   if(system(renameCommand.c_str()))
     {
       result = new std::string("An error occurred while running '" + renameCommand + "'.");
@@ -337,7 +345,7 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage(
   //fixing input parameters
   std::vector<std::string> words;
 
-  CDMUtilities::splitter::split(words,name," ",CDMUtilities::splitter::no_empties);
+  CDMUtilities::splitter::split(words,name," '/\"\\,.",CDMUtilities::splitter::no_empties);
   std::string nameFixed = "";
   for (int i = 0; i < (int)(words.size()); i++)
     {
@@ -345,7 +353,7 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage(
     }
 
   words.clear();
-  CDMUtilities::splitter::split(words,authors," ",CDMUtilities::splitter::no_empties);
+  CDMUtilities::splitter::split(words,authors," '/\"\\,.",CDMUtilities::splitter::no_empties);
   std::string authorFixed;
   for (int i = 0; i < (int)(words.size()); i++)
     {
@@ -354,13 +362,13 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage(
 
   words.clear();
   std::string descriptionFixed;
-  CDMUtilities::splitter::split(words,authorsEmail," ",CDMUtilities::splitter::no_empties);
+  CDMUtilities::splitter::split(words,authorsEmail," '/\"\\,",CDMUtilities::splitter::no_empties);
   for (int i = 0; i < (int)(words.size()); i++)
     {
-      descriptionFixed += words[i];
+      descriptionFixed += words[i] + "/";
     }
   words.clear();
-  CDMUtilities::splitter::split(words,description," ",CDMUtilities::splitter::no_empties);
+  CDMUtilities::splitter::split(words,description," '\"",CDMUtilities::splitter::no_empties);
   for (int i = 0; i < (int)(words.size()); i++)
     {
       descriptionFixed += "_" + words[i];
@@ -369,12 +377,24 @@ modelCDMIProjectTreeNode* modelCDMProject::CreatePackage(
   //call project to create package : use bbCreatePackage <path> <name> [author] [description]
   std::string creationCommand = "bbCreatePackage \"" + this->path + "\" \"" + nameFixed + "\" \"" + authorFixed + "\" \"" + descriptionFixed + "\"";
   //TODO: bbCreatePackage script always returning 0. It should return 1 or greater if any error
-  if(system(creationCommand.c_str()))
+  bool resultCommand = 0 != system(creationCommand.c_str());
+#ifdef _WIN32
+  resultCommand = false;
+#endif
+  if(resultCommand)
     {
       result = new std::string("An error occurred while running '" + creationCommand + "'.");
       return NULL;
     }
 
+  //add library to project CMakeLists
+  std::fstream out1((this->path + CDMUtilities::SLASH + "CMakeLists.txt").c_str(), std::fstream::in | std::fstream::out | std::fstream::app);
+  if (out1.is_open())
+    {
+      out1 << "ADD_SUBDIRECTORY(bbtk_" << nameFixed << "_PKG)" << std::endl;
+      out1.close();
+    }
+
   //add library to model
   modelCDMPackage* package = new modelCDMPackage(this, this->path + CDMUtilities::SLASH + "bbtk_" + nameFixed + "_PKG", "bbtk_" + nameFixed + "_PKG", this->level + 1);
   this->packages.push_back(package);
@@ -404,13 +424,14 @@ modelCDMIProjectTreeNode* modelCDMProject::CreateLibrary(
 
 modelCDMIProjectTreeNode* modelCDMProject::CreateApplication(
     const std::string& name,
+    const int& type,
     std::string*& result,
     const std::string& path
 )
 {
   if(this->appli != NULL)
     {
-      return this->appli->CreateApplication(name, result);
+      return this->appli->CreateApplication(name, type, result);
     }
   result = new std::string("there is no appli folder in this project.");
   return NULL;
@@ -680,6 +701,13 @@ bool modelCDMProject::ConfigureBuild(std::string*& result)
   //TODO: adjust for windows and mac
 #ifdef _WIN32
   // ------ Windows
+  if(0 == system("cmake-gui"))
+    return true;
+  else
+    {
+         result = new std::string("There was an error opening cmake-gui. Please make sure it's installed and that cmake's bin folder is in the system path.");
+      return false;
+    }
 #elif __APPLE__
   // ------ Apple
 #else
@@ -719,6 +747,15 @@ bool modelCDMProject::Build(std::string*& result, const std::string& line)
   //TODO: adjust for windows and mac
 #ifdef _WIN32
   // ------ Windows
+       std::string command = "start \"\" \"" + this->buildPath + CDMUtilities::SLASH + this->nameProject + ".sln\"";
+  //wxMessageBox(crea::std2wx(command), wxT("Project Compilation - Check!"));
+       if(0 == system(command.c_str()))
+    return true;
+  else
+    {
+      result = new std::string("An error has happened running: \"" + command + "\". Please make sure to have visual c++ installed.");
+         return false;
+    }
 #elif __APPLE__
   // ------ Apple
 #else
@@ -764,29 +801,69 @@ bool modelCDMProject::Build(std::string*& result, const std::string& line)
   return true;
 }
 
-bool modelCDMProject::Connect(std::string*& result)
+bool modelCDMProject::Connect(std::string*& result, const std::string& folder)
 {
-  //TODO: adjust for windows and mac
+  //TODO: adjust for mac
 #ifdef _WIN32
   // ------ Windows
+  //open binary folder
+  wxDir dir(crea::std2wx(folder));
+
+  //if binary folder can't be opened then return false
+  if (!dir.IsOpened())
+    {
+      result = new std::string("The path could not be opened. Make sure the folder exists and contains a bbtkPackage file.");
+      return false;
+    }
+  //create plug command
+  std::string plugComm = "bbPlugPackage \"" + folder + "\"";
+  std::cout << "executing '" << plugComm << "'" << std::endl;
+  //execute plug command
+  if(system(std::string("start cmd.exe /k \"" + plugComm + "\"").c_str()))
+    {
+      //if there was an error then report it
+      result = new std::string("There was an error plugging the packages of the project, please check the console to read more about the problem.");
+      return false;
+    }
 #elif __APPLE__
   // ------ Apple
 #else
   // ------ Linux
   //open binary folder
-  wxDir dir(crea::std2wx((this->buildPath).c_str()));
+  wxDir dir(crea::std2wx(folder));
 
   //if binary folder can't be opened then return false
   if (!dir.IsOpened())
     {
-      result = new std::string("The build path could not be opened. Make sure to configure the project before compiling it");
+      result = new std::string("The path could not be opened. Make sure the folder exists and contains a bbtkPackage file.");
       return false;
     }
   //create plug command
-  std::string plugComm = "bbPlugPackage \"" + this->buildPath + "\" > \"" + this->buildPath + CDMUtilities::SLASH + "plugging.log\" 2>&1";
-  std::cout << "executing '" << plugComm << "'" << std::endl;
+  std::string plugComm = "bbPlugPackage \"" + this->buildPath + "\"";
+
+  std::string Comm = "gnome-terminal -e \"bash -c \\\"";
+    for (int i = 0; i < plugComm.size(); i++)
+      {
+        if(plugComm[i] == '"')
+          {
+            Comm+="\\\\\\\"";
+          }
+        else if(plugComm[i] == '\\')
+          {
+            Comm+="\\\\\\\\";
+          }
+        else
+          {
+            Comm.push_back(plugComm[i]);
+          }
+      }
+    Comm += "; echo -e '\\a'; bash";
+    Comm += "\\\"\"";
+
+
+  std::cout << "executing '" << Comm << "'" << std::endl;
   //execute plug command
-  if(system(plugComm.c_str()))
+  if(system(Comm.c_str()))
     {
       //if there was an error then report it
       result = new std::string("There was an error plugging the packages of the project, please check the console to read more about the problem.");
@@ -930,3 +1007,96 @@ void modelCDMProject::CheckStructure(std::map<std::string, bool>& properties)
       this->packages[i]->CheckStructure(properties);
     }
 }
+
+bool modelCDMProject::IsPackageIncluded(const std::string& package_name)
+{
+  if (this->HasCMakeLists())
+    {
+      CDMUtilities::CMLFile cmlFile = CDMUtilities::readCMLFile(this->CMakeLists->GetPath().c_str());
+      for (int i = 0; i < cmlFile.size(); ++i)
+        {
+          if (cmlFile[i].first=="command" && cmlFile[i].second[0] == "ADD_SUBDIRECTORY")
+            {
+              int pos = 1;
+              while (pos < cmlFile[i].second.size())
+                {
+                  if (!isspace(cmlFile[i].second[pos][0]) && cmlFile[i].second[pos][0] != '(' && cmlFile[i].second[pos][0] != '#')
+                    {
+                      if (package_name == cmlFile[i].second[pos])
+                        return true;
+                      break;
+                    }
+                  pos++;
+                }
+            }
+        }
+    }
+  return false;
+
+}
+
+bool modelCDMProject::SetPackageInclude(const std::string& package_name, const bool& toInclude)
+{
+  if (this->HasCMakeLists())
+    {
+      CDMUtilities::CMLFile cmlFile = CDMUtilities::readCMLFile(this->CMakeLists->GetPath().c_str());
+
+      bool found = false;
+
+      for (int i = 0; i < cmlFile.size(); ++i)
+        {
+          if(toInclude && cmlFile[i].first == "comment")
+            {
+              std::vector<std::string> segments;
+              std::string line = cmlFile[i].second[0];
+              while(line[0] == '#')
+                line.erase(0,1);
+
+              CDMUtilities::splitter::split(segments, line, " ()", CDMUtilities::splitter::no_empties);
+              if (segments.size() > 1 && segments[0] == "ADD_SUBDIRECTORY" && segments[1] == package_name)
+                {
+                  found = true;
+                  while(cmlFile[i].second[0][0] == '#')
+                    cmlFile[i].second[0].erase(0,1);
+                }
+            }
+          else if(cmlFile[i].first == "command" && cmlFile[i].second[0] == "ADD_SUBDIRECTORY")
+            {
+              int pos = 1;
+              while (pos < cmlFile[i].second.size())
+                {
+                  if (!isspace(cmlFile[i].second[pos][0]) && cmlFile[i].second[pos][0] != '(' && cmlFile[i].second[pos][0] != '#')
+                    {
+                      if (package_name == cmlFile[i].second[pos])
+                        {
+                          found = true;
+                          if (!toInclude)
+                            {
+                              cmlFile[i].first = "comment";
+                              cmlFile[i].second[0] = "#" + cmlFile[i].second[0];
+                              while (cmlFile[i].second.size() > 1)
+                                {
+                                  cmlFile[i].second[0] += cmlFile[i].second[1];
+                                  cmlFile[i].second.erase(cmlFile[i].second.begin()+1);
+                                }
+
+                            }
+                        }
+                      break;
+                    }
+                  pos++;
+                }
+            }
+        }
+      if (!found && toInclude)
+        {
+          CDMUtilities::syntaxElement element;
+          element.first = "command";
+          element.second.push_back("ADD_SUBDIRECTORY(" + package_name + ")");
+          cmlFile.push_back(element);
+        }
+
+      return CDMUtilities::writeCMLFile(this->CMakeLists->GetPath().c_str(),cmlFile);
+    }
+  return false;
+}