Skip to content
Snippets Groups Projects
Commit 394b3a73 authored by Maxime Graulich's avatar Maxime Graulich
Browse files

ONELAB2: add missing files

parent 5866c8cb
No related branches found
No related tags found
No related merge requests found
......@@ -201,6 +201,26 @@ int GmshBatch()
Msg::GetCommSize(), Msg::GetCommSize() > 1 ? "s" : "",
Msg::GetMaxThreads(), Msg::GetMaxThreads() > 1 ? "s" : "");
Msg::Info("Started on %s", Msg::GetLaunchDate().c_str());
#ifdef HAVE_ONELAB2
if(CTX::instance()->onelab.listen_port > 0) {
OnelabServer::instance(0, CTX::instance()->onelab.listen_port);
OnelabServer::instance()->Run();
Msg::Exit(0);
}
if(CTX::instance()->onelab.server_ip[0] != '\0' && CTX::instance()->onelab.server_port > 0) {
OnelabDatabase::instance()->useAsNetworkClient(ip4_inet_pton(CTX::instance()->onelab.server_ip), CTX::instance()->onelab.server_port, "Gmsh");
OpenProject(GModel::current()->getFileName());
while(OnelabDatabase::instance()->wait() == 0 &&
!OnelabDatabase::instance()->networkClientHaveToStop()) {
std::cout << "ok now i " << OnelabDatabase::instance()->actionToDo() << std::endl;
OnelabDatabase::instance()->useAsNetworkClient(ip4_inet_pton(CTX::instance()->onelab.server_ip), CTX::instance()->onelab.server_port, "Gmsh"); // restart the listen thread
OnelabDatabase::instance()->run(OnelabDatabase::instance()->actionToDo(), "Gmsh");// run Gmsh
}
std::cout << "Exit had to stop ? " << OnelabDatabase::instance()->networkClientHaveToStop() << std::endl;
Msg::Exit(0);
}
#endif
OpenProject(GModel::current()->getFileName());
bool open = false;
......@@ -345,11 +365,13 @@ int GmshFLTK(int argc, char **argv)
else
Msg::Error("Invalid background mesh (no view)");
}
#ifndef HAVE_ONELAB2
// listen to external solvers
if(CTX::instance()->solver.listen){
gmshLocalNetworkClient *c = new gmshLocalNetworkClient("Listen", "");
c->run();
}
#endif
// launch solver (if requested) and fill onelab tree
solver_cb(0, (void*)CTX::instance()->launchSolverAtStartup);
......
#include "GmshLocalClient.h"
#include "onelabUtils.h"
#ifdef HAVE_FLTK
#include "onelab2Group.h"
void GmshLocalClient::setCallback(onelabGroup *cb) {_cb_obj = cb;}
void GmshLocalClient::onNewParameter(onelab::parameter *p){if(_cb_obj) _cb_obj->addParameter(*p);}
void GmshLocalClient::onUpdateParameter(onelab::parameter *p){if(_cb_obj) _cb_obj->updateParameter(*p);}
void GmshLocalClient::onRemoveParameter(onelab::parameter *p){if(_cb_obj) _cb_obj->removeParameter(*p);}
#endif
void GmshLocalClient::run(std::string action) {
if(getName() == "Gmsh") onelabUtils::runGmshClient(action, 2);
}
#include <iostream>
#include "GmshNetworkClient.h"
#ifdef HAVE_FLTK
#include "onelab2Group.h"
void GmshNetworkClient::setCallback(onelabGroup *cb) {_cb_obj = cb;}
void GmshNetworkClient::onNewParameter(onelab::parameter *p){if(_cb_obj) _cb_obj->addParameter(*p);}
void GmshNetworkClient::onUpdateParameter(onelab::parameter *p){if(_cb_obj) _cb_obj->updateParameter(*p);}
void GmshNetworkClient::onRemoveParameter(onelab::parameter *p){if(_cb_obj) _cb_obj->removeParameter(*p);}
#endif
#include "OnelabDatabase.h"
OnelabServer *OnelabServer::_server = NULL;
#ifndef WIN32
void *OnelabDatabase_listen(void *arg)
#else
DWORD WINAPI OnelabDatabase_listen(LPVOID arg)
#endif
{
std::string *client = (std::string *)arg;
OnelabProtocol msg(-1);
UInt8 buff[1024];
int recvlen = 0;
while(1) {
recvlen = OnelabDatabase::instance()->listen(buff, 1024);
if(recvlen == 1 && buff[0] == 'S')
break;
msg.parseMsg(buff, recvlen);
msg.showMsg();
switch(msg.msgType()) {
case OnelabProtocol::OnelabStop:
std::clog << "\033[0;35m" << "Client is going to stop" << "\033[0;0m" << std::endl;
OnelabDatabase::instance()->networkClientHaveToStop(true);
return NULL;
case OnelabProtocol::OnelabMessage:
Msg::Info("Message from onelab"); // TODO
break;
case OnelabProtocol::OnelabResponse:
case OnelabProtocol::OnelabUpdate:
std::clog << "\033[0;35m" << "Update parameter on client" << "\033[0;0m" << std::endl;
for(std::vector<OnelabAttr *>::iterator it = msg.attrs.begin() ; it != msg.attrs.end(); ++it) {
if((*it)->getAttributeType() == OnelabAttr::Number) {
onelab::number *attr = (onelab::number *)*it;
OnelabDatabase::instance()->set(*attr, false);
}
else if((*it)->getAttributeType() == OnelabAttr::String) {
onelab::string *attr = (onelab::string *)*it;
OnelabDatabase::instance()->set(*attr, false);
}
else if((*it)->getAttributeType() == OnelabAttr::Region) {
onelab::region *attr = (onelab::region *)*it;
OnelabDatabase::instance()->set(*attr, false);
}
else if((*it)->getAttributeType() == OnelabAttr::Function) {
onelab::function *attr = (onelab::function *)*it;
OnelabDatabase::instance()->set(*attr, false);
}
else if((*it)->getAttributeType() == OnelabAttrFileQuery::attributeType()) {
OnelabAttrFileQuery *attr = (OnelabAttrFileQuery *)*it;
const char *filename = attr->getFilename();
// FIXME path/filename ?
std::clog << "try to open " << filename << " for reading" << std::endl;
FILE *fp = fopen(filename, "rb");
if(fp != NULL){
OnelabProtocol rep(OnelabProtocol::OnelabUpdate);
rep.attrs.push_back(new OnelabAttrFile(std::string(filename), fp));
recvlen = rep.encodeMsg(buff, 1024);
OnelabDatabase::instance()->sendbytes(buff, recvlen);
while((recvlen = fread(buff, 1, 1024, fp)) > 0)
OnelabDatabase::instance()->sendbytes(buff, recvlen);
}
}
else if((*it)->getAttributeType() == OnelabAttrFile::attributeType()) {
OnelabAttrFile *attr = (OnelabAttrFile *)*it;
const char *filename = attr->getFilename();
std::clog << "try to open " << filename << " for writing" << std::endl;
FILE *fp = fopen(filename, "wb");
if(fp != NULL){
unsigned int filesize = ((OnelabAttrFile *)attr)->getFileSize();
unsigned int downloadsize = 0;
while(downloadsize < filesize) {
recvlen = OnelabDatabase::instance()->listen(buff, 1024);
downloadsize += recvlen;
fwrite(buff, 1, recvlen, fp);
}
}
}
}
break;
case OnelabProtocol::OnelabAction:
{
std::clog << "\033[0;35m" << "Client have to perform an action" << "\033[0;0m" << std::endl;
std::cout << "nb attr: " << msg.attrs.size() << std::endl;//" attr type: " << msg.attrs[0]->getAttributeType() << " and must be " << OnelabAttrAction::attributeType() << std::endl;
if(msg.attrs.size()==1 && msg.attrs[0]->getAttributeType() == OnelabAttrAction::attributeType()) {
OnelabAttrAction *attr = (OnelabAttrAction *)msg.attrs[0];
std::cout << attr->getAction() << " on " << attr->getClient() << "( i'm " << ((client)?*client:"nobody") << ") ?" << std::endl;
if(client && client->size() && *client == attr->getClient()) {
OnelabDatabase::instance()->haveToDo(attr->getAction());
return NULL;
}
}
break;
}
}
}
}
#ifndef WIN32
void *OnelabDatabase_server(void *arg)
#else
DWORD WINAPI OnelabDatabase_server(LPVOID arg)
#endif
{
OnelabServer::instance()->Run();
}
#include "OnelabLocalClient.h"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment