Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tfarmcontroller.h"
Toshihiro Shimizu 890ddd
#include "tfarmexecutor.h"
Toshihiro Shimizu 890ddd
#include "tfarmserver.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tfilepath_io.h"
Toshihiro Shimizu 890ddd
#include "service.h"
Toshihiro Shimizu 890ddd
#include "tcli.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tthreadmessage.h"
Toshihiro Shimizu 890ddd
#include "tthread.h"
Toshihiro Shimizu 890ddd
#include "tstream.h"
Toshihiro Shimizu 890ddd
#include "tlog.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qobject></qobject>
Toshihiro Shimizu 890ddd
#include <qcoreapplication></qcoreapplication>
Toshihiro Shimizu 890ddd
#include <qeventloop></qeventloop>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tthread.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <string></string>
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
#include <sys param.h=""></sys>
Toshihiro Shimizu 890ddd
#include <unistd.h></unistd.h>
Toshihiro Shimizu 890ddd
#include <sys timeb.h=""></sys>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int inline STRICMP(const QString &a, const QString &b)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return a.compare(b, Qt::CaseSensitive);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
int inline STRICMP(const char *a, const char *b)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QString str(a);
Toshihiro Shimizu 890ddd
	return str.compare(QString(b), Qt::CaseSensitive);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#define STRICMP stricmp
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define STRICMP strcasecmp
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
#define NO_ERROR 0
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath getGlobalRoot()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath rootDir;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	TFilePath name(L"SOFTWARE\\OpenToonz\\OpenToonz\\1.0\\FARMROOT");
Toshihiro Shimizu 890ddd
	rootDir = TFilePath(TSystem::getSystemValue(name).toStdString());
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Leggo la globalRoot da File txt
Toshihiro Shimizu 890ddd
	Tifstream is(TFilePath("./OpenToonz_1.0.app/Contents/Resources/configfarmroot.txt"));
