Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tfarmserver.h"
Toshihiro Shimizu 890ddd
#include "tfarmexecutor.h"
Toshihiro Shimizu 890ddd
#include "tfarmcontroller.h"
Toshihiro Shimizu 890ddd
#include "tthreadmessage.h"
Toshihiro Shimizu 890ddd
#include "tthread.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tsmartpointer.h"
Toshihiro Shimizu 890ddd
#include "service.h"
Toshihiro Shimizu 890ddd
#include "tlog.h"
Toshihiro Shimizu 890ddd
#include "tfilepath_io.h"
Toshihiro Shimizu 890ddd
#include "tcli.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <string></string>
Toshihiro Shimizu 890ddd
#include <map></map>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
#include <qprocess></qprocess>
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
#ifdef WIN32
Toshihiro Shimizu 890ddd
#include <iostream></iostream>
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
#else
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
//#define REDIRECT_OUPUT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#define QUOTE_STR "\""
Toshihiro Shimizu 890ddd
#define CASMPMETER "casmpmeter.exe"
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define QUOTE_STR "'"
Toshihiro Shimizu 890ddd
#define CASMPMETER "casmpmeter"
Toshihiro Shimizu 890ddd
#endif
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
#ifdef MACOSX
Toshihiro Shimizu 890ddd
#include <sys sysctl.h=""> //To retrieve MAC HW infos</sys>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// forward declaration
Toshihiro Shimizu 890ddd
class FarmServer;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
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
	// 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
			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("SOFTWARE\\OpenToonz\\OpenToonz\\1.0\\TOONZROOT");
Toshihiro Shimizu 890ddd
	lroot = TFilePath(TSystem::getSystemValue(name).toStdString()) + TFilePath("toonzfarm");
Toshihiro Shimizu 890ddd
#else
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
#endif
Toshihiro Shimizu 890ddd
	return lroot;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
TFilePath getAppsCfgFilePath()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  TFilePath appsRoot = getLocalRoot();
Toshihiro Shimizu 890ddd
  return appsRoot + "config" + "apppath.cfg";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath getBinRoot()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	return TSystem::getBinDir();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	return getLocalRoot() + "bin";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
string myGetHostName()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
  return TSystem::getHostName();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
  char hostName[MAXHOSTNAMELEN];
Toshihiro Shimizu 890ddd
  gethostname((char*)&hostName, MAXHOSTNAMELEN);
Toshihiro Shimizu 890ddd
  return hostName;
Toshihiro Shimizu 890ddd
#endif
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 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
inline bool isBlank(char c)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return c == ' ' || c == '\t' || c == '\n';
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // anonymous namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FarmServerService : public TService
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FarmServerService(std::ostream &os)
Toshihiro Shimizu 890ddd
		: TService("ToonzFarm Server", "ToonzFarm Server"), m_os(os), m_userLog(0) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~FarmServerService()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		delete m_userLog;
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
	void loadControllerData(QString &hostName, string &ipAddr, int &port);
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	void loadDiskMountingPoints(const TFilePath &fp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void mountDisks();
Toshihiro Shimizu 890ddd
	void unmountDisks();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::map<string, string=""> m_disks;</string,>
Toshihiro Shimizu 890ddd
	vector<string> m_disksMounted;</string>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_port;
Toshihiro Shimizu 890ddd
	QString m_addr;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FarmServer *m_farmServer;
Toshihiro Shimizu 890ddd
	std::ostream &m_os;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUserLog *m_userLog;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FarmServerService service(std::cout);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FarmControllerProxy : public TSmartObject
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFarmController *m_controller;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FarmControllerProxy(TFarmController *controller)
Toshihiro Shimizu 890ddd
		: m_controller(controller) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~FarmControllerProxy()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		delete m_controller;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TFarmController *getController() const { return m_controller; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	FarmControllerProxy(const FarmControllerProxy &);
Toshihiro Shimizu 890ddd
	FarmControllerProxy &operator=(const FarmControllerProxy &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// non posso usare lo smartpointer di tnzcore perche' non linka su .NET
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FarmControllerProxyP
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FarmControllerProxy *m_proxy;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FarmControllerProxyP() : m_proxy(0) {}
Toshihiro Shimizu 890ddd
	~FarmControllerProxyP()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_proxy)
Toshihiro Shimizu 890ddd
			m_proxy->release();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	FarmControllerProxyP(const FarmControllerProxyP &src) : m_proxy(src.m_proxy)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_proxy)
Toshihiro Shimizu 890ddd
			m_proxy->addRef();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	FarmControllerProxyP &operator=(const FarmControllerProxyP &src)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		FarmControllerProxyP tmp(*this);
Toshihiro Shimizu 890ddd
		tswap(tmp.m_proxy, m_proxy);
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FarmControllerProxyP &operator=(TFarmController *controller)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_proxy && m_proxy->getController() == controller)
Toshihiro Shimizu 890ddd
			return *this;
Toshihiro Shimizu 890ddd
		if (m_proxy)
Toshihiro Shimizu 890ddd
			m_proxy->release();
Toshihiro Shimizu 890ddd
		m_proxy = new FarmControllerProxy(controller);
Toshihiro Shimizu 890ddd
		m_proxy->addRef();
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFarmController *operator->()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getPointer();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TFarmController *getPointer() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_proxy ? m_proxy->getController() : 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FarmServer : public TFarmExecutor, public TFarmServer
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FarmServer(int port, TUserLog *log);
Toshihiro Shimizu 890ddd
	~FarmServer();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setController(const ControllerData &data)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_controllerData = data;
Toshihiro Shimizu 890ddd
		TFarmController *controller = 0;
Toshihiro Shimizu 890ddd
		TFarmControllerFactory factory;
Toshihiro Shimizu 890ddd
		factory.create(data, &controller);
Toshihiro Shimizu 890ddd
		m_controller = controller;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TFarmController *getController() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_controller.getPointer();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void setAppPaths(const vector<tfilepath> &);</tfilepath>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString execute(const vector<qstring> &argv);</qstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// TFarmServer overrides
Toshihiro Shimizu 890ddd
	int addTask(const QString &taskid, const QString &cmdline);
Toshihiro Shimizu 890ddd
	int terminateTask(const QString &taskid);
Toshihiro Shimizu 890ddd
	int getTasks(vector<qstring> &tasks);</qstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void queryHwInfo(HwInfo &hwInfo);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void attachController(const ControllerData &data);
Toshihiro Shimizu 890ddd
	void attachController(const QString &name, const QString &addr, int port)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		attachController(ControllerData(name, addr, port));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void detachController(const ControllerData &data);
Toshihiro Shimizu 890ddd
	void detachController(const QString &name, const QString &addr, int port)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		detachController(ControllerData(name, addr, port));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// class specific methods
