From c44e54c31a437bf229c188aa6bc693e6b65072db Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Sun, 17 Mar 2013 08:23:42 +0000
Subject: [PATCH] better handling of .pro + refactor server start

---
 Common/OpenFile.cpp  |  5 ++-
 Fltk/onelabGroup.cpp | 92 ++++++++++++++++++++++++--------------------
 2 files changed, 54 insertions(+), 43 deletions(-)

diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp
index c7662fe56f..4e4d63ef01 100644
--- a/Common/OpenFile.cpp
+++ b/Common/OpenFile.cpp
@@ -405,8 +405,8 @@ int MergeFile(const std::string &fileName, bool warnIfMissing)
 #if defined(HAVE_ONELAB) && defined(HAVE_FLTK)
   else if(ext == ".pro" && opt_solver_name(0, GMSH_GET, "") == "GetDP"){
     std::vector<std::string> split = SplitFileName(fileName);
-    GModel::current()->setName("");
-    status = MergeFile(split[0] + split[1] + ".geo");
+    GModel::current()->setName(split[1] + ".geo");
+    GModel::current()->setFileName(split[0] + split[1] + ".geo");
     CTX::instance()->launchSolverAtStartup = 0;
     return status;
   }
@@ -417,6 +417,7 @@ int MergeFile(const std::string &fileName, bool warnIfMissing)
     status = metamodel_cb(fileName);
   }
   else if(ext == ".py"){
+    // FIXME: should use launchSolverAtStartup
     FlGui::instance()->onelab->addSolver("python", fileName, "", 1);
     onelab_cb(0, (void*)"check");
     status = 1;
diff --git a/Fltk/onelabGroup.cpp b/Fltk/onelabGroup.cpp
index fcde484ccd..f7f42b5760 100644
--- a/Fltk/onelabGroup.cpp
+++ b/Fltk/onelabGroup.cpp
@@ -97,6 +97,50 @@ class onelabGmshServer : public GmshServer{
       }
     }
   }
+  int LaunchClient()
+  {
+    std::string sockname;
+    std::ostringstream tmp;
+    if(!strstr(CTX::instance()->solver.socketName.c_str(), ":")){
+      // Unix socket
+      tmp << CTX::instance()->homeDir << CTX::instance()->solver.socketName
+          << _client->getId();
+      sockname = FixWindowsPath(tmp.str());
+    }
+    else{
+      // TCP/IP socket
+      if(CTX::instance()->solver.socketName.size() &&
+         CTX::instance()->solver.socketName[0] == ':')
+        tmp << GetHostName(); // prepend hostname if only the port number is given
+      tmp << CTX::instance()->solver.socketName << _client->getId();
+      sockname = tmp.str();
+    }
+
+    std::string command = FixWindowsPath(_client->getExecutable());
+    if(command.size()){
+      std::vector<std::string> args = onelabUtils::getCommandLine(_client);
+      for(unsigned int i = 0; i < args.size(); i++)
+        command.append(" " + args[i]);
+      command.append(" " + _client->getSocketSwitch() +
+                     " \"" + _client->getName() + "\" %s");
+    }
+    else{
+      Msg::Info("Listening on socket '%s'", sockname.c_str());
+    }
+
+    int sock;
+    try{
+      sock = Start(command.c_str(), sockname.c_str(),
+                   CTX::instance()->solver.timeout);
+    }
+    catch(const char *err){
+      Msg::Error("Abnormal server termination (%s on socket %s)", err,
+                 sockname.c_str());
+      sock = -1;
+    }
+
+    return sock;
+  }
 };
 
 bool gmshLocalNetworkClient::receiveMessage()
@@ -339,46 +383,10 @@ bool gmshLocalNetworkClient::run()
 
   onelabGmshServer *server = new onelabGmshServer(this);
 
-  std::string sockname;
-  std::ostringstream tmp;
-  if(!strstr(CTX::instance()->solver.socketName.c_str(), ":")){
-    // Unix socket
-    tmp << CTX::instance()->homeDir << CTX::instance()->solver.socketName << getId();
-    sockname = FixWindowsPath(tmp.str());
-  }
-  else{
-    // TCP/IP socket
-    if(CTX::instance()->solver.socketName.size() &&
-       CTX::instance()->solver.socketName[0] == ':')
-      tmp << GetHostName(); // prepend hostname if only the port number is given
-    tmp << CTX::instance()->solver.socketName << getId();
-    sockname = tmp.str();
-  }
-
-  std::string command = FixWindowsPath(getExecutable());
-  if(command.size()){
-    std::vector<std::string> args = onelabUtils::getCommandLine(this);
-    for(unsigned int i = 0; i < args.size(); i++)
-      command.append(" " + args[i]);
-    command.append(" " + getSocketSwitch() + " \"" + getName() + "\" %s");
-  }
-  else{
-    Msg::Info("Listening on socket '%s'", sockname.c_str());
-  }
-
-  int sock;
-  try{
-    sock = server->Start(command.c_str(), sockname.c_str(),
-                         CTX::instance()->solver.timeout);
-  }
-  catch(const char *err){
-    Msg::Error("Abnormal server termination (%s on socket %s)", err,
-               sockname.c_str());
-    sock = -1;
-  }
+  int sock = server->LaunchClient();
 
   if(sock < 0){
-    // could not start the server: aborting
+    // could not establish the connection: aborting
     server->Shutdown();
     delete server;
     return false;
@@ -395,7 +403,7 @@ bool gmshLocalNetworkClient::run()
     bool stop = false, haveData = false;
     onelab::localNetworkClient *c = 0;
     for(int i = 0; i < getNumClients(); i++){
-      if(command.empty() && !CTX::instance()->solver.listen){
+      if(getExecutable().empty() && !CTX::instance()->solver.listen){
         // we stopped listening to the special "Listen" client
         stop = true;
         break;
@@ -450,7 +458,7 @@ bool gmshLocalNetworkClient::run()
 
   Msg::StatusBar(true, "Done running '%s'", _name.c_str());
 
-  if(command.empty()){
+  if(getExecutable().empty()){
     Msg::Info("Client disconnected: starting new connection");
     goto new_connection;
   }
@@ -1759,8 +1767,10 @@ void solver_cb(Fl_Widget *w, void *data)
   if(FlGui::instance()->onelab->isBusy())
     FlGui::instance()->onelab->show();
   else{
-    if(CTX::instance()->launchSolverAtStartup >= 0)
+    if(CTX::instance()->launchSolverAtStartup >= 0){
       onelab_cb(0, (void*)"reset");
+      onelabUtils::setFirstComputationFlag(true);
+    }
     else if(num >= 0)
       onelab_cb(0, (void*)"check");
     else
-- 
GitLab