Toshihiro Shimizu 890ddd
	if (is) {
Toshihiro Shimizu 890ddd
		char line[1024];
Toshihiro Shimizu 890ddd
		is.getline(line, 80);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		char *s = line;
Toshihiro Shimizu 890ddd
		while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\"')
Toshihiro Shimizu 890ddd
			s++;
Toshihiro Shimizu 890ddd
		if (*s != '\0') {
Toshihiro Shimizu 890ddd
			char *t = s;
Toshihiro Shimizu 890ddd
			while (*t)
Toshihiro Shimizu 890ddd
				t++;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			string pathName(s, t - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			rootDir = TFilePath(pathName);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return rootDir;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath getLocalRoot()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath lroot;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	TFilePath name(L"SOFTWARE\\OpenToonz\\OpenToonz\\1.0\\TOONZROOT");
Toshihiro Shimizu 890ddd
	lroot = TFilePath(TSystem::getSystemValue(name).toStdString()) + TFilePath("toonzfarm");
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	// Leggo la localRoot da File txt
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Tifstream is(TFilePath("./OpenToonz_1.0.app/Contents/Resources/configfarmroot.txt"));
Toshihiro Shimizu 890ddd
	if (is) {
Toshihiro Shimizu 890ddd
		char line[1024];
Toshihiro Shimizu 890ddd
		is.getline(line, 80);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		char *s = line;
Toshihiro Shimizu 890ddd
		while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\"')
Toshihiro Shimizu 890ddd
			s++;
Toshihiro Shimizu 890ddd
		if (*s != '\0') {
Toshihiro Shimizu 890ddd
			char *t = s;
Toshihiro Shimizu 890ddd
			while (*t)
Toshihiro Shimizu 890ddd
				t++;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			string pathName(s, t - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			lroot = TFilePath(pathName);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//TFilePath name = TFilePath("TFARMLOCALROOT");
Toshihiro Shimizu 890ddd
//char *s = getenv(toString(name.getWideString()).c_str());
Toshihiro Shimizu 890ddd
//lroot = TFilePath(s?s:"");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return lroot;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool myDoesExists(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool exists = false;
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	TFileStatus fs(fp);
Toshihiro Shimizu 890ddd
	exists = fs.doesExist();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	int acc = access(toString(fp.getWideString()).c_str(), 00); // 00 == solo esistenza
Toshihiro Shimizu 890ddd
	exists = acc != -1;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return exists;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool dirExists(const TFilePath &dirFp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool exists = false;
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	TFileStatus fs(dirFp);
Toshihiro Shimizu 890ddd
	exists = fs.isDirectory();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	int acc = access(toString(dirFp.getWideString()).c_str(), 00); // 00 == solo esistenza
Toshihiro Shimizu 890ddd
	exists = acc != -1;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return exists;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool loadControllerData(QString &hostName, QString &addr, int &port)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath groot = getGlobalRoot();
Toshihiro Shimizu 890ddd
	TFilePath fp = groot + "config" + "controller.txt";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ControllerData controllerData;
Toshihiro Shimizu 890ddd
	::loadControllerData(fp, controllerData);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	hostName = controllerData.m_hostName;
Toshihiro Shimizu 890ddd
	addr = controllerData.m_ipAddress;
Toshihiro Shimizu 890ddd
	port = controllerData.m_port;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool isAScript(TFarmTask *task)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return false; //todo per gli script
Toshihiro Shimizu 890ddd
				  /*
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
   return task->m_cmdline.contains(".bat");
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
  return (task->m_cmdline.contains(".csh")|| 
Toshihiro Shimizu 890ddd
          task->m_cmdline.contains(".sh")|| 
Toshihiro Shimizu 890ddd
          task->m_cmdline.contains(".tcsh"))
Toshihiro Shimizu 890ddd
#endif   
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // anonymous namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class CtrlFarmTask : public TFarmTask
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	CtrlFarmTask() : m_toBeDeleted(false), m_failureCount(0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CtrlFarmTask(
Toshihiro Shimizu 890ddd
		const QString &id, const QString &name, const QString &cmdline,
Toshihiro Shimizu 890ddd
		const QString &user, const QString &host, int stepCount, int priority)
Toshihiro Shimizu 890ddd
		: TFarmTask(id, name, cmdline, user, host, stepCount, priority), m_toBeDeleted(false), m_failureCount(0)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_id = id;
Toshihiro Shimizu 890ddd
		m_status = Waiting;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CtrlFarmTask(const CtrlFarmTask &rhs)
Toshihiro Shimizu 890ddd
		: TFarmTask(rhs)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_serverId = rhs.m_serverId;
Toshihiro Shimizu 890ddd
		m_subTasks = rhs.m_subTasks;
Toshihiro Shimizu 890ddd
		m_toBeDeleted = rhs.m_toBeDeleted;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// TPersist implementation
Toshihiro Shimizu 890ddd
	void loadData(TIStream &is);
Toshihiro Shimizu 890ddd
	void saveData(TOStream &os);
Toshihiro Shimizu 890ddd
	const TPersistDeclaration *getDeclaration() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString m_serverId;
Toshihiro Shimizu 890ddd
	vector<qstring> m_subTasks;</qstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool m_toBeDeleted;
Toshihiro Shimizu 890ddd
	int m_failureCount;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<qstring> m_failedOnServers;</qstring>
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TFarmTaskDeclaration : public TPersistDeclaration
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TFarmTaskDeclaration(const string &id)
Toshihiro Shimizu 890ddd
		: TPersistDeclaration(id) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPersist *create() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return new CtrlFarmTask;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
} Declaration("tfarmtask");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void CtrlFarmTask::loadData(TIStream &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	is >> m_name;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString cmdline;
Toshihiro Shimizu 890ddd
	is >> cmdline;
Toshihiro Shimizu 890ddd
	parseCommandLine(cmdline);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_priority;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_user;
Toshihiro Shimizu 890ddd
	is >> m_hostName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_id;
Toshihiro Shimizu 890ddd
	is >> m_parentId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int status;
Toshihiro Shimizu 890ddd
	is >> status;
Toshihiro Shimizu 890ddd
	m_status = (TaskState)status;
Toshihiro Shimizu 890ddd
	is >> m_server;
Toshihiro Shimizu 890ddd
	QString dateStr;
Toshihiro Shimizu 890ddd
	is >> dateStr;
Toshihiro Shimizu 890ddd
	m_submissionDate = QDateTime::fromString(dateStr);
Toshihiro Shimizu 890ddd
	is >> dateStr;
Toshihiro Shimizu 890ddd
	m_startDate = QDateTime::fromString(dateStr);
Toshihiro Shimizu 890ddd
	is >> dateStr;
Toshihiro Shimizu 890ddd
	m_completionDate = QDateTime::fromString(dateStr);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_successfullSteps;
Toshihiro Shimizu 890ddd
	is >> m_failedSteps;
Toshihiro Shimizu 890ddd
	is >> m_stepCount;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_serverId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string tagName;
Toshihiro Shimizu 890ddd
	while (is.openChild(tagName)) {
Toshihiro Shimizu 890ddd
		if (tagName == "platform") {
Toshihiro Shimizu 890ddd
			int plat;
Toshihiro Shimizu 890ddd
			is >> plat;
Toshihiro Shimizu 890ddd
			switch (plat) {
Toshihiro Shimizu 890ddd
			case NoPlatform:
Toshihiro Shimizu 890ddd
				m_platform = NoPlatform;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			case Windows:
Toshihiro Shimizu 890ddd
				m_platform = Windows;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			case Irix:
Toshihiro Shimizu 890ddd
				m_platform = Irix;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			case Linux:
Toshihiro Shimizu 890ddd
				m_platform = Linux;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} else if (tagName == "dependencies") {
Toshihiro Shimizu 890ddd
			int depCount = 0;
Toshihiro Shimizu 890ddd
			is >> depCount;
Toshihiro Shimizu 890ddd
			if (depCount > 0)
Toshihiro Shimizu 890ddd
				m_dependencies = new Dependencies();
Toshihiro Shimizu 890ddd
			while (depCount > 0) {
Toshihiro Shimizu 890ddd
				TFarmTask::Id id;
Toshihiro Shimizu 890ddd
				is >> id;
Toshihiro Shimizu 890ddd
				m_dependencies->add(id);
Toshihiro Shimizu 890ddd
				depCount--;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		is.closeChild();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void CtrlFarmTask::saveData(TOStream &os)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	os << m_name;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << getCommandLine();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << m_priority;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << m_user;
Toshihiro Shimizu 890ddd
	os << m_hostName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << m_id;
Toshihiro Shimizu 890ddd
	os << m_parentId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << (int)m_status;
Toshihiro Shimizu 890ddd
	os << m_server;
Toshihiro Shimizu 890ddd
	os << m_submissionDate.toString();
Toshihiro Shimizu 890ddd
	os << m_startDate.toString();
Toshihiro Shimizu 890ddd
	os << m_completionDate.toString();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << m_successfullSteps;
Toshihiro Shimizu 890ddd
	os << m_failedSteps;
Toshihiro Shimizu 890ddd
	os << m_stepCount;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << m_serverId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os.openChild("platform");
Toshihiro Shimizu 890ddd
	os << m_platform;
Toshihiro Shimizu 890ddd
	os.closeChild();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os.openChild("dependencies");
Toshihiro Shimizu 890ddd
	if (m_dependencies) {
Toshihiro Shimizu 890ddd
		int depCount = m_dependencies->getTaskCount();
Toshihiro Shimizu 890ddd
		os << depCount;
Toshihiro Shimizu 890ddd
		int i = 0;
Toshihiro Shimizu 890ddd
		while (i < depCount) {
Toshihiro Shimizu 890ddd
			TFarmTask::Id id = m_dependencies->getTaskId(i++);
Toshihiro Shimizu 890ddd
			os << id;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		os << 0;
Toshihiro Shimizu 890ddd
	os.closeChild();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TPersistDeclaration *CtrlFarmTask::getDeclaration() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return &Declaration;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FarmServerProxy
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FarmServerProxy(const QString &hostName, const QString &addr, int port, int maxTaskCount = 1)
Toshihiro Shimizu 890ddd
		: m_hostName(hostName), m_addr(addr), m_port(port), m_offline(false), m_attached(false), m_maxTaskCount(maxTaskCount), m_platform(NoPlatform)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TFarmServerFactory serverFactory;
Toshihiro Shimizu 890ddd
		serverFactory.create(m_hostName, m_addr, m_port, &m_server);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~FarmServerProxy() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString getId() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getIpAddress();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString getHostName() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_hostName;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString getIpAddress() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_addr;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_port;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const vector<qstring> &getTasks() const</qstring>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_tasks;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int addTask(const CtrlFarmTask *task);
Toshihiro Shimizu 890ddd
	void terminateTask(const QString &taskId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// e' possibile rimuovere un task solo se non running
Toshihiro Shimizu 890ddd
	void removeTask(const QString &taskId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool testConnection(int timeout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void queryHwInfo(TFarmServer::HwInfo &hwInfo)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_server->queryHwInfo(hwInfo);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void attachController(const QString &name, const QString &addr, int port)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_server->attachController(name, addr, port);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void detachController(const QString &name, const QString &addr, int port)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_server->detachController(name, addr, port);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString m_hostName;
Toshihiro Shimizu 890ddd
	QString m_addr;
Toshihiro Shimizu 890ddd
	int m_port;
Toshihiro Shimizu 890ddd
	bool m_offline;
Toshihiro Shimizu 890ddd
	bool m_attached;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_maxTaskCount;
Toshihiro Shimizu 890ddd
	TFarmPlatform m_platform;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// vettore dei taskId assegnato al server
Toshihiro Shimizu 890ddd
	vector<qstring> m_tasks;</qstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFarmServer *m_server;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FarmServerProxy::addTask(const CtrlFarmTask *task)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int rc = m_server->addTask(task->m_id, task->getCommandLine());
Toshihiro Shimizu 890ddd
	if (rc == 0)
Toshihiro Shimizu 890ddd
		m_tasks.push_back(task->m_id);
Toshihiro Shimizu 890ddd
	return rc;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServerProxy::terminateTask(const QString &taskId)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_server->terminateTask(taskId);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServerProxy::removeTask(const QString &taskId)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	vector<qstring>::iterator it = find(m_tasks.begin(), m_tasks.end(), taskId);</qstring>
Toshihiro Shimizu 890ddd
	if (it != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		m_tasks.erase(it);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool doTestConnection(const QString &hostName, const QString &addr, int port)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TTcpIpClient client;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int sock;
Toshihiro Shimizu 890ddd
	int ret = client.connect(hostName, addr, port, sock);
Toshihiro Shimizu 890ddd
	if (ret == OK) {
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		closesocket(sock);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		close(sock);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
class ConnectionTest : public TThread::Runnable
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	ConnectionTest(const FarmServerProxy *server, HANDLE hEvent)
Toshihiro Shimizu 890ddd
		: m_server(server), m_hEvent(hEvent) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void run();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const FarmServerProxy *m_server;
Toshihiro Shimizu 890ddd
	HANDLE m_hEvent;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ConnectionTest::run()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool res = doTestConnection(
Toshihiro Shimizu 890ddd
		m_server->m_hostName, m_server->m_addr, m_server->m_port);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SetEvent(m_hEvent);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FarmServerProxy::testConnection(int timeout)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
Toshihiro Shimizu 890ddd
	if (!hEvent) {
Toshihiro Shimizu 890ddd
		// se fallisce la creazione dell'evento ci provo comunque
Toshihiro Shimizu 890ddd
		// senza timeout
Toshihiro Shimizu 890ddd
		return doTestConnection(m_hostName, m_addr, m_port);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThread::Executor executor;
Toshihiro Shimizu 890ddd
	executor.addTask(new ConnectionTest(this, hEvent));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DWORD rr = WaitForSingleObject(hEvent, timeout);
Toshihiro Shimizu 890ddd
	CloseHandle(hEvent);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (rr == WAIT_TIMEOUT)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	return doTestConnection(m_hostName, m_addr, m_port);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TTcpIpClient client;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int sock;
Toshihiro Shimizu 890ddd
	int ret = client.connect(m_hostName, m_addr, m_port, sock);
Toshihiro Shimizu 890ddd
	if (ret == OK) {
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		closesocket(sock);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		close(sock);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TaskId
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int m_id;
Toshihiro Shimizu 890ddd
	int m_subId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TaskId(int id, int subId = -1) : m_id(id), m_subId(m_subId){};
Toshihiro Shimizu 890ddd
	TaskId(const QString &id)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		int pos = id.indexOf(".");
Toshihiro Shimizu 890ddd
		if (pos != -1) {
Toshihiro Shimizu 890ddd
			m_id = id.left(pos).toInt();
Toshihiro Shimizu 890ddd
			m_subId = id.mid(pos + 1, id.length() - pos).toInt();
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			m_id = id.toInt();
Toshihiro Shimizu 890ddd
			m_subId = -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline bool operator==(const TaskId &f) const { return f.m_id == m_id && f.m_subId == m_subId; };
Toshihiro Shimizu 890ddd
	inline bool operator!=(const TaskId &f) const { return (m_id != f.m_id || m_subId != f.m_subId); };
Toshihiro Shimizu 890ddd
	inline bool operator<(const TaskId &f) const { return (m_id < f.m_id || (m_id == f.m_id && m_subId < f.m_subId)); };
Toshihiro Shimizu 890ddd
	inline bool operator>(const TaskId &f) const { return f < *this; }
Toshihiro Shimizu 890ddd
	inline bool operator>=(const TaskId &f) const { return !operator<(f); }
Toshihiro Shimizu 890ddd
	inline bool operator<=(const TaskId &f) const { return !operator>(f); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TaskId &operator=(const TaskId &f)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_id = f.m_id;
Toshihiro Shimizu 890ddd
		m_subId = f.m_subId;
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//operator string() const;
Toshihiro Shimizu 890ddd
	QString toString() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		QString id(QString::number(m_id));
Toshihiro Shimizu 890ddd
		if (m_subId >= 0)
Toshihiro Shimizu 890ddd
			id += "." + ::QString::number(m_subId);
Toshihiro Shimizu 890ddd
		return id;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FarmController : public TFarmExecutor, public TFarmController
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FarmController(const QString &hostName, const QString &addr, int port, TUserLog *log);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void loadServersData(const TFilePath &globalRoot);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// TFarmExecutor interface implementation
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString execute(const vector<qstring> &argv);</qstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// TFarmController interface methods implementation
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString addTask(
Toshihiro Shimizu 890ddd
		const QString &name, const QString &cmdline,
Toshihiro Shimizu 890ddd
		const QString &user, const QString &host,
Toshihiro Shimizu 890ddd
		bool suspended,
Toshihiro Shimizu 890ddd
		int priority,
Toshihiro Shimizu 890ddd
		TFarmPlatform platform);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString addTask(const TFarmTask &task, bool suspended);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void removeTask(const QString &id);
Toshihiro Shimizu 890ddd
	void suspendTask(const QString &id);
Toshihiro Shimizu 890ddd
	void activateTask(const QString &id);
Toshihiro Shimizu 890ddd
	void restartTask(const QString &id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void getTasks(vector<qstring> &tasks);</qstring>
Toshihiro Shimizu 890ddd
	void getTasks(const QString &parentId, vector<qstring> &tasks);</qstring>
Toshihiro Shimizu 890ddd
	void getTasks(const QString &parentId, vector<taskshortinfo> &tasks);</taskshortinfo>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void queryTaskInfo(const QString &id, TFarmTask &task);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void queryTaskShortInfo(
Toshihiro Shimizu 890ddd
		const QString &id,
Toshihiro Shimizu 890ddd
		QString &parentId,
Toshihiro Shimizu 890ddd
		QString &name,
Toshihiro Shimizu 890ddd
		TaskState &status);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// used (by a server) to notify a server start
Toshihiro Shimizu 890ddd
	void attachServer(const QString &name, const QString &addr, int port);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// used (by a server) to notify a server stop
Toshihiro Shimizu 890ddd
	void detachServer(const QString &name, const QString &addr, int port);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// used (by a server) to notify a task submission error
Toshihiro Shimizu 890ddd
	void taskSubmissionError(const QString &taskId, int errCode);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// used by a server to notify a task progress
Toshihiro Shimizu 890ddd
	void taskProgress(
Toshihiro Shimizu 890ddd
		const QString &taskId,
Toshihiro Shimizu 890ddd
		int step,
Toshihiro Shimizu 890ddd
		int stepCount,
Toshihiro Shimizu 890ddd
		int frameNumber,
Toshihiro Shimizu 890ddd
		FrameState state);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// used (by a server) to notify a task completion
Toshihiro Shimizu 890ddd
	void taskCompleted(const QString &taskId, int exitCode);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// fills the servers vector with the names of the servers
Toshihiro Shimizu 890ddd
	void getServers(vector<serveridentity> &servers);</serveridentity>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// returns the state of the server whose id has been specified
Toshihiro Shimizu 890ddd
	ServerState queryServerState2(const QString &id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// fills info with the infoes about the server whose id is specified
Toshihiro Shimizu 890ddd
	void queryServerInfo(const QString &id, ServerInfo &info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// activates the server whose id has been specified
Toshihiro Shimizu 890ddd
	void activateServer(const QString &id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// deactivates the server whose id has been specified
Toshihiro Shimizu 890ddd
	// once deactivated, a server is not available for task rendering
Toshihiro Shimizu 890ddd
	void deactivateServer(const QString &id, bool completeRunningTasks);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// FarmController specific methods
Toshihiro Shimizu 890ddd
	CtrlFarmTask *doAddTask(
Toshihiro Shimizu 890ddd
		const QString &id, const QString &parentId,
Toshihiro Shimizu 890ddd
		const QString &name, const QString &cmdline,
Toshihiro Shimizu 890ddd
		const QString &user, const QString &host,
Toshihiro Shimizu 890ddd
		bool suspended, int stepCount, int priority,
Toshihiro Shimizu 890ddd
		TFarmPlatform platform);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void startTask(CtrlFarmTask *task, FarmServerProxy *server);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CtrlFarmTask *getTaskToStart(FarmServerProxy *server = 0);
Toshihiro Shimizu 890ddd
	CtrlFarmTask *getNextTaskToStart(CtrlFarmTask *task, FarmServerProxy *server);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// looks for a ready server to which to assign the task
Toshihiro Shimizu 890ddd
	// returns true iff the task has been started
Toshihiro Shimizu 890ddd
	bool tryToStartTask(CtrlFarmTask *task);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ServerState getServerState(FarmServerProxy *server, QString &taskId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void initServer(FarmServerProxy *server);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void load(const TFilePath &fp);
Toshihiro Shimizu 890ddd
	void save(const TFilePath &fp) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doRestartTask(const QString &id, bool fromClient, FarmServerProxy *server);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void activateReadyServers();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// controller name, address and port
Toshihiro Shimizu 890ddd
	QString m_hostName;
Toshihiro Shimizu 890ddd
	QString m_addr;
Toshihiro Shimizu 890ddd
	int m_port;
Toshihiro Shimizu 890ddd
	TUserLog *m_userLog;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask=""> m_tasks;</taskid,>
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy=""> m_servers;</qstring,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThread::Mutex m_mutex;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static int NextTaskId;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FarmController::NextTaskId = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FarmController::FarmController(const QString &hostName, const QString &addr, int port, TUserLog *log)
Toshihiro Shimizu 890ddd
	: TFarmExecutor(port), m_hostName(hostName), m_addr(addr), m_port(port), m_userLog(log)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath rootDir = getGlobalRoot();
Toshihiro Shimizu 890ddd
	TFilePath lastUsedIdFilePath = rootDir + "config" + "id.txt";
Toshihiro Shimizu 890ddd
	Tifstream is(lastUsedIdFilePath);
Toshihiro Shimizu 890ddd
	if (is.good())
Toshihiro Shimizu 890ddd
		is >> NextTaskId;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::loadServersData(const TFilePath &globalRoot)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath fp = globalRoot + "config" + "servers.txt";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Tifstream is(fp);
Toshihiro Shimizu 890ddd
	while (!is.eof()) {
Toshihiro Shimizu 890ddd
		char line[80];
Toshihiro Shimizu 890ddd
		is.getline(line, 80);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (line[0] != '#' && QString(line) != "") {
Toshihiro Shimizu 890ddd
			istrstream iss(line);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			char hostName[512];
Toshihiro Shimizu 890ddd
			char ipAddr[80];
Toshihiro Shimizu 890ddd
			int port;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			iss >> hostName >> ipAddr >> port;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			FarmServerProxy *server = new FarmServerProxy(hostName, ipAddr, port);
Toshihiro Shimizu 890ddd
			m_servers.insert(make_pair(QString(ipAddr), server));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (server->testConnection(500)) {
Toshihiro Shimizu 890ddd
				initServer(server);
Toshihiro Shimizu 890ddd
				try {
Toshihiro Shimizu 890ddd
					server->attachController(m_hostName, m_addr, m_port);
Toshihiro Shimizu 890ddd
				} catch (TException &) {
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline QString toString(const TFarmTask &task, int ver)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString ss = task.m_name + ",";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ss += task.getCommandLine() + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number((int)(task.m_priority)) + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_user + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_hostName + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_id + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_parentId + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number((int)(task.m_status)) + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_server + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_submissionDate.toString() + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_startDate.toString() + ",";
Toshihiro Shimizu 890ddd
	ss += task.m_completionDate.toString() + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number(task.m_successfullSteps) + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number(task.m_failedSteps) + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number(task.m_stepCount);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (ver == 2) {
Toshihiro Shimizu 890ddd
		ss += ",";
Toshihiro Shimizu 890ddd
		ss += QString::number(task.m_platform) + ",";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int depCount = 0;
Toshihiro Shimizu 890ddd
		if (task.m_dependencies)
Toshihiro Shimizu 890ddd
			depCount = task.m_dependencies->getTaskCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ss += QString::number(depCount);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int i = 0; i < depCount; ++i) {
Toshihiro Shimizu 890ddd
			TFarmTask::Id id = task.m_dependencies->getTaskId(i);
Toshihiro Shimizu 890ddd
			ss += "," + id;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ss += '\0';
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return ss;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline QString toString(const ServerInfo &info)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QString ss = info.m_name + ",";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ss += info.m_ipAddress + ",";
Toshihiro Shimizu 890ddd
	ss += info.m_portNumber + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number((int)(info.m_state)) + ",";
Toshihiro Shimizu 890ddd
	ss += info.m_platform + ",";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ss += QString::number((int)info.m_cpuCount) + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number((int)info.m_totPhysMem) + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number((int)info.m_totVirtMem) + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number((int)info.m_availPhysMem) + ",";
Toshihiro Shimizu 890ddd
	ss += QString::number((int)info.m_availVirtMem) + ",";
Toshihiro Shimizu 890ddd
	ss += info.m_currentTaskId + '\0';
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return ss;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // anonymous namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString FarmController::execute(const vector<qstring> &argv)</qstring>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mutex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (argv.size() > 0) {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef TRACE
Toshihiro Shimizu 890ddd
		for (int i = 0; i < argv.size(); i++) {
Toshihiro Shimizu 890ddd
			m_userLog->info(argv[i]);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		m_userLog->info('\n');
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (argv[0] == "addTask@string@string" && argv.size() > 5) {
Toshihiro Shimizu 890ddd
			// ordine degli argomenti:
Toshihiro Shimizu 890ddd
			// name, cmdline, user, host, suspended, priority, platform
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			bool suspended;
Toshihiro Shimizu 890ddd
			fromStr((int &)suspended, argv[5]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int priority;
Toshihiro Shimizu 890ddd
			fromStr(priority, argv[6]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TFarmPlatform platform;
Toshihiro Shimizu 890ddd
			fromStr((int &)platform, argv[7]);
Toshihiro Shimizu 890ddd
			return addTask(argv[1], argv[2], argv[3], argv[4], suspended, priority, platform);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "addTask@TFarmTask" && argv.size() > 5) {
Toshihiro Shimizu 890ddd
			// ordine degli argomenti:
Toshihiro Shimizu 890ddd
			// name, cmdline, user, host, suspended, priority,
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			bool suspended;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			fromStr((int &)suspended, argv[5]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int priority;
Toshihiro Shimizu 890ddd
			fromStr(priority, argv[6]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TFarmTaskGroup task("", argv[1], argv[2], argv[3], argv[4], priority, 50);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			for (int i = 7; i < (int)argv.size(); i += 5) {
Toshihiro Shimizu 890ddd
				// ordine degli argomenti:
Toshihiro Shimizu 890ddd
				// name, cmdline, user, host, priority,
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				int subTaskPriority;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				fromStr(subTaskPriority, argv[i + 4]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				TFarmTask *subTask = new TFarmTask("",
Toshihiro Shimizu 890ddd
												   argv[i], argv[i + 1], argv[i + 2], argv[i + 3], subTaskPriority, 50);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				task.addTask(subTask);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return addTask(task, suspended);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "addTask@TFarmTask_2" && argv.size() > 7) {
Toshihiro Shimizu 890ddd
			// ordine degli argomenti:
Toshihiro Shimizu 890ddd
			// name, cmdline, user, host, suspended, stepCount, priority, platform
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int suspended;
Toshihiro Shimizu 890ddd
			fromStr(suspended, argv[5]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int stepCount;
Toshihiro Shimizu 890ddd
			fromStr(stepCount, argv[6]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int priority;
Toshihiro Shimizu 890ddd
			fromStr(priority, argv[7]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TFarmPlatform platform;
Toshihiro Shimizu 890ddd
			fromStr((int &)platform, argv[8]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TFarmTaskGroup task("", argv[1], argv[2], argv[3], argv[4], stepCount, priority);
Toshihiro Shimizu 890ddd
			task.m_platform = platform;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int depCount;
Toshihiro Shimizu 890ddd
			fromStr(depCount, argv[9]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int i = 0;
Toshihiro Shimizu 890ddd
			for (; i < depCount; ++i) {
Toshihiro Shimizu 890ddd
				QString depTaskId = argv[10 + i];
Toshihiro Shimizu 890ddd
				task.m_dependencies->add(depTaskId);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			for (i = 10 + depCount; i < (int)argv.size(); i += 6) {
Toshihiro Shimizu 890ddd
				// ordine degli argomenti:
Toshihiro Shimizu 890ddd
				// name, cmdline, user, host, stepCount, priority,
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				int subTaskStepCount;
Toshihiro Shimizu 890ddd
				fromStr(subTaskStepCount, argv[i + 4]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				int subTaskPriority;
Toshihiro Shimizu 890ddd
				fromStr(subTaskPriority, argv[i + 5]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				TFarmTask *subTask = new TFarmTask(
Toshihiro Shimizu 890ddd
					"", argv[i], argv[i + 1], argv[i + 2], argv[i + 3], subTaskStepCount, subTaskPriority);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				subTask->m_dependencies = new TFarmTask::Dependencies(*task.m_dependencies);
Toshihiro Shimizu 890ddd
				subTask->m_platform = platform;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				task.addTask(subTask);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return addTask(task, suspended != 0);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "removeTask" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			removeTask(argv[1]);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "suspendTask" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			suspendTask(argv[1]);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "activateTask" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			activateTask(argv[1]);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "restartTask" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			restartTask(argv[1]);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "getTasks@vector") {
Toshihiro Shimizu 890ddd
			vector<qstring> tasks;</qstring>
Toshihiro Shimizu 890ddd
			getTasks(tasks);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QString reply;
Toshihiro Shimizu 890ddd
			std::vector<qstring>::iterator it = tasks.begin();</qstring>
Toshihiro Shimizu 890ddd
			for (; it != tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
				reply += *it;
Toshihiro Shimizu 890ddd
				reply += ",";
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return reply;
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "getTasks@string@vector") {
Toshihiro Shimizu 890ddd
			QString parentId;
Toshihiro Shimizu 890ddd
			if (argv.size() > 1)
Toshihiro Shimizu 890ddd
				parentId = argv[1];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			vector<qstring> tasks;</qstring>
Toshihiro Shimizu 890ddd
			getTasks(parentId, tasks);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QString reply;
Toshihiro Shimizu 890ddd
			std::vector<qstring>::iterator it = tasks.begin();</qstring>
Toshihiro Shimizu 890ddd
			for (; it != tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
				reply += *it;
Toshihiro Shimizu 890ddd
				reply += ",";
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (reply.length() > 0)
Toshihiro Shimizu 890ddd
				reply = reply.left(reply.length() - 1);
Toshihiro Shimizu 890ddd
			return reply;
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "getTasks@string@vector$TaskShortInfo" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			vector<taskshortinfo> tasks;</taskshortinfo>
Toshihiro Shimizu 890ddd
			getTasks(argv[1], tasks);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QString reply;
Toshihiro Shimizu 890ddd
			std::vector<taskshortinfo>::iterator it = tasks.begin();</taskshortinfo>
Toshihiro Shimizu 890ddd
			for (; it != tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
				reply += (*it).m_id;
Toshihiro Shimizu 890ddd
				reply += ",";
Toshihiro Shimizu 890ddd
				reply += (*it).m_name;
Toshihiro Shimizu 890ddd
				reply += ",";
Toshihiro Shimizu 890ddd
				reply += QString::number((*it).m_status);
Toshihiro Shimizu 890ddd
				reply += ",";
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			if (reply.length() > 0)
Toshihiro Shimizu 890ddd
				reply = reply.left(reply.size() - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return reply;
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "queryTaskInfo" && argv.size() > 1) {
Toshihiro Shimizu 890ddd
			TFarmTask task;
Toshihiro Shimizu 890ddd
			queryTaskInfo(argv[1], task);
Toshihiro Shimizu 890ddd
			return toString(task, 1);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "queryTaskInfo_2" && argv.size() > 1) {
Toshihiro Shimizu 890ddd
			TFarmTask task;
Toshihiro Shimizu 890ddd
			queryTaskInfo(argv[1], task);
Toshihiro Shimizu 890ddd
			return toString(task, 2);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "queryTaskShortInfo" && argv.size() > 1) {
Toshihiro Shimizu 890ddd
			QString parentId, name;
Toshihiro Shimizu 890ddd
			TaskState status;
Toshihiro Shimizu 890ddd
			queryTaskShortInfo(argv[1], parentId, name, status);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QString reply;
Toshihiro Shimizu 890ddd
			reply += parentId;
Toshihiro Shimizu 890ddd
			reply += ",";
Toshihiro Shimizu 890ddd
			reply += name;
Toshihiro Shimizu 890ddd
			reply += ",";
Toshihiro Shimizu 890ddd
			reply += QString::number((int)(status));
Toshihiro Shimizu 890ddd
			return reply;
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "taskSubmissionError" && argv.size() > 2) {
Toshihiro Shimizu 890ddd
			QString taskId = argv[1];
Toshihiro Shimizu 890ddd
			int errCode;
Toshihiro Shimizu 890ddd
			fromStr(errCode, argv[2]);
Toshihiro Shimizu 890ddd
			taskSubmissionError(taskId, errCode);
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "taskProgress" && argv.size() > 5) {
Toshihiro Shimizu 890ddd
			int step, stepCount, frameNumber;
Toshihiro Shimizu 890ddd
			step = argv[2].toInt();
Toshihiro Shimizu 890ddd
			stepCount = argv[3].toInt();
Toshihiro Shimizu 890ddd
			frameNumber = argv[4].toInt();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			FrameState state;
Toshihiro Shimizu 890ddd
			state = (FrameState)argv[5].toInt();
Toshihiro Shimizu 890ddd
			taskProgress(argv[1], step, stepCount, frameNumber, state);
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "taskCompleted" && argv.size() > 2) {
Toshihiro Shimizu 890ddd
			QString taskId = argv[1];
Toshihiro Shimizu 890ddd
			int exitCode;
Toshihiro Shimizu 890ddd
			exitCode = argv[2].toInt();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			taskCompleted(taskId, exitCode);
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "getServers") {
Toshihiro Shimizu 890ddd
			vector<serveridentity> servers;</serveridentity>
Toshihiro Shimizu 890ddd
			getServers(servers);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QString reply;
Toshihiro Shimizu 890ddd
			std::vector<serveridentity>::iterator it = servers.begin();</serveridentity>
Toshihiro Shimizu 890ddd
			for (; it != servers.end(); ++it) {
Toshihiro Shimizu 890ddd
				reply += (*it).m_id;
Toshihiro Shimizu 890ddd
				reply += ",";
Toshihiro Shimizu 890ddd
				reply += (*it).m_name;
Toshihiro Shimizu 890ddd
				reply += ",";
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (reply.length() > 0)
Toshihiro Shimizu 890ddd
				reply = reply.left(reply.size() - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return reply;
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "queryServerState2" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			ServerState state = queryServerState2(argv[1]);
Toshihiro Shimizu 890ddd
			return QString::number(state);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "queryServerInfo" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			ServerInfo info;
Toshihiro Shimizu 890ddd
			queryServerInfo(argv[1], info);
Toshihiro Shimizu 890ddd
			return toString(info);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "activateServer" && argv.size() > 0) {
Toshihiro Shimizu 890ddd
			activateServer(argv[1]);
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "deactivateServer" && argv.size() > 1) {
Toshihiro Shimizu 890ddd
			int completeRunningTask = true;
Toshihiro Shimizu 890ddd
			fromStr(completeRunningTask, argv[2]);
Toshihiro Shimizu 890ddd
			deactivateServer(argv[1], !!completeRunningTask);
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "attachServer" && argv.size() > 3) {
Toshihiro Shimizu 890ddd
			int port;
Toshihiro Shimizu 890ddd
			fromStr(port, argv[3]);
Toshihiro Shimizu 890ddd
			attachServer(argv[1], argv[2], port);
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "detachServer" && argv.size() > 3) {
Toshihiro Shimizu 890ddd
			int port;
Toshihiro Shimizu 890ddd
			fromStr(port, argv[3]);
Toshihiro Shimizu 890ddd
			detachServer(argv[1], argv[2], port);
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#ifdef TRACE
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_userLog->info("empty command\n");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return "";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
CtrlFarmTask *FarmController::doAddTask(
Toshihiro Shimizu 890ddd
	const QString &id, const QString &parentId,
Toshihiro Shimizu 890ddd
	const QString &name, const QString &cmdline,
Toshihiro Shimizu 890ddd
	const QString &user, const QString &host,
Toshihiro Shimizu 890ddd
	bool suspended, int stepCount,
Toshihiro Shimizu 890ddd
	int priority, TFarmPlatform platform)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	CtrlFarmTask *task = new CtrlFarmTask(id, name, cmdline, user, host, stepCount, priority);
Toshihiro Shimizu 890ddd
	task->m_submissionDate = QDateTime::currentDateTime();
Toshihiro Shimizu 890ddd
	task->m_parentId = parentId;
Toshihiro Shimizu 890ddd
	task->m_platform = platform;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_tasks.insert(std::make_pair(TaskId(id), task));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_userLog->info("Task " + task->m_id + " received at " + task->m_submissionDate.toString() + "\n");
Toshihiro Shimizu 890ddd
	m_userLog->info("\"" + task->getCommandLine() + "\"\n");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (suspended)
Toshihiro Shimizu 890ddd
		task->m_status = Suspended;
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  else
Toshihiro Shimizu 890ddd
    tryToStartTask(task);
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
	return task;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::startTask(CtrlFarmTask *task, FarmServerProxy *server)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mutex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CtrlFarmTask *taskToBeSubmittedParent = 0;
Toshihiro Shimizu 890ddd
	CtrlFarmTask *taskToBeSubmitted = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (task->m_subTasks.empty()) {
Toshihiro Shimizu 890ddd
		taskToBeSubmitted = task;
Toshihiro Shimizu 890ddd
		if (task->m_parentId != "") {
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator itTaskParent =</taskid,>
Toshihiro Shimizu 890ddd
				m_tasks.find(TaskId(task->m_parentId));
Toshihiro Shimizu 890ddd
			if (itTaskParent != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				taskToBeSubmittedParent = itTaskParent->second;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		taskToBeSubmittedParent = task;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// cerca il primo subtask WAITING
Toshihiro Shimizu 890ddd
		std::vector<qstring>::iterator itSubTaskId = task->m_subTasks.begin();</qstring>
Toshihiro Shimizu 890ddd
		for (; itSubTaskId != task->m_subTasks.end(); ++itSubTaskId) {
Toshihiro Shimizu 890ddd
			QString subTaskId = *itSubTaskId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator itSubTask =</taskid,>
Toshihiro Shimizu 890ddd
				m_tasks.find(TaskId(subTaskId));
Toshihiro Shimizu 890ddd
			if (itSubTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				CtrlFarmTask *subTask = itSubTask->second;
Toshihiro Shimizu 890ddd
				if (subTask->m_status == Waiting) {
Toshihiro Shimizu 890ddd
					taskToBeSubmitted = subTask;
Toshihiro Shimizu 890ddd
					break;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int rc = 0;
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		server->addTask(taskToBeSubmitted);
Toshihiro Shimizu 890ddd
	} catch (TException &e) {
Toshihiro Shimizu 890ddd
		throw e;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (rc == 0) {
Toshihiro Shimizu 890ddd
		QDateTime startDate = QDateTime::currentDateTime();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (taskToBeSubmittedParent && taskToBeSubmittedParent->m_status != Running) {
Toshihiro Shimizu 890ddd
			taskToBeSubmittedParent->m_status = Running;
Toshihiro Shimizu 890ddd
			taskToBeSubmittedParent->m_startDate = startDate;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		taskToBeSubmitted->m_status = Running;
Toshihiro Shimizu 890ddd
		taskToBeSubmitted->m_startDate = startDate;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		taskToBeSubmitted->m_serverId = server->getId();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QString msg = "Task " + taskToBeSubmitted->m_id + " assigned to ";
Toshihiro Shimizu 890ddd
		msg += server->getHostName();
Toshihiro Shimizu 890ddd
		msg += "\n\n";
Toshihiro Shimizu 890ddd
		m_userLog->info(msg);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
CtrlFarmTask *FarmController::getTaskToStart(FarmServerProxy *server)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mutex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int maxPriority = 0;
Toshihiro Shimizu 890ddd
	CtrlFarmTask *candidate = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator itTask = m_tasks.begin();</taskid,>
Toshihiro Shimizu 890ddd
	for (; itTask != m_tasks.end(); ++itTask) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = itTask->second;
Toshihiro Shimizu 890ddd
		if ((!server || (task->m_platform == NoPlatform || task->m_platform == server->m_platform)) &&
Toshihiro Shimizu 890ddd
			((task->m_status == Waiting && task->m_priority > maxPriority) ||
Toshihiro Shimizu 890ddd
			 (task->m_status == Aborted && task->m_failureCount < 3) && task->m_parentId != "")) {
Toshihiro Shimizu 890ddd
			bool dependenciesCompleted = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (task->m_dependencies) {
Toshihiro Shimizu 890ddd
				int count = task->m_dependencies->getTaskCount();
Toshihiro Shimizu 890ddd
				for (int i = 0; i < count; ++i) {
Toshihiro Shimizu 890ddd
					TFarmTask::Id id = task->m_dependencies->getTaskId(i);
Toshihiro Shimizu 890ddd
					map<taskid, *="" ctrlfarmtask="">::iterator itDepTask = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
					if (itDepTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
						CtrlFarmTask *depTask = itDepTask->second;
Toshihiro Shimizu 890ddd
						if (depTask->m_status != Completed) {
Toshihiro Shimizu 890ddd
							dependenciesCompleted = false;
Toshihiro Shimizu 890ddd
							break;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (dependenciesCompleted) {
Toshihiro Shimizu 890ddd
				maxPriority = task->m_priority;
Toshihiro Shimizu 890ddd
				candidate = task;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return candidate;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// determina il prossimo task da avviare tra quelli Waiting, escludendo except
Toshihiro Shimizu 890ddd
// dalla ricerca
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
CtrlFarmTask *FarmController::getNextTaskToStart(CtrlFarmTask *except, FarmServerProxy *server)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mutex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int maxPriority = 0;
Toshihiro Shimizu 890ddd
	CtrlFarmTask *candidate = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator itTask = m_tasks.begin();</taskid,>
Toshihiro Shimizu 890ddd
	for (; itTask != m_tasks.end(); ++itTask) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = itTask->second;
Toshihiro Shimizu 890ddd
		if (except == task)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		if ((task->m_platform == NoPlatform || task->m_platform == server->m_platform) &&
Toshihiro Shimizu 890ddd
			task->m_status == Waiting && task->m_priority > maxPriority) {
Toshihiro Shimizu 890ddd
			bool dependenciesCompleted = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (task->m_dependencies) {
Toshihiro Shimizu 890ddd
				int count = task->m_dependencies->getTaskCount();
Toshihiro Shimizu 890ddd
				for (int i = 0; i < count; ++i) {
Toshihiro Shimizu 890ddd
					TFarmTask::Id id = task->m_dependencies->getTaskId(i);
Toshihiro Shimizu 890ddd
					map<taskid, *="" ctrlfarmtask="">::iterator itDepTask = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
					if (itDepTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
						CtrlFarmTask *depTask = itDepTask->second;
Toshihiro Shimizu 890ddd
						if (depTask->m_status != Completed) {
Toshihiro Shimizu 890ddd
							dependenciesCompleted = false;
Toshihiro Shimizu 890ddd
							break;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (dependenciesCompleted) {
Toshihiro Shimizu 890ddd
				maxPriority = task->m_priority;
Toshihiro Shimizu 890ddd
				candidate = task;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return candidate;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FarmController::tryToStartTask(CtrlFarmTask *task)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mutex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool dependenciesCompleted = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (task->m_dependencies) {
Toshihiro Shimizu 890ddd
		int count = task->m_dependencies->getTaskCount();
Toshihiro Shimizu 890ddd
		for (int i = 0; i < count; ++i) {
Toshihiro Shimizu 890ddd
			TFarmTask::Id id = task->m_dependencies->getTaskId(i);
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator itDepTask = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
			if (itDepTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				CtrlFarmTask *depTask = itDepTask->second;
Toshihiro Shimizu 890ddd
				if (depTask->m_status != Completed) {
Toshihiro Shimizu 890ddd
					dependenciesCompleted = false;
Toshihiro Shimizu 890ddd
					break;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!dependenciesCompleted)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (task->m_subTasks.empty()) {
Toshihiro Shimizu 890ddd
		vector<farmserverproxy *=""> m_partiallyBusyServers;</farmserverproxy>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		map<qstring, *="" farmserverproxy="">::iterator it = m_servers.begin();</qstring,>
Toshihiro Shimizu 890ddd
		for (; it != m_servers.end(); ++it) {
Toshihiro Shimizu 890ddd
			FarmServerProxy *server = it->second;
Toshihiro Shimizu 890ddd
			if (server->m_attached && !server->m_offline &&
Toshihiro Shimizu 890ddd
				(int)server->getTasks().size() < server->m_maxTaskCount) {
Toshihiro Shimizu 890ddd
				if (!(task->m_platform == NoPlatform || task->m_platform == server->m_platform))
Toshihiro Shimizu 890ddd
					continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				vector<qstring>::iterator its =</qstring>
Toshihiro Shimizu 890ddd
					find(task->m_failedOnServers.begin(), task->m_failedOnServers.end(), server->getId());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				if (its != task->m_failedOnServers.end())
Toshihiro Shimizu 890ddd
					continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				if (server->testConnection(500)) {
Toshihiro Shimizu 890ddd
					if (server->getTasks().size() == 0) {
Toshihiro Shimizu 890ddd
						try {
Toshihiro Shimizu 890ddd
							startTask(task, server);
Toshihiro Shimizu 890ddd
						} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
							continue;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
						return true;
Toshihiro Shimizu 890ddd
					} else
Toshihiro Shimizu 890ddd
						m_partiallyBusyServers.push_back(server);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vector<farmserverproxy *="">::iterator it2 = m_partiallyBusyServers.begin();</farmserverproxy>
Toshihiro Shimizu 890ddd
		for (; it2 != m_partiallyBusyServers.end(); ++it2) {
Toshihiro Shimizu 890ddd
			FarmServerProxy *server = *it2;
Toshihiro Shimizu 890ddd
			if (server->testConnection(500)) {
Toshihiro Shimizu 890ddd
				try {
Toshihiro Shimizu 890ddd
					startTask(task, server);
Toshihiro Shimizu 890ddd
				} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
					continue;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		// un task composto e' considerato started sse e' started almeno uno
Toshihiro Shimizu 890ddd
		// dei task che lo compongono
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool started = false;
Toshihiro Shimizu 890ddd
		vector<qstring>::iterator itSubTaskId = task->m_subTasks.begin();</qstring>
Toshihiro Shimizu 890ddd
		for (; itSubTaskId != task->m_subTasks.end(); ++itSubTaskId) {
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator itSubTask = m_tasks.find(TaskId(*itSubTaskId));</taskid,>
Toshihiro Shimizu 890ddd
			if (itSubTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				CtrlFarmTask *subTask = itSubTask->second;
Toshihiro Shimizu 890ddd
				if (tryToStartTask(subTask))
Toshihiro Shimizu 890ddd
					started = true;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return started;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ServerState FarmController::getServerState(FarmServerProxy *server, QString &taskId)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ServerState state;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool connected = server->testConnection(500);
Toshihiro Shimizu 890ddd
	if (!connected) {
Toshihiro Shimizu 890ddd
		taskId = "";
Toshihiro Shimizu 890ddd
		state = Down;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		if (server->m_offline)
Toshihiro Shimizu 890ddd
			return Offline;
Toshihiro Shimizu 890ddd
		else if (server->getTasks().size() > 0) {
Toshihiro Shimizu 890ddd
			taskId = server->getTasks()[0];
Toshihiro Shimizu 890ddd
			state = Busy;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			taskId = "";
Toshihiro Shimizu 890ddd
			state = Ready;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return state;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ServerInitializer : public TThread::Runnable
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	ServerInitializer(FarmServerProxy *server) : m_server(server) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void run()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TFarmServer::HwInfo hwInfo;
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			m_server->queryHwInfo(hwInfo);
Toshihiro Shimizu 890ddd
		} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_server->m_attached = true;
Toshihiro Shimizu 890ddd
		//m_server->m_maxTaskCount = hwInfo.m_cpuCount;
Toshihiro Shimizu 890ddd
		m_server->m_maxTaskCount = 1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FarmServerProxy *m_server;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::initServer(FarmServerProxy *server)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFarmServer::HwInfo hwInfo;
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		server->queryHwInfo(hwInfo);
Toshihiro Shimizu 890ddd
	} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
		TThread::Executor exec;
Toshihiro Shimizu 890ddd
		exec.addTask(new ServerInitializer(server));
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	server->m_attached = true;
Toshihiro Shimizu 890ddd
	//server->m_maxTaskCount = hwInfo.m_cpuCount;
Toshihiro Shimizu 890ddd
	server->m_maxTaskCount = 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	server->m_platform = hwInfo.m_type;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString FarmController::addTask(
Toshihiro Shimizu 890ddd
	const QString &name, const QString &cmdline,
Toshihiro Shimizu 890ddd
	const QString &user, const QString &host,
Toshihiro Shimizu 890ddd
	bool suspended, int priority, TFarmPlatform platform)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QString parentId = "";
Toshihiro Shimizu 890ddd
	CtrlFarmTask *task = doAddTask(
Toshihiro Shimizu 890ddd
		QString::number(NextTaskId++), parentId,
Toshihiro Shimizu 890ddd
		name, cmdline, user, host, suspended,
Toshihiro Shimizu 890ddd
		1, priority, platform);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return task->m_id;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TaskStarter : public TThread::Runnable
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TaskStarter(
Toshihiro Shimizu 890ddd
		FarmController *controller,
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task,
Toshihiro Shimizu 890ddd
		FarmServerProxy *server = 0)
Toshihiro Shimizu 890ddd
		: m_controller(controller), m_task(task), m_server(server) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void run();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FarmController *m_controller;
Toshihiro Shimizu 890ddd
	CtrlFarmTask *m_task;
Toshihiro Shimizu 890ddd
	FarmServerProxy *m_server;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TaskStarter::run()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_task->m_status != Suspended) {
Toshihiro Shimizu 890ddd
		if (m_server)
Toshihiro Shimizu 890ddd
			m_controller->startTask(m_task, m_server);
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			m_controller->tryToStartTask(m_task);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString FarmController::addTask(const TFarmTask &task, bool suspended)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QString id = QString::number(NextTaskId++);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CtrlFarmTask *myTask = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int count = task.getTaskCount();
Toshihiro Shimizu 890ddd
	if (count == 1) {
Toshihiro Shimizu 890ddd
		QString parentId = "";
Toshihiro Shimizu 890ddd
		myTask = doAddTask(
Toshihiro Shimizu 890ddd
			id, parentId,
Toshihiro Shimizu 890ddd
			task.m_name, task.getCommandLine(),
Toshihiro Shimizu 890ddd
			task.m_user, task.m_hostName,
Toshihiro Shimizu 890ddd
			suspended, task.m_stepCount,
Toshihiro Shimizu 890ddd
			task.m_priority, task.m_platform);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		myTask = new CtrlFarmTask(
Toshihiro Shimizu 890ddd
			id, task.m_name, task.getCommandLine(),
Toshihiro Shimizu 890ddd
			task.m_user, task.m_hostName, task.m_stepCount, task.m_priority);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		myTask->m_submissionDate = QDateTime::currentDateTime();
Toshihiro Shimizu 890ddd
		myTask->m_parentId = "";
Toshihiro Shimizu 890ddd
		myTask->m_dependencies = new TFarmTask::Dependencies(*task.m_dependencies);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (suspended)
Toshihiro Shimizu 890ddd
			myTask->m_status = Suspended;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_tasks.insert(std::make_pair(TaskId(id), myTask));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int i = 0; i < count; ++i) {
Toshihiro Shimizu 890ddd
			QString subTaskId = id + "." + QString::number(i);
Toshihiro Shimizu 890ddd
			TFarmTask &tt = const_cast<tfarmtask &="">(task);</tfarmtask>
Toshihiro Shimizu 890ddd
			TFarmTask *subtask = tt.getTask(i);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			CtrlFarmTask *mySubTask = doAddTask(
Toshihiro Shimizu 890ddd
				subTaskId, myTask->m_id,
Toshihiro Shimizu 890ddd
				subtask->m_name, subtask->getCommandLine(),
Toshihiro Shimizu 890ddd
				subtask->m_user, subtask->m_hostName,
Toshihiro Shimizu 890ddd
				suspended, subtask->m_stepCount,
Toshihiro Shimizu 890ddd
				subtask->m_priority, task.m_platform);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			mySubTask->m_dependencies = new TFarmTask::Dependencies(*task.m_dependencies);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			myTask->m_subTasks.push_back(subTaskId);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThread::Executor executor;
Toshihiro Shimizu 890ddd
	executor.addTask(new TaskStarter(this, myTask));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return id;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::removeTask(const QString &id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
	if (it != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool aSubtaskIsRunning = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vector<qstring>::iterator it2 = task->m_subTasks.begin();</qstring>
Toshihiro Shimizu 890ddd
		for (; it2 != task->m_subTasks.end();) {
Toshihiro Shimizu 890ddd
			QString subTaskId = *it2;
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator it3 = m_tasks.find(TaskId(subTaskId));</taskid,>
Toshihiro Shimizu 890ddd
			if (it3 != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				CtrlFarmTask *subTask = it3->second;
Toshihiro Shimizu 890ddd
				if (subTask->m_status != Running) {
Toshihiro Shimizu 890ddd
					it2 = task->m_subTasks.erase(it2);
Toshihiro Shimizu 890ddd
					m_tasks.erase(it3);
Toshihiro Shimizu 890ddd
					delete it3->second;
Toshihiro Shimizu 890ddd
				} else {
Toshihiro Shimizu 890ddd
					it2 = task->m_subTasks.erase(it2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					map<qstring, *="" farmserverproxy="">::iterator itServer =</qstring,>
Toshihiro Shimizu 890ddd
						m_servers.find(subTask->m_serverId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					if (itServer != m_servers.end()) {
Toshihiro Shimizu 890ddd
						FarmServerProxy *server = itServer->second;
Toshihiro Shimizu 890ddd
						if (server) {
Toshihiro Shimizu 890ddd
							vector<qstring>::const_iterator it3 = find(</qstring>
Toshihiro Shimizu 890ddd
								server->getTasks().begin(), server->getTasks().end(), subTask->m_id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
							if (it3 != server->getTasks().end()) {
Toshihiro Shimizu 890ddd
								aSubtaskIsRunning = true;
Toshihiro Shimizu 890ddd
								server->terminateTask(subTask->m_id);
Toshihiro Shimizu 890ddd
							}
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					subTask->m_toBeDeleted = true;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			} else
Toshihiro Shimizu 890ddd
				++it2;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_status != Running || !aSubtaskIsRunning) {
Toshihiro Shimizu 890ddd
			m_tasks.erase(it);
Toshihiro Shimizu 890ddd
			delete it->second;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			task->m_toBeDeleted = true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::suspendTask(const QString &id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
	if (it != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vector<qstring>::iterator it2 = task->m_subTasks.begin();</qstring>
Toshihiro Shimizu 890ddd
		for (; it2 != task->m_subTasks.end(); ++it2) {
Toshihiro Shimizu 890ddd
			QString subTaskId = *it2;
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator it3 = m_tasks.find(TaskId(subTaskId));</taskid,>
Toshihiro Shimizu 890ddd
			if (it3 != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				CtrlFarmTask *subTask = it3->second;
Toshihiro Shimizu 890ddd
				if (subTask->m_status == Running) {
Toshihiro Shimizu 890ddd
					map<qstring, *="" farmserverproxy="">::iterator itServer =</qstring,>
Toshihiro Shimizu 890ddd
						m_servers.find(subTask->m_serverId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					if (itServer != m_servers.end()) {
Toshihiro Shimizu 890ddd
						FarmServerProxy *server = itServer->second;
Toshihiro Shimizu 890ddd
						if (server) {
Toshihiro Shimizu 890ddd
							vector<qstring>::const_iterator it3 = find(</qstring>
Toshihiro Shimizu 890ddd
								server->getTasks().begin(), server->getTasks().end(), subTask->m_id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
							if (it3 != server->getTasks().end())
Toshihiro Shimizu 890ddd
								server->terminateTask(subTask->m_id);
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
				subTask->m_status = Suspended;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		task->m_status = Suspended;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::activateTask(const QString &id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::restartTask(const QString &id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// la scelta del server e' lasciata al controller
Toshihiro Shimizu 890ddd
	FarmServerProxy *server = 0;
Toshihiro Shimizu 890ddd
	doRestartTask(id, true, server);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::doRestartTask(const QString &id, bool fromClient, FarmServerProxy *server)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
	if (it != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
		if (task->m_status != Running) {
Toshihiro Shimizu 890ddd
			if (fromClient) {
Toshihiro Shimizu 890ddd
				task->m_failedOnServers.clear();
Toshihiro Shimizu 890ddd
				task->m_status = Waiting;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			task->m_completionDate = QDateTime();
Toshihiro Shimizu 890ddd
			task->m_server = "";
Toshihiro Shimizu 890ddd
			task->m_serverId = "";
Toshihiro Shimizu 890ddd
			task->m_failedSteps = task->m_successfullSteps = 0;
Toshihiro Shimizu 890ddd
			task->m_failureCount = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (!task->m_subTasks.empty()) {
Toshihiro Shimizu 890ddd
				vector<qstring>::iterator itSubTaskId = task->m_subTasks.begin();</qstring>
Toshihiro Shimizu 890ddd
				for (; itSubTaskId != task->m_subTasks.end(); ++itSubTaskId) {
Toshihiro Shimizu 890ddd
					map<taskid, *="" ctrlfarmtask="">::iterator itSubTask =</taskid,>
Toshihiro Shimizu 890ddd
						m_tasks.find(TaskId(*itSubTaskId));
Toshihiro Shimizu 890ddd
					if (itSubTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
						CtrlFarmTask *subtask = itSubTask->second;
Toshihiro Shimizu 890ddd
						if (fromClient) {
Toshihiro Shimizu 890ddd
							subtask->m_failedOnServers.clear();
Toshihiro Shimizu 890ddd
							subtask->m_status = Waiting;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
						subtask->m_completionDate = QDateTime();
Toshihiro Shimizu 890ddd
						subtask->m_server = "";
Toshihiro Shimizu 890ddd
						subtask->m_serverId = "";
Toshihiro Shimizu 890ddd
						subtask->m_failedSteps = subtask->m_successfullSteps = 0;
Toshihiro Shimizu 890ddd
						subtask->m_failureCount = 0;
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TThread::Executor executor;
Toshihiro Shimizu 890ddd
			executor.addTask(new TaskStarter(this, task, server));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::getTasks(vector<qstring> &tasks)</qstring>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.begin();</taskid,>
Toshihiro Shimizu 890ddd
	for (; it != m_tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
		tasks.push_back(task->m_id);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::getTasks(const QString &parentId, vector<qstring> &tasks)</qstring>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.begin();</taskid,>
Toshihiro Shimizu 890ddd
	for (; it != m_tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
		if (task->m_parentId == parentId)
Toshihiro Shimizu 890ddd
			tasks.push_back(task->m_id);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::getTasks(const QString &parentId, vector<taskshortinfo> &tasks)</taskshortinfo>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tasks.clear();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.begin();</taskid,>
Toshihiro Shimizu 890ddd
	for (; it != m_tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
		if (task->m_parentId == parentId)
Toshihiro Shimizu 890ddd
			tasks.push_back(TaskShortInfo(task->m_id, task->m_name, task->m_status));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  map<taskid, ctrlfarmtask*="">::iterator it = m_tasks.find(parentId);</taskid,>
Toshihiro Shimizu 890ddd
  if (it != m_tasks.end())
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
    vector<string>::iterator itSubTakId = task->m_subTasks.begin();</string>
Toshihiro Shimizu 890ddd
    for ( ; itSubTakId != task->m_subTasks.end(); ++itSubTakId)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      map<string, ctrlfarmtask*="">::iterator itSubTask = m_tasks.find(*itSubTakId);</string,>
Toshihiro Shimizu 890ddd
      if (itSubTask != m_tasks.end())
Toshihiro Shimizu 890ddd
      {
Toshihiro Shimizu 890ddd
        CtrlFarmTask *subTask = itSubTask->second;
Toshihiro Shimizu 890ddd
        tasks.push_back(TaskShortInfo(*itSubTakId, subTask->m_name, subTask->m_status));
Toshihiro Shimizu 890ddd
      }
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::queryTaskInfo(const QString &id, TFarmTask &task)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
	if (it != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *tt = it->second;
Toshihiro Shimizu 890ddd
		task = *tt;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		map<qstring, *="" farmserverproxy="">::iterator it2 = m_servers.find(it->second->m_serverId);</qstring,>
Toshihiro Shimizu 890ddd
		if (it2 != m_servers.end()) {
Toshihiro Shimizu 890ddd
			FarmServerProxy *server = it2->second;
Toshihiro Shimizu 890ddd
			task.m_server = server->getHostName();
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			task.m_server = "";
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		task.m_status = TaskUnknown;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::queryTaskShortInfo(
Toshihiro Shimizu 890ddd
	const QString &id, QString &parentId,
Toshihiro Shimizu 890ddd
	QString &name, TaskState &status)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator it = m_tasks.find(TaskId(id));</taskid,>
Toshihiro Shimizu 890ddd
	if (it != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
		parentId = task->m_parentId;
Toshihiro Shimizu 890ddd
		name = task->m_name;
Toshihiro Shimizu 890ddd
		status = task->m_status;
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		status = TaskUnknown;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::attachServer(const QString &name, const QString &addr, int port)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FarmServerProxy *server = 0;
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.begin();</qstring,>
Toshihiro Shimizu 890ddd
	for (; it != m_servers.end(); ++it) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *s = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (STRICMP(s->getHostName(), name) == 0 ||
Toshihiro Shimizu 890ddd
			STRICMP(s->getIpAddress(), addr) == 0) {
Toshihiro Shimizu 890ddd
			server = s;
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!server) {
Toshihiro Shimizu 890ddd
		server = new FarmServerProxy(name, addr, port);
Toshihiro Shimizu 890ddd
		m_servers.insert(make_pair(QString(addr), server));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	initServer(server);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::detachServer(const QString &name, const QString &addr, int port)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.begin();</qstring,>
Toshihiro Shimizu 890ddd
	for (; it != m_servers.end(); ++it) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *s = it->second;
Toshihiro Shimizu 890ddd
		if (STRICMP(s->getHostName(), name) == 0 ||
Toshihiro Shimizu 890ddd
			STRICMP(s->getIpAddress(), addr) == 0) {
Toshihiro Shimizu 890ddd
			s->m_attached = false;
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::taskSubmissionError(const QString &taskId, int errCode)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FarmServerProxy *server = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator itTask = m_tasks.find(TaskId(taskId));</taskid,>
Toshihiro Shimizu 890ddd
	if (itTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = itTask->second;
Toshihiro Shimizu 890ddd
		task->m_status = Aborted;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		task->m_completionDate = QDateTime::currentDateTime();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_toBeDeleted)
Toshihiro Shimizu 890ddd
			m_tasks.erase(itTask);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CtrlFarmTask *parentTask = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_parentId != "") {
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator itParent = m_tasks.find(TaskId(task->m_parentId));</taskid,>
Toshihiro Shimizu 890ddd
			if (itParent != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				parentTask = itParent->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				TaskState parentTaskState = Aborted;
Toshihiro Shimizu 890ddd
				std::vector<qstring>::iterator itSubTaskId = parentTask->m_subTasks.begin();</qstring>
Toshihiro Shimizu 890ddd
				for (; itSubTaskId != parentTask->m_subTasks.end(); ++itSubTaskId) {
Toshihiro Shimizu 890ddd
					QString subTaskId = *itSubTaskId;
Toshihiro Shimizu 890ddd
					map<taskid, *="" ctrlfarmtask="">::iterator itSubTask = m_tasks.find(TaskId(subTaskId));</taskid,>
Toshihiro Shimizu 890ddd
					if (itSubTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
						CtrlFarmTask *subTask = itSubTask->second;
Toshihiro Shimizu 890ddd
						if (subTask->m_status == Running || subTask->m_status == Waiting) {
Toshihiro Shimizu 890ddd
							parentTaskState = Running;
Toshihiro Shimizu 890ddd
							break;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				parentTask->m_status = parentTaskState;
Toshihiro Shimizu 890ddd
				if (parentTask->m_status == Aborted || parentTask->m_status == Aborted) {
Toshihiro Shimizu 890ddd
					parentTask->m_completionDate = task->m_completionDate;
Toshihiro Shimizu 890ddd
					if (parentTask->m_toBeDeleted)
Toshihiro Shimizu 890ddd
						m_tasks.erase(itParent);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		map<qstring, *="" farmserverproxy="">::iterator itServer = m_servers.find(task->m_serverId);</qstring,>
Toshihiro Shimizu 890ddd
		if (itServer != m_servers.end())
Toshihiro Shimizu 890ddd
			server = itServer->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (server) {
Toshihiro Shimizu 890ddd
			/*
Toshihiro Shimizu 890ddd
      string msg = "Task " + taskId + " completed on ";
Toshihiro Shimizu 890ddd
      msg += server->getHostName().c_str();
Toshihiro Shimizu 890ddd
      msg += "\n\n";
Toshihiro Shimizu 890ddd
      m_userLog->info(msg);
Toshihiro Shimizu 890ddd
      */
Toshihiro Shimizu 890ddd
			server->removeTask(taskId);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*
Toshihiro Shimizu 890ddd
    if (parentTask && parentTask->m_status == Completed)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      m_userLog->info("Task " + parentTask->m_id + " completed\n\n");
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
		if (task->m_toBeDeleted)
Toshihiro Shimizu 890ddd
			delete task;
Toshihiro Shimizu 890ddd
		if (parentTask && parentTask->m_toBeDeleted)
Toshihiro Shimizu 890ddd
			delete parentTask;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (server && !server->m_offline) {
Toshihiro Shimizu 890ddd
		// cerca un task da sottomettere al server
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		itTask = m_tasks.begin();
Toshihiro Shimizu 890ddd
		for (; itTask != m_tasks.end(); ++itTask) {
Toshihiro Shimizu 890ddd
			CtrlFarmTask *task = itTask->second;
Toshihiro Shimizu 890ddd
			if (task->m_status == Waiting) {
Toshihiro Shimizu 890ddd
				try {
Toshihiro Shimizu 890ddd
					startTask(task, server);
Toshihiro Shimizu 890ddd
				} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
					continue;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::taskProgress(
Toshihiro Shimizu 890ddd
	const QString &taskId,
Toshihiro Shimizu 890ddd
	int step,
Toshihiro Shimizu 890ddd
	int stepCount,
Toshihiro Shimizu 890ddd
	int frameNumber,
Toshihiro Shimizu 890ddd
	FrameState state)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator itTask = m_tasks.find(TaskId(taskId));</taskid,>
Toshihiro Shimizu 890ddd
	if (itTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = itTask->second;
Toshihiro Shimizu 890ddd
		if (state == FrameDone)
Toshihiro Shimizu 890ddd
			++task->m_successfullSteps;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			++task->m_failedSteps;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_parentId != "") {
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator itParentTask = m_tasks.find(TaskId(task->m_parentId));</taskid,>
Toshihiro Shimizu 890ddd
			CtrlFarmTask *parentTask = itParentTask->second;
Toshihiro Shimizu 890ddd
			if (state == FrameDone)
Toshihiro Shimizu 890ddd
				++parentTask->m_successfullSteps;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				++parentTask->m_failedSteps;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::taskCompleted(const QString &taskId, int exitCode)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef TRACE
Toshihiro Shimizu 890ddd
	m_userLog->info("completed chiamata\n\n");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FarmServerProxy *server = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::iterator itTask = m_tasks.find(TaskId(taskId));</taskid,>
Toshihiro Shimizu 890ddd
	if (itTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = itTask->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->getCommandLine().contains("runcasm")) {
Toshihiro Shimizu 890ddd
			if (task->m_failedSteps == 0 && task->m_successfullSteps > 0)
Toshihiro Shimizu 890ddd
				task->m_status = Completed;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				task->m_status = Aborted;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			switch (exitCode) {
Toshihiro Shimizu 890ddd
			case 0:
Toshihiro Shimizu 890ddd
				task->m_status = Completed;
Toshihiro Shimizu 890ddd
				if (isAScript(task))
Toshihiro Shimizu 890ddd
					task->m_successfullSteps = task->m_stepCount;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			case RENDER_LICENSE_NOT_FOUND:
Toshihiro Shimizu 890ddd
				task->m_status = Waiting;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			default:
Toshihiro Shimizu 890ddd
				if (task->m_status != Suspended)
Toshihiro Shimizu 890ddd
					task->m_status = Aborted;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		task->m_completionDate = QDateTime::currentDateTime();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_status == Aborted) {
Toshihiro Shimizu 890ddd
			task->m_failedOnServers.push_back(task->m_serverId);
Toshihiro Shimizu 890ddd
			++task->m_failureCount;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_toBeDeleted)
Toshihiro Shimizu 890ddd
			m_tasks.erase(itTask);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CtrlFarmTask *parentTask = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_parentId != "") {
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::iterator itParent = m_tasks.find(TaskId(task->m_parentId));</taskid,>
Toshihiro Shimizu 890ddd
			if (itParent != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				parentTask = itParent->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				TaskState parentTaskState = Completed;
Toshihiro Shimizu 890ddd
				bool aSubTaskFailed = false;
Toshihiro Shimizu 890ddd
				bool noSubtaskRunning = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				if (parentTask->m_status != Suspended && parentTask->m_status != Aborted) {
Toshihiro Shimizu 890ddd
					std::vector<qstring>::iterator itSubTaskId = parentTask->m_subTasks.begin();</qstring>
Toshihiro Shimizu 890ddd
					for (; itSubTaskId != parentTask->m_subTasks.end(); ++itSubTaskId) {
Toshihiro Shimizu 890ddd
						QString subTaskId = *itSubTaskId;
Toshihiro Shimizu 890ddd
						map<taskid, *="" ctrlfarmtask="">::iterator itSubTask = m_tasks.find(TaskId(subTaskId));</taskid,>
Toshihiro Shimizu 890ddd
						if (itSubTask != m_tasks.end()) {
Toshihiro Shimizu 890ddd
							CtrlFarmTask *subTask = itSubTask->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
							if (subTask->m_status == Running || subTask->m_status == Waiting) {
Toshihiro Shimizu 890ddd
								parentTaskState = Running;
Toshihiro Shimizu 890ddd
								noSubtaskRunning = false;
Toshihiro Shimizu 890ddd
								break;
Toshihiro Shimizu 890ddd
							} else if (subTask->m_status == Aborted)
Toshihiro Shimizu 890ddd
								aSubTaskFailed = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
							/*
Toshihiro Shimizu 890ddd
              if (subTask->m_status == Running || subTask->m_status == Waiting)
Toshihiro Shimizu 890ddd
                parentTaskState = Running;
Toshihiro Shimizu 890ddd
              else
Toshihiro Shimizu 890ddd
              if (subTask->m_status == Aborted)
Toshihiro Shimizu 890ddd
                aSubTaskFailed = true;
Toshihiro Shimizu 890ddd
              */
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				} else
Toshihiro Shimizu 890ddd
					aSubTaskFailed = true;
Toshihiro Shimizu 890ddd
				; // si arriva se e solo se il task padre e' stato terminato
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				if (aSubTaskFailed && noSubtaskRunning)
Toshihiro Shimizu 890ddd
					parentTask->m_status = Aborted;
Toshihiro Shimizu 890ddd
				else
Toshihiro Shimizu 890ddd
					parentTask->m_status = parentTaskState;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				if (parentTask->m_status == Completed || parentTask->m_status == Aborted) {
Toshihiro Shimizu 890ddd
					parentTask->m_completionDate = task->m_completionDate;
Toshihiro Shimizu 890ddd
					if (parentTask->m_toBeDeleted)
Toshihiro Shimizu 890ddd
						m_tasks.erase(itParent);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		map<qstring, *="" farmserverproxy="">::iterator itServer = m_servers.find(task->m_serverId);</qstring,>
Toshihiro Shimizu 890ddd
		if (itServer != m_servers.end())
Toshihiro Shimizu 890ddd
			server = itServer->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (server) {
Toshihiro Shimizu 890ddd
			if (task->m_status == Completed) {
Toshihiro Shimizu 890ddd
				QString msg = "Task " + taskId + " completed on ";
Toshihiro Shimizu 890ddd
				msg += server->getHostName();
Toshihiro Shimizu 890ddd
				msg += "\n\n";
Toshihiro Shimizu 890ddd
				m_userLog->info(msg);
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				QString msg = "Task " + taskId + " failed on ";
Toshihiro Shimizu 890ddd
				msg += server->getHostName();
Toshihiro Shimizu 890ddd
				msg += " with exit code " + QString::number(exitCode);
Toshihiro Shimizu 890ddd
				msg += "\n\n";
Toshihiro Shimizu 890ddd
				m_userLog->info(msg);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			server->removeTask(taskId);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool allComplete = false;
Toshihiro Shimizu 890ddd
		if (parentTask && parentTask->m_status == Completed) {
Toshihiro Shimizu 890ddd
			m_userLog->info("Task " + parentTask->m_id + " completed\n\n");
Toshihiro Shimizu 890ddd
			allComplete = true;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (task->m_toBeDeleted)
Toshihiro Shimizu 890ddd
			delete task;
Toshihiro Shimizu 890ddd
		if (parentTask && parentTask->m_toBeDeleted)
Toshihiro Shimizu 890ddd
			delete parentTask;
Toshihiro Shimizu 890ddd
		//*
Toshihiro Shimizu 890ddd
		if (allComplete) {
Toshihiro Shimizu 890ddd
			activateReadyServers();
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		//*/
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (server && !server->m_offline && exitCode != RENDER_LICENSE_NOT_FOUND) {
Toshihiro Shimizu 890ddd
		// cerca un task da sottomettere al server
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = getTaskToStart(server);
Toshihiro Shimizu 890ddd
		if (task) {
Toshihiro Shimizu 890ddd
			try {
Toshihiro Shimizu 890ddd
				if (task->m_status == Aborted) {
Toshihiro Shimizu 890ddd
					vector<qstring>::iterator it = find(</qstring>
Toshihiro Shimizu 890ddd
						task->m_failedOnServers.begin(),
Toshihiro Shimizu 890ddd
						task->m_failedOnServers.end(),
Toshihiro Shimizu 890ddd
						server->getId());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					if (it == task->m_failedOnServers.end())
Toshihiro Shimizu 890ddd
						doRestartTask(task->m_id, false, server);
Toshihiro Shimizu 890ddd
					else {
Toshihiro Shimizu 890ddd
						doRestartTask(task->m_id, false, 0);
Toshihiro Shimizu 890ddd
						CtrlFarmTask *nextTask = getNextTaskToStart(task, server);
Toshihiro Shimizu 890ddd
						if (nextTask)
Toshihiro Shimizu 890ddd
							startTask(nextTask, server);
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				} else
Toshihiro Shimizu 890ddd
					startTask(task, server);
Toshihiro Shimizu 890ddd
			} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::getServers(vector<serveridentity> &servers)</serveridentity>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.begin();</qstring,>
Toshihiro Shimizu 890ddd
	for (; it != m_servers.end(); ++it) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *server = it->second;
Toshihiro Shimizu 890ddd
		servers.push_back(ServerIdentity(server->m_addr, server->m_hostName));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ServerState FarmController::queryServerState2(const QString &id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ServerState state = ServerUnknown;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.find(id);</qstring,>
Toshihiro Shimizu 890ddd
	if (it != m_servers.end()) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *server = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QString taskId;
Toshihiro Shimizu 890ddd
		state = getServerState(server, taskId);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return state;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::queryServerInfo(const QString &id, ServerInfo &info)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.find(id);</qstring,>
Toshihiro Shimizu 890ddd
	if (it != m_servers.end()) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *server = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		info.m_name = server->getHostName();
Toshihiro Shimizu 890ddd
		info.m_ipAddress = server->getIpAddress();
Toshihiro Shimizu 890ddd
		info.m_portNumber = QString::number(server->getPort());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		info.m_state = getServerState(server, info.m_currentTaskId);
Toshihiro Shimizu 890ddd
		if (info.m_state != Down && info.m_state != ServerUnknown) {
Toshihiro Shimizu 890ddd
			TFarmServer::HwInfo hwInfo;
Toshihiro Shimizu 890ddd
			server->queryHwInfo(hwInfo);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			info.m_cpuCount = hwInfo.m_cpuCount;
Toshihiro Shimizu 890ddd
			info.m_totPhysMem = hwInfo.m_totPhysMem;
Toshihiro Shimizu 890ddd
			info.m_totVirtMem = hwInfo.m_totVirtMem;
Toshihiro Shimizu 890ddd
			info.m_availPhysMem = hwInfo.m_availPhysMem;
Toshihiro Shimizu 890ddd
			info.m_availVirtMem = hwInfo.m_availVirtMem;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::activateServer(const QString &id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.find(id);</qstring,>
Toshihiro Shimizu 890ddd
	if (it != m_servers.end()) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *server = it->second;
Toshihiro Shimizu 890ddd
		server->m_offline = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int i = 0; i < server->m_maxTaskCount; ++i) {
Toshihiro Shimizu 890ddd
			// cerca un task da sottomettere al server
Toshihiro Shimizu 890ddd
			CtrlFarmTask *task = getTaskToStart(server);
Toshihiro Shimizu 890ddd
			if (task) {
Toshihiro Shimizu 890ddd
				try {
Toshihiro Shimizu 890ddd
					if (task->m_status == Aborted) {
Toshihiro Shimizu 890ddd
						vector<qstring>::iterator it = find(</qstring>
Toshihiro Shimizu 890ddd
							task->m_failedOnServers.begin(),
Toshihiro Shimizu 890ddd
							task->m_failedOnServers.end(),
Toshihiro Shimizu 890ddd
							server->getId());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
						if (it == task->m_failedOnServers.end())
Toshihiro Shimizu 890ddd
							doRestartTask(task->m_id, false, server);
Toshihiro Shimizu 890ddd
						else {
Toshihiro Shimizu 890ddd
							doRestartTask(task->m_id, false, 0);
Toshihiro Shimizu 890ddd
							CtrlFarmTask *nextTask = getNextTaskToStart(task, server);
Toshihiro Shimizu 890ddd
							if (nextTask)
Toshihiro Shimizu 890ddd
								startTask(nextTask, server);
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					} else
Toshihiro Shimizu 890ddd
						startTask(task, server);
Toshihiro Shimizu 890ddd
				} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::deactivateServer(const QString &id, bool completeRunningTasks)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.find(id);</qstring,>
Toshihiro Shimizu 890ddd
	if (it != m_servers.end()) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *server = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QString taskId;
Toshihiro Shimizu 890ddd
		ServerState state = getServerState(server, taskId);
Toshihiro Shimizu 890ddd
		if (state == Busy) {
Toshihiro Shimizu 890ddd
			const vector<qstring> &tasks = server->getTasks();</qstring>
Toshihiro Shimizu 890ddd
			vector<qstring>::const_iterator it = tasks.begin();</qstring>
Toshihiro Shimizu 890ddd
			for (; it != tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
				server->terminateTask(*it);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			server->m_offline = true;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			server->m_offline = true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::load(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TIStream is(fp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_tasks.clear();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string tagName;
Toshihiro Shimizu 890ddd
	is.openChild(tagName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (tagName == "tfarmdata") {
Toshihiro Shimizu 890ddd
		is.openChild(tagName);
Toshihiro Shimizu 890ddd
		if (tagName == "tfarmtasks") {
Toshihiro Shimizu 890ddd
			while (!is.eos()) {
Toshihiro Shimizu 890ddd
				TPersist *p;
Toshihiro Shimizu 890ddd
				is >> p;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				CtrlFarmTask *task = dynamic_cast<ctrlfarmtask *="">(p);</ctrlfarmtask>
Toshihiro Shimizu 890ddd
				if (task)
Toshihiro Shimizu 890ddd
					m_tasks.insert(make_pair(TaskId(task->m_id), task));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			is.closeChild();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is.closeChild();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::const_iterator it = m_tasks.begin();</taskid,>
Toshihiro Shimizu 890ddd
	for (; it != m_tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
		if (task->m_parentId != "") {
Toshihiro Shimizu 890ddd
			map<taskid, *="" ctrlfarmtask="">::const_iterator it2 =</taskid,>
Toshihiro Shimizu 890ddd
				m_tasks.find(TaskId(task->m_parentId));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (it2 != m_tasks.end()) {
Toshihiro Shimizu 890ddd
				CtrlFarmTask *parent = it2->second;
Toshihiro Shimizu 890ddd
				parent->m_subTasks.push_back(task->m_id);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::save(const TFilePath &fp) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TOStream os(fp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<string, string=""> attributes;</string,>
Toshihiro Shimizu 890ddd
	attributes.insert(make_pair("ver", "1.0"));
Toshihiro Shimizu 890ddd
	os.openChild("tfarmdata", attributes);
Toshihiro Shimizu 890ddd
	os.openChild("tfarmtasks");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<taskid, *="" ctrlfarmtask="">::const_iterator it = m_tasks.begin();</taskid,>
Toshihiro Shimizu 890ddd
	for (; it != m_tasks.end(); ++it) {
Toshihiro Shimizu 890ddd
		CtrlFarmTask *task = it->second;
Toshihiro Shimizu 890ddd
		os << task;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os.closeChild();
Toshihiro Shimizu 890ddd
	os.closeChild();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmController::activateReadyServers()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mutex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	map<qstring, *="" farmserverproxy="">::iterator it = m_servers.begin();</qstring,>
Toshihiro Shimizu 890ddd
	for (; it != m_servers.end(); ++it) {
Toshihiro Shimizu 890ddd
		FarmServerProxy *server = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ServerState state = queryServerState2(server->getId());
Toshihiro Shimizu 890ddd
		int tasksCount = server->m_tasks.size();
Toshihiro Shimizu 890ddd
		if (state == Ready || state == Busy && tasksCount < server->m_maxTaskCount) {
Toshihiro Shimizu 890ddd
			for (int i = 0; i < (server->m_maxTaskCount - tasksCount); ++i) {
Toshihiro Shimizu 890ddd
				// cerca un task da sottomettere al server
Toshihiro Shimizu 890ddd
				CtrlFarmTask *task = getTaskToStart(server);
Toshihiro Shimizu 890ddd
				if (task) {
Toshihiro Shimizu 890ddd
					try {
Toshihiro Shimizu 890ddd
						if (task->m_status == Aborted) {
Toshihiro Shimizu 890ddd
							vector<qstring>::iterator it = find(</qstring>
Toshihiro Shimizu 890ddd
								task->m_failedOnServers.begin(),
Toshihiro Shimizu 890ddd
								task->m_failedOnServers.end(),
Toshihiro Shimizu 890ddd
								server->getId());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
							if (it == task->m_failedOnServers.end())
Toshihiro Shimizu 890ddd
								doRestartTask(task->m_id, false, server);
Toshihiro Shimizu 890ddd
							else {
Toshihiro Shimizu 890ddd
								doRestartTask(task->m_id, false, 0);
Toshihiro Shimizu 890ddd
								CtrlFarmTask *nextTask = getNextTaskToStart(task, server);
Toshihiro Shimizu 890ddd
								if (nextTask)
Toshihiro Shimizu 890ddd
									startTask(nextTask, server);
Toshihiro Shimizu 890ddd
							}
Toshihiro Shimizu 890ddd
						} else
Toshihiro Shimizu 890ddd
							startTask(task, server);
Toshihiro Shimizu 890ddd
					} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ControllerService : public TService
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	ControllerService()
Toshihiro Shimizu 890ddd
		: TService("ToonzFarmController", "ToonzFarm Controller"), m_controller(0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~ControllerService()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		delete m_controller;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onStart(int argc, char *argv[]);
Toshihiro Shimizu 890ddd
	void onStop();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static TFilePath getTasksDataFile()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TFilePath fp = getGlobalRoot() + "data" + "tasks.txt";
Toshihiro Shimizu 890ddd
		return fp;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FarmController *m_controller;
Toshihiro Shimizu 890ddd
	TUserLog *m_userLog;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ControllerService::onStart(int argc, char *argv[])
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// Initialize thread components
Toshihiro Shimizu 890ddd
	TThread::init();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
#ifdef _DEBUG
Toshihiro Shimizu 890ddd
  DebugBreak();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
	if (isRunningAsConsoleApp()) {
Toshihiro Shimizu 890ddd
		// i messaggi verranno ridiretti sullo standard output
Toshihiro Shimizu 890ddd
		m_userLog = new TUserLog();
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		TFilePath lRootDir = getLocalRoot();
Toshihiro Shimizu 890ddd
		bool lRootDirExists = dirExists(lRootDir);
Toshihiro Shimizu 890ddd
		if (!lRootDirExists) {
Toshihiro Shimizu 890ddd
			QString errMsg("Unable to start the Controller");
Toshihiro Shimizu 890ddd
			errMsg += "\n";
Toshihiro Shimizu 890ddd
			errMsg += "The directory specified as Local Root does not exist";
Toshihiro Shimizu 890ddd
			errMsg += "\n";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			addToMessageLog(errMsg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// exit the program
Toshihiro Shimizu 890ddd
			setStatus(TService::Stopped, NO_ERROR, 0);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TFilePath logFilePath = lRootDir + "controller.log";
Toshihiro Shimizu 890ddd
		m_userLog = new TUserLog(logFilePath);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_userLog->info("ToonzFarm Controller 1.0\n\n");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath globalRoot = getGlobalRoot();
Toshihiro Shimizu 890ddd
	if (globalRoot.isEmpty()) {
Toshihiro Shimizu 890ddd
		QString errMsg("Unable to get TFARMGLOBALROOT environment variable\n");
Toshihiro Shimizu 890ddd
		addToMessageLog(errMsg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// exit the program
Toshihiro Shimizu 890ddd
		setStatus(TService::Stopped, NO_ERROR, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool globalRootExists = true;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFileStatus fs(globalRoot);
Toshihiro Shimizu 890ddd
	if (!fs.isDirectory())
Toshihiro Shimizu 890ddd
		globalRootExists = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!globalRootExists) {
Toshihiro Shimizu 890ddd
		QString errMsg("The directory specified as TFARMGLOBALROOT does not exist\n");
Toshihiro Shimizu 890ddd
		addToMessageLog(errMsg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// exit the program
Toshihiro Shimizu 890ddd
		setStatus(TService::Stopped, NO_ERROR, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int port = 8000;
Toshihiro Shimizu 890ddd
	QString hostName, addr;
Toshihiro Shimizu 890ddd
	bool ret = loadControllerData(hostName, addr, port);
Toshihiro Shimizu 890ddd
	if (!ret) {
Toshihiro Shimizu 890ddd
		QString msg("Unable to get the port number of ");
Toshihiro Shimizu 890ddd
		msg += TSystem::getHostName();
Toshihiro Shimizu 890ddd
		msg += " from the Controller config file";
Toshihiro Shimizu 890ddd
		msg += "\n";
Toshihiro Shimizu 890ddd
		msg += "Using the default port number ";
Toshihiro Shimizu 890ddd
		msg += QString::number(port);
Toshihiro Shimizu 890ddd
		msg += "\n";
Toshihiro Shimizu 890ddd
		m_userLog->info(msg);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		std::ofstream os("/tmp/.tfarmcontroller.dat");
Toshihiro Shimizu 890ddd
		os << port;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_controller = new FarmController(hostName, addr, port, m_userLog);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// configurazione e inizializzazione dei server lato client
Toshihiro Shimizu 890ddd
	// (il controller e' un client dei ToonzFarm server)
Toshihiro Shimizu 890ddd
	m_controller->loadServersData(globalRoot);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath fp = getTasksDataFile();
Toshihiro Shimizu 890ddd
	if (myDoesExists(fp))
Toshihiro Shimizu 890ddd
		m_controller->load(fp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// si avvia uno dei task caricati da disco
Toshihiro Shimizu 890ddd
	CtrlFarmTask *task = m_controller->getTaskToStart();
Toshihiro Shimizu 890ddd
	if (task) {
Toshihiro Shimizu 890ddd
		TThread::Executor executor;
Toshihiro Shimizu 890ddd
		executor.addTask(new TaskStarter(m_controller, task));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString msg("Starting Controller on port ");
Toshihiro Shimizu 890ddd
	msg += QString::number(m_controller->m_port);
Toshihiro Shimizu 890ddd
	msg += "\n\n";
Toshihiro Shimizu 890ddd
	m_userLog->info(msg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//std::cout << msg;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QEventLoop eventLoop;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Connect the server's listening finished signal to main loop quit.
Toshihiro Shimizu 890ddd
	QObject::connect(m_controller, SIGNAL(finished()), &eventLoop, SLOT(quit()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Start the TcpIp server's listening thread
Toshihiro Shimizu 890ddd
	m_controller->start();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Enter main event loop
Toshihiro Shimizu 890ddd
	eventLoop.exec();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------Farm controller loops here------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	msg = "Controller exited with exit code ";
Toshihiro Shimizu 890ddd
	msg += QString::number(m_controller->getExitCode());
Toshihiro Shimizu 890ddd
	msg += "\n";
Toshihiro Shimizu 890ddd
	m_userLog->info(msg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//std::cout << msg;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		remove("/tmp/.tfarmcontroller.dat");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ControllerService::onStop()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TFilePath fp = getTasksDataFile();
Toshihiro Shimizu 890ddd
	//m_controller->save(fp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath rootDir = getGlobalRoot();
Toshihiro Shimizu 890ddd
	TFilePath lastUsedIdFilePath = rootDir + "config" + "id.txt";
Toshihiro Shimizu 890ddd
	Tofstream os(lastUsedIdFilePath);
Toshihiro Shimizu 890ddd
	if (os.good())
Toshihiro Shimizu 890ddd
		os << FarmController::NextTaskId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TTcpIpClient client;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int socketId;
Toshihiro Shimizu 890ddd
	int ret = client.connect(TSystem::getHostName(), "", m_controller->getPort(), socketId);
Toshihiro Shimizu 890ddd
	if (ret == OK) {
Toshihiro Shimizu 890ddd
		client.send(socketId, "shutdown");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int main(int argc, char **argv)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QCoreApplication a(argc, argv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// LO METTO A TRUE COSI' VEDO QUELLO CHE SCRIVE !!
Toshihiro Shimizu 890ddd
	// RIMETTERLO A FALSE ALTRIMENTI NON PARTE COME SERVIZIO SU WIN
Toshihiro Shimizu 890ddd
	bool console = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (argc > 1) {
Toshihiro Shimizu 890ddd
		string serviceName("ToonzFarmController"); //Must be the same of the installer's
Toshihiro Shimizu 890ddd
		string serviceDisplayName = serviceName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TCli::SimpleQualifier consoleQualifier("-console", "Run as console app");
Toshihiro Shimizu 890ddd
		TCli::StringQualifier installQualifier("-install name", "Install service as 'name'");
Toshihiro Shimizu 890ddd
		TCli::SimpleQualifier removeQualifier("-remove", "Remove service");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TCli::Usage usage(argv[0]);
Toshihiro Shimizu 890ddd
		usage.add(consoleQualifier + installQualifier + removeQualifier);
Toshihiro Shimizu 890ddd
		if (!usage.parse(argc, argv))
Toshihiro Shimizu 890ddd
			exit(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		if (installQualifier.isSelected()) {
Toshihiro Shimizu 890ddd
			char szPath[512];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (installQualifier.getValue() != "")
Toshihiro Shimizu 890ddd
				serviceDisplayName = installQualifier.getValue();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (GetModuleFileName(NULL, szPath, 512) == 0) {
Toshihiro Shimizu 890ddd
				std::cout << "Unable to install";
Toshihiro Shimizu 890ddd
				std::cout << serviceName << " - ";
Toshihiro Shimizu 890ddd
				std::cout << getLastErrorText().c_str() << std::endl
Toshihiro Shimizu 890ddd
						  << std::endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				return 0;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TService::install(
Toshihiro Shimizu 890ddd
				serviceName,
Toshihiro Shimizu 890ddd
				serviceDisplayName,
Toshihiro Shimizu 890ddd
				TFilePath(szPath));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return 0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (removeQualifier.isSelected()) {
Toshihiro Shimizu 890ddd
			TService::remove(serviceName);
Toshihiro Shimizu 890ddd
			return 0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (consoleQualifier.isSelected())
Toshihiro Shimizu 890ddd
			console = true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSystem::hasMainLoop(false);
Toshihiro Shimizu 890ddd
	TService::instance()->run(argc, argv, console);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ControllerService Service;