Toshihiro Shimizu 890ddd
	void removeTask(const QString &id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	TThread::Executor *m_executor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ControllerData m_controllerData;
Toshihiro Shimizu 890ddd
	FarmControllerProxyP m_controller;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThread::Mutex m_mux;
Toshihiro Shimizu 890ddd
	vector<qstring> m_tasks;</qstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUserLog *m_userLog;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	//vector<tfilepath> m_appPaths;</tfilepath>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	FarmServer(const FarmServer &);
Toshihiro Shimizu 890ddd
	FarmServer &operator=(const FarmServer &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// class Task
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class Task : public TThread::Runnable
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	Task(const QString &id,
Toshihiro Shimizu 890ddd
		 const QString &cmdline,
Toshihiro Shimizu 890ddd
		 TUserLog *log,
Toshihiro Shimizu 890ddd
		 FarmServer *server,
Toshihiro Shimizu 890ddd
		 const FarmControllerProxyP &controller)
Toshihiro Shimizu 890ddd
		: m_id(id), m_cmdline(cmdline), m_log(log), m_server(server), m_controller(controller) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void run();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	QString m_id;
Toshihiro Shimizu 890ddd
	QString m_cmdline;
Toshihiro Shimizu 890ddd
	TUserLog *m_log;
Toshihiro Shimizu 890ddd
	FarmServer *m_server;
Toshihiro Shimizu 890ddd
	FarmControllerProxyP m_controller;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	Task(const Task &);
Toshihiro Shimizu 890ddd
	Task &operator=(const Task &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Task::run()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QString logMsg("Starting task at ");
Toshihiro Shimizu 890ddd
	logMsg += QDateTime::currentDateTime().toString();
Toshihiro Shimizu 890ddd
	logMsg += "\n";
Toshihiro Shimizu 890ddd
	logMsg += "\"" + m_cmdline + "\"";
Toshihiro Shimizu 890ddd
	logMsg += "\n\n";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_log->info(logMsg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// ===========
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	if (m_cmdline.contains("runcasm"))
Toshihiro Shimizu 890ddd
		service.mountDisks();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString cmdline;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_cmdline.contains(".bat"))
Toshihiro Shimizu 890ddd
		cmdline = "cmd /C " + m_cmdline;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		cmdline = m_cmdline;
Toshihiro Shimizu 890ddd
#ifdef LEVO
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		// metto da parte il primo token della command line che e' il nome
Toshihiro Shimizu 890ddd
		// dell'eseguibile
Toshihiro Shimizu 890ddd
		// Attenzione: case sensitive!
Toshihiro Shimizu 890ddd
		QStringList l = m_cmdline.split(" ");
Toshihiro Shimizu 890ddd
		//assert(!"CONTROLLARE QUI");
Toshihiro Shimizu 890ddd
		QString appName = l.at(1);
Toshihiro Shimizu 890ddd
		int i;
Toshihiro Shimizu 890ddd
		for (i = 2; i < l.size(); i++)
Toshihiro Shimizu 890ddd
			cmdline += l.at(i);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// cerco se il nome dell'applicazione e' tra quelle del file di configurazione
Toshihiro Shimizu 890ddd
		bool foundApp = false;
Toshihiro Shimizu 890ddd
		vector<tfilepath>::iterator it = m_server->m_appPaths.begin();</tfilepath>
Toshihiro Shimizu 890ddd
		for (; it != m_server->m_appPaths.end(); ++it) {
Toshihiro Shimizu 890ddd
			TFilePath appPath = *it;
Toshihiro Shimizu 890ddd
			if (appPath.getName() == appName.toStdString()) {
Toshihiro Shimizu 890ddd
				exename = QString::fromStdWString(appPath.getWideString());
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif //LEVO
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//cout << exename << endl;
Toshihiro Shimizu 890ddd
	//cout << cmdline << endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QProcess process;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	process.start(cmdline);
Toshihiro Shimizu 890ddd
	process.waitForFinished(-1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int exitCode = process.exitCode();
Toshihiro Shimizu 890ddd
	int errorCode = process.error();
Toshihiro Shimizu 890ddd
	bool ret = (errorCode != QProcess::UnknownError) || exitCode;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//int ret=QProcess::execute(/*"C:\\depot\\vincenzo\\toonz\\main\\x86_debug\\" +*/cmdline);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (ret != 0) {
Toshihiro Shimizu 890ddd
		QString logMsg("Task aborted ");
Toshihiro Shimizu 890ddd
		logMsg += "\n\n";
Toshihiro Shimizu 890ddd
		m_log->warning(logMsg);
Toshihiro Shimizu 890ddd
		m_controller->taskSubmissionError(m_id, exitCode);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		logMsg = "Task completed at ";
Toshihiro Shimizu 890ddd
		logMsg += QDateTime::currentDateTime().toString();
Toshihiro Shimizu 890ddd
		logMsg += "\n\n";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_log->info(logMsg);
Toshihiro Shimizu 890ddd
		m_controller->taskCompleted(m_id, exitCode);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//CloseHandle(hJob);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_server->removeTask(m_id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//************* COMMENTATO A CAUSA DI UN PROBLEMA SU XP
Toshihiro Shimizu 890ddd
	// ora i dischi vengono montati al primo task di tipo "runcasm"
Toshihiro Shimizu 890ddd
	// e smontati allo stop del servizio
Toshihiro Shimizu 890ddd
	//service.unmountDisks();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FarmServer::FarmServer(int port, TUserLog *log)
Toshihiro Shimizu 890ddd
	: TFarmExecutor(port), m_controller(), m_userLog(log)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFarmServer::HwInfo hwInfo;
Toshihiro Shimizu 890ddd
	queryHwInfo(hwInfo);
Toshihiro Shimizu 890ddd
	m_executor = new TThread::Executor;
Toshihiro Shimizu 890ddd
	m_executor->setMaxActiveTasks(1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FarmServer::~FarmServer()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	delete m_executor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline string toString(unsigned long value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ostrstream ss;
Toshihiro Shimizu 890ddd
	ss << value << '\0';
Toshihiro Shimizu 890ddd
	string s = ss.str();
Toshihiro Shimizu 890ddd
	ss.freeze(false);
Toshihiro Shimizu 890ddd
	return s;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
void FarmServer::setAppPaths(const vector<tfilepath> &appPaths)</tfilepath>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  m_appPaths = appPaths;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
QString FarmServer::execute(const vector<qstring> &argv)</qstring>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
#ifdef _DEBUG
Toshihiro Shimizu 890ddd
  std::cout << endl << "executing " << argv[0].c_str() << endl << endl;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (argv.size() > 0) {
Toshihiro Shimizu 890ddd
		/*
Toshihiro Shimizu 890ddd
#ifdef _DEBUG
Toshihiro Shimizu 890ddd
    for (int i=0; i
Toshihiro Shimizu 890ddd
      std::cout << argv[i] << " ";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
		if (argv[0] == "addTask" && argv.size() == 3) {
Toshihiro Shimizu 890ddd
			//assert(!"Da fare");
Toshihiro Shimizu 890ddd
			int ret = addTask(argv[1], argv[2]);
Toshihiro Shimizu 890ddd
			return QString::number(ret);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "terminateTask" && argv.size() > 1) {
Toshihiro Shimizu 890ddd
			int ret = terminateTask(argv[1]);
Toshihiro Shimizu 890ddd
			return QString::number(ret);
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "getTasks") {
Toshihiro Shimizu 890ddd
			vector<qstring> tasks;</qstring>
Toshihiro Shimizu 890ddd
			int ret = getTasks(tasks);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QString reply(QString::number(ret));
Toshihiro Shimizu 890ddd
			reply += ",";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			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.isEmpty())
Toshihiro Shimizu 890ddd
				reply.left(reply.size() - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return reply;
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "queryHwInfo") {
Toshihiro Shimizu 890ddd
			TFarmServer::HwInfo hwInfo;
Toshihiro Shimizu 890ddd
			queryHwInfo(hwInfo);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			QString ret;
Toshihiro Shimizu 890ddd
			ret += QString::number((unsigned long)hwInfo.m_cpuCount);
Toshihiro Shimizu 890ddd
			ret += ",";
Toshihiro Shimizu 890ddd
			ret += QString::number((unsigned long)(hwInfo.m_totPhysMem / 1024));
Toshihiro Shimizu 890ddd
			ret += ",";
Toshihiro Shimizu 890ddd
			ret += QString::number((unsigned long)(hwInfo.m_availPhysMem / 1024));
Toshihiro Shimizu 890ddd
			ret += ",";
Toshihiro Shimizu 890ddd
			ret += QString::number((unsigned long)(hwInfo.m_totVirtMem / 1024));
Toshihiro Shimizu 890ddd
			ret += ",";
Toshihiro Shimizu 890ddd
			ret += QString::number((unsigned long)(hwInfo.m_availVirtMem / 1024));
Toshihiro Shimizu 890ddd
			ret += ",";
Toshihiro Shimizu 890ddd
			ret += QString::number(hwInfo.m_type);
Toshihiro Shimizu 890ddd
			return ret;
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "attachController" && argv.size() > 3) {
Toshihiro Shimizu 890ddd
			int port;
Toshihiro Shimizu 890ddd
			fromStr(port, argv[3]);
Toshihiro Shimizu 890ddd
			attachController(ControllerData(argv[1], argv[2], port));
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		} else if (argv[0] == "detachController" && argv.size() > 3) {
Toshihiro Shimizu 890ddd
			int port;
Toshihiro Shimizu 890ddd
			fromStr(port, argv[3]);
Toshihiro Shimizu 890ddd
			detachController(ControllerData(argv[1], argv[2], port));
Toshihiro Shimizu 890ddd
			return "";
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QString::number(-1);
Toshihiro Shimizu 890ddd
	;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FarmServer::addTask(const QString &id, const QString &cmdline)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//std::cout << "Server: addTask" << id << cmdline << std::endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString lcmdline = cmdline;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (lcmdline.contains("runcasm")) {
Toshihiro Shimizu 890ddd
		// il task e' runcasm
Toshihiro Shimizu 890ddd
		TFilePath rootDir = getGlobalRoot();
Toshihiro Shimizu 890ddd
		TFilePath logfilePath = (rootDir + "logs" + id.toStdString()).withType(".log");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		lcmdline += " -logfile " + QString::fromStdWString(logfilePath.getWideString());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TFilePath casmpmeterFp = getBinRoot() + CASMPMETER;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		lcmdline += " -ac " + QString::fromStdWString(casmpmeterFp.getWideString());
Toshihiro Shimizu 890ddd
		lcmdline += " -ac_args " + QString(QUOTE_STR);
Toshihiro Shimizu 890ddd
		lcmdline += "$count $total $frame $filename " + id + QUOTE_STR;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (lcmdline.contains("zrender"))
Toshihiro Shimizu 890ddd
		lcmdline += " -taskid " + id;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (lcmdline.contains("tcomposer")) {
Toshihiro Shimizu 890ddd
		lcmdline += " -farm " + QString::number(m_controllerData.m_port) + "@" + m_controllerData.m_hostName;
Toshihiro Shimizu 890ddd
		lcmdline += " -id " + id;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_executor->addTask(new Task(id, lcmdline, m_userLog, this, m_controller));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mux);
Toshihiro Shimizu 890ddd
	m_tasks.push_back(id);
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FarmServer::terminateTask(const QString &taskid)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	HANDLE hJob = OpenJobObject(
Toshihiro Shimizu 890ddd
		MAXIMUM_ALLOWED, // access right
Toshihiro Shimizu 890ddd
		TRUE,			 // inheritance state
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050500
Toshihiro Shimizu 890ddd
		taskid.toUtf8()); // job name
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		taskid.toAscii()); // job name
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (hJob != NULL) {
Toshihiro Shimizu 890ddd
		BOOL res = TerminateJobObject(
Toshihiro Shimizu 890ddd
			hJob, // handle to job
Toshihiro Shimizu 890ddd
			2);   // exit code
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FarmServer::getTasks(vector<qstring> &tasks)</qstring>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mux);
Toshihiro Shimizu 890ddd
	tasks = m_tasks;
Toshihiro Shimizu 890ddd
	return m_tasks.size();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServer::queryHwInfo(HwInfo &hwInfo)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	MEMORYSTATUS buff;
Toshihiro Shimizu 890ddd
	GlobalMemoryStatus(&buff);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	hwInfo.m_totPhysMem = buff.dwTotalPhys;
Toshihiro Shimizu 890ddd
	hwInfo.m_availPhysMem = buff.dwAvailPhys;
Toshihiro Shimizu 890ddd
	hwInfo.m_totVirtMem = buff.dwTotalVirtual;
Toshihiro Shimizu 890ddd
	hwInfo.m_availVirtMem = buff.dwAvailVirtual;
Toshihiro Shimizu 890ddd
	hwInfo.m_cpuCount = TSystem::getProcessorCount();
Toshihiro Shimizu 890ddd
	hwInfo.m_type = Windows;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	hwInfo.m_cpuCount = sysconf(_SC_NPROC_CONF);
Toshihiro Shimizu 890ddd
	hwInfo.m_type = Irix;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int mib[2];
Toshihiro Shimizu 890ddd
	TINT64 physMemSize;
Toshihiro Shimizu 890ddd
	size_t len;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	mib[0] = CTL_HW;
Toshihiro Shimizu 890ddd
	mib[1] = HW_MEMSIZE;
Toshihiro Shimizu 890ddd
	len = sizeof(physMemSize);
Toshihiro Shimizu 890ddd
	sysctl(mib, 2, &physMemSize, &len, NULL, 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	hwInfo.m_cpuCount = TSystem::getProcessorCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//We can just retrieve the overall physical memory - the rest is defaulted to 500 MB
Toshihiro Shimizu 890ddd
	hwInfo.m_totPhysMem = physMemSize;
Toshihiro Shimizu 890ddd
	hwInfo.m_availPhysMem = 500000000;
Toshihiro Shimizu 890ddd
	hwInfo.m_totVirtMem = 500000000;
Toshihiro Shimizu 890ddd
	hwInfo.m_availVirtMem = 500000000;
Toshihiro Shimizu 890ddd
	hwInfo.m_type = Linux;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServer::attachController(const ControllerData &data)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setController(data);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServer::detachController(const ControllerData &data)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_controllerData == data) {
Toshihiro Shimizu 890ddd
		//delete m_controller;
Toshihiro Shimizu 890ddd
		m_controller = 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServer::removeTask(const QString &id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QMutexLocker sl(&m_mux);
Toshihiro Shimizu 890ddd
	vector<qstring>::iterator it = find(m_tasks.begin(), m_tasks.end(), id);</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
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string getLine(std::istream &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	string out;
Toshihiro Shimizu 890ddd
	char c;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (!is.eof()) {
Toshihiro Shimizu 890ddd
		is.get(c);
Toshihiro Shimizu 890ddd
		if (c != '\r')
Toshihiro Shimizu 890ddd
			if (c != '\n')
Toshihiro Shimizu 890ddd
				if (!is.fail())
Toshihiro Shimizu 890ddd
					out.append(1, c);
Toshihiro Shimizu 890ddd
				else
Toshihiro Shimizu 890ddd
					break;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return out;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // anonymous namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int inline STRICMP(const QString &a, const QString &b) { return a.compare(b, Qt::CaseSensitive); }
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
bool loadServerData(const QString &hostname, QString &addr, int &port)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath rootDir = getGlobalRoot();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath fp = rootDir + "config" + "servers.txt";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef WIN32
Toshihiro Shimizu 890ddd
	int acc = access(toString(fp.getWideString()).c_str(), 00); // 00 == solo esistenza
Toshihiro Shimizu 890ddd
	bool fileExists = acc != -1;
Toshihiro Shimizu 890ddd
	if (!fileExists)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Tifstream is(fp);
Toshihiro Shimizu 890ddd
	if (!is.good())
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	while (!is.eof()) {
Toshihiro Shimizu 890ddd
		/*
Toshihiro Shimizu 890ddd
    char line[256];
Toshihiro Shimizu 890ddd
    is.getline(line, 256);
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
		string line = getLine(is);
Toshihiro Shimizu 890ddd
		istrstream iss(line.c_str());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		char name[80];
Toshihiro Shimizu 890ddd
		char ipAddress[80];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		iss >> name >> ipAddress >> port;
Toshihiro Shimizu 890ddd
		if (name[0] == '#')
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050500
Toshihiro Shimizu 890ddd
		if (STRICMP(hostname.toUtf8(), name) == 0)
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		if (STRICMP(hostname.toAscii(), name) == 0)
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			addr = QString(ipAddress);
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServerService::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
#ifdef WIN32
Toshihiro Shimizu 890ddd
//  DebugBreak();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath lRootDir = getLocalRoot();
Toshihiro Shimizu 890ddd
	TFileStatus fs(lRootDir);
Toshihiro Shimizu 890ddd
	bool lRootDirExists = fs.isDirectory();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!lRootDirExists) {
Toshihiro Shimizu 890ddd
		string errMsg("Unable to start the Server");
Toshihiro Shimizu 890ddd
		errMsg += "\n";
kusano 898953
		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
// DEBUG MAC SERVIZIO (DA TOGLIERE)
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
		system("echo 'local root does not exist' >> err.log");
Toshihiro Shimizu 890ddd
#endif
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 gRootDir = getGlobalRoot();
Toshihiro Shimizu 890ddd
	if (toString(gRootDir.getWideString()) == "") {
Toshihiro Shimizu 890ddd
		string errMsg("Unable to get TFARMGLOBALROOT environment variable");
Toshihiro Shimizu 890ddd
		addToMessageLog(errMsg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// DEBUG MAC SERVIZIO (DA TOGLIERE)
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
		system("echo 'Unable to set the global root' >> err.log");
Toshihiro Shimizu 890ddd
#endif
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 gRootDirExists = dirExists(gRootDir);
Toshihiro Shimizu 890ddd
	;
Toshihiro Shimizu 890ddd
	if (!gRootDirExists) {
Toshihiro Shimizu 890ddd
		string errMsg("Unable to start the Server");
Toshihiro Shimizu 890ddd
		errMsg += "\n";
Toshihiro Shimizu 890ddd
		errMsg += "The directory " + toString(gRootDir.getWideString()) + " specified as Global Root does not exist";
Toshihiro Shimizu 890ddd
		;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		addToMessageLog(errMsg);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// DEBUG MAC SERVIZIO (DA TOGLIERE)
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
		system("echo 'Global root does not exist' >> err.log");
Toshihiro Shimizu 890ddd
#endif
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
	// legge dal file di configurazione le informazioni sul controller
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath fp = gRootDir + "config" + "controller.txt";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ControllerData controllerData;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		::loadControllerData(fp, controllerData);
Toshihiro Shimizu 890ddd
	} catch (TException &e) {
Toshihiro Shimizu 890ddd
		string errMsg("Unable to start the Server");
Toshihiro Shimizu 890ddd
		errMsg += "\n";
Toshihiro Shimizu 890ddd
		errMsg += toString(e.getMessage());
Toshihiro Shimizu 890ddd
		addToMessageLog(errMsg);
Toshihiro Shimizu 890ddd
		setStatus(TService::Stopped, NO_ERROR, 0); // exit the program
Toshihiro Shimizu 890ddd
	}
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 logFilePath = lRootDir + "server.log";
Toshihiro Shimizu 890ddd
		m_userLog = new TUserLog(logFilePath);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_userLog->info("ToonzFarm Server 1.0");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// legge dal file di configurazione dei server il numero di porta da utilizzare
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = loadServerData(TSystem::getHostName(), m_addr, m_port);
Toshihiro Shimizu 890ddd
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 servers config file";
Toshihiro Shimizu 890ddd
		msg += "\n";
Toshihiro Shimizu 890ddd
		msg += "Using the default port number 8002";
Toshihiro Shimizu 890ddd
		msg += "\n";
Toshihiro Shimizu 890ddd
		msg += "\n";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_userLog->info(msg);
Toshihiro Shimizu 890ddd
		m_port = 8002;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		std::ofstream os("/tmp/.tfarmserverd.dat");
Toshihiro Shimizu 890ddd
		os << m_port;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_farmServer = new FarmServer(m_port, m_userLog);
Toshihiro Shimizu 890ddd
	m_farmServer->setController(controllerData);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		m_farmServer->getController()->attachServer(TSystem::getHostName(), m_addr, m_port);
Toshihiro Shimizu 890ddd
	} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	TFilePath diskMountingsFilePath = lRootDir + "config" + "diskmap.cfg";
Toshihiro Shimizu 890ddd
	if (myDoesExists(diskMountingsFilePath)) {
Toshihiro Shimizu 890ddd
		loadDiskMountingPoints(diskMountingsFilePath);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// i dischi vengono montati al primo task di tipo "runcasm"
Toshihiro Shimizu 890ddd
		// e smontati allo stop del servizio
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//mountDisks();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Carica da un file di configurazione i path dei programmi da lanciare.
Toshihiro Shimizu 890ddd
	// Per tutti i programmi il cui path non e' contenuto nel file di configurazione
Toshihiro Shimizu 890ddd
	// si assume che il path del folder del programma sia specificato
Toshihiro Shimizu 890ddd
	// nella variabile di sistema PATH
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  vector<tfilepath> appPaths;</tfilepath>
Toshihiro Shimizu 890ddd
  TFilePath appsCfgFile = getAppsCfgFilePath();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  Tifstream isAppCfgFile(appsCfgFile);
Toshihiro Shimizu 890ddd
  if (!isAppCfgFile.good())
Toshihiro Shimizu 890ddd
    std::cout << "Error: " << appsCfgFile << endl;
Toshihiro Shimizu 890ddd
  while (!isAppCfgFile.eof())
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    string line = getLine(isAppCfgFile);
Toshihiro Shimizu 890ddd
    istrstream iss(line.c_str());
Toshihiro Shimizu 890ddd
    TFilePath appPath = TFilePath(line);
Toshihiro Shimizu 890ddd
    appPaths.push_back(appPath);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  m_farmServer->setAppPaths(appPaths);
Toshihiro Shimizu 890ddd
  */
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_farmServer, SIGNAL(finished()), &eventLoop, SLOT(quit()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Run the TcpIp server's listening state
Toshihiro Shimizu 890ddd
	m_farmServer->start();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Main loop starts here
Toshihiro Shimizu 890ddd
	eventLoop.exec();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------Farm server loops here------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int rc = m_farmServer->getExitCode();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef __sgi
Toshihiro Shimizu 890ddd
	remove("/tmp/.tfarmserver.dat");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (rc != 0) {
Toshihiro Shimizu 890ddd
		string msg("An error occurred starting the ToonzFarm Server");
Toshihiro Shimizu 890ddd
		msg += "\n";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		LPVOID lpMsgBuf;
Toshihiro Shimizu 890ddd
		FormatMessage(
Toshihiro Shimizu 890ddd
			FORMAT_MESSAGE_ALLOCATE_BUFFER |
Toshihiro Shimizu 890ddd
				FORMAT_MESSAGE_FROM_SYSTEM |
Toshihiro Shimizu 890ddd
				FORMAT_MESSAGE_IGNORE_INSERTS,
Toshihiro Shimizu 890ddd
			NULL,
Toshihiro Shimizu 890ddd
			rc,
Toshihiro Shimizu 890ddd
			0, // Default language
Toshihiro Shimizu 890ddd
			(LPTSTR)&lpMsgBuf,
Toshihiro Shimizu 890ddd
			0,
Toshihiro Shimizu 890ddd
			NULL);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		msg += string((char *)lpMsgBuf);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Free the buffer.
Toshihiro Shimizu 890ddd
		LocalFree(lpMsgBuf);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		addToMessageLog(msg);
Toshihiro Shimizu 890ddd
		m_userLog->error(QString::fromStdString(msg));
Toshihiro Shimizu 890ddd
		setStatus(TService::Stopped, NO_ERROR, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string msg("Exiting with code ");
Toshihiro Shimizu 890ddd
	msg += toString(ret);
Toshihiro Shimizu 890ddd
	msg += "\n";
Toshihiro Shimizu 890ddd
	m_userLog->info(QString::fromStdString(msg));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServerService::onStop()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		m_farmServer->getController()->detachServer(TSystem::getHostName(), m_addr, m_port);
Toshihiro Shimizu 890ddd
	} catch (TException & /*e*/) {
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// i dischi vengono montati al primo task di tipo "runcasm"
Toshihiro Shimizu 890ddd
// e smontati allo stop del servizio
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	unmountDisks();
Toshihiro Shimizu 890ddd
#endif
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_farmServer->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
#ifdef WIN32
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServerService::loadDiskMountingPoints(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	Tifstream is(fp);
Toshihiro Shimizu 890ddd
	if (!is)
Toshihiro Shimizu 890ddd
		throw string("File " + toString(fp.getWideString()) + " not found");
Toshihiro Shimizu 890ddd
	char buffer[1024];
Toshihiro Shimizu 890ddd
	while (is.getline(buffer, sizeof(buffer))) {
Toshihiro Shimizu 890ddd
		char *s = buffer;
Toshihiro Shimizu 890ddd
		while (isBlank(*s))
Toshihiro Shimizu 890ddd
			s++;
Toshihiro Shimizu 890ddd
		if (*s == '\0' || *s == '#' || *s == '!')
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		if (*s == '=')
Toshihiro Shimizu 890ddd
			continue; // errore: from vuoto
Toshihiro Shimizu 890ddd
		char *t = s;
Toshihiro Shimizu 890ddd
		while (*t && *t != '=')
Toshihiro Shimizu 890ddd
			t++;
Toshihiro Shimizu 890ddd
		if (*t != '=')
Toshihiro Shimizu 890ddd
			continue; // errore: manca '='
Toshihiro Shimizu 890ddd
		char *q = t;
Toshihiro Shimizu 890ddd
		while (q > s && isBlank(*(q - 1)))
Toshihiro Shimizu 890ddd
			q--;
Toshihiro Shimizu 890ddd
		if (q == s)
Toshihiro Shimizu 890ddd
			continue; // non dovrebbe succedere mai: prima di '=' tutti blanks
Toshihiro Shimizu 890ddd
		string from(s, q - s);
Toshihiro Shimizu 890ddd
		s = t + 1;
Toshihiro Shimizu 890ddd
		while (isBlank(*s))
Toshihiro Shimizu 890ddd
			s++;
Toshihiro Shimizu 890ddd
		if (*s == '\0')
Toshihiro Shimizu 890ddd
			continue; // errore: dst vuoto
Toshihiro Shimizu 890ddd
		t = s;
Toshihiro Shimizu 890ddd
		while (*t)
Toshihiro Shimizu 890ddd
			t++;
Toshihiro Shimizu 890ddd
		while (t > s && isBlank(*(t - 1)))
Toshihiro Shimizu 890ddd
			t--;
Toshihiro Shimizu 890ddd
		if (t == s)
Toshihiro Shimizu 890ddd
			continue; // non dovrebbe succedere mai: dst vuoto
Toshihiro Shimizu 890ddd
		string dst(s, t - s);
Toshihiro Shimizu 890ddd
		m_disks[from] = dst;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServerService::mountDisks()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	std::map<string, string="">::iterator it = m_disks.begin();</string,>
Toshihiro Shimizu 890ddd
	for (; it != m_disks.end(); ++it) {
Toshihiro Shimizu 890ddd
		string drive = it->first;
Toshihiro Shimizu 890ddd
		string remoteName = it->second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		NETRESOURCE NetResource;
Toshihiro Shimizu 890ddd
		NetResource.dwType = RESOURCETYPE_DISK;
Toshihiro Shimizu 890ddd
		NetResource.lpLocalName = (LPSTR)drive.c_str();		  // "O:";
Toshihiro Shimizu 890ddd
		NetResource.lpRemoteName = (LPSTR)remoteName.c_str(); // "\\\\vega\\PERSONALI";
Toshihiro Shimizu 890ddd
		NetResource.lpProvider = NULL;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		DWORD res = WNetAddConnection2(
Toshihiro Shimizu 890ddd
			&NetResource, // connection details
Toshihiro Shimizu 890ddd
			0,			  // password
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050500
Toshihiro Shimizu 890ddd
			TSystem::getUserName().toUtf8(), // user name
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
			TSystem::getUserName().toAscii(), // user name
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
			0); // connection options
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (res == NO_ERROR)
Toshihiro Shimizu 890ddd
			m_disksMounted.push_back(drive);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (res != NO_ERROR && res != ERROR_ALREADY_ASSIGNED) {
Toshihiro Shimizu 890ddd
			// ERROR_BAD_NET_NAME
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			DWORD dwLastError;
Toshihiro Shimizu 890ddd
			char errorBuf[1024];
Toshihiro Shimizu 890ddd
			char nameBuf[1024];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			DWORD rett = WNetGetLastError(
Toshihiro Shimizu 890ddd
				&dwLastError,	 // error code
Toshihiro Shimizu 890ddd
				errorBuf,		  // error description buffer
Toshihiro Shimizu 890ddd
				sizeof(errorBuf), // size of description buffer
Toshihiro Shimizu 890ddd
				nameBuf,		  // buffer for provider name
Toshihiro Shimizu 890ddd
				sizeof(nameBuf)); // size of provider name buffer
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			string errorMessage("Unable to map ");
Toshihiro Shimizu 890ddd
			errorMessage += NetResource.lpRemoteName;
Toshihiro Shimizu 890ddd
			errorMessage += " to logic volume ";
Toshihiro Shimizu 890ddd
			errorMessage += NetResource.lpLocalName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			addToMessageLog(errorMessage);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FarmServerService::unmountDisks()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	vector<string>::iterator it = m_disksMounted.begin();</string>
Toshihiro Shimizu 890ddd
	for (; it != m_disksMounted.end(); ++it) {
Toshihiro Shimizu 890ddd
		string drive = *it;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		DWORD res = WNetCancelConnection2(
Toshihiro Shimizu 890ddd
			drive.c_str(),			// resource name
Toshihiro Shimizu 890ddd
			CONNECT_UPDATE_PROFILE, // connection type
Toshihiro Shimizu 890ddd
			TRUE);					// unconditional disconnect option
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (res != NO_ERROR && res != ERROR_NOT_CONNECTED) {
Toshihiro Shimizu 890ddd
			string errorMessage("Unable to unmap ");
Toshihiro Shimizu 890ddd
			errorMessage += drive.c_str();
Toshihiro Shimizu 890ddd
			addToMessageLog(errorMessage);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_disksMounted.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
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
	bool console = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (argc > 1) {
Toshihiro Shimizu 890ddd
		string serviceName("ToonzFarmServer"); //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
}