Blob Blame Raw


#include "application.h"
#include "tfarmcontroller.h"
#include "ttcpip.h"
#include "tfilepath.h"
#include "tsystem.h"
#include "tthread.h"
#include "tenv.h"
#include "tconvert.h"
#include "tfilepath_io.h"
#include <vector>
#include <set>
#include <assert.h>
#include <fstream>
using namespace std;

//===================================================================

namespace
{

TFilePath getGlobalRoot()
{
#ifdef WIN32
	TFilePath groot(TSystem::getSystemValue(
		TFilePath("SOFTWARE\\Digital Video\\ToonzFarm\\1.0\\GLOBALROOT")));

	return groot;
#else
	TFilePath name = "TFARMGLOBALROOT";
	char *s = getenv(name.getFullPath().c_str());
	TFilePath rootDir = string(s ? s : "");
	return rootDir;
#endif
}
};

class Application::Imp
{
public:
	Imp() : m_farmController(0) {}
	~Imp() {}

	void loadControllerData();

	TFarmController *m_farmController;
	TFilePath m_currentFolder;

	ControllerData m_controllerData;
};

//------------------------------------------------------------------------------

void Application::Imp::loadControllerData()
{
	TFilePath groot = getGlobalRoot();
	TFilePath fp = groot + "config" + "controller.txt";

	::loadControllerData(fp, m_controllerData);
}

//===================================================================

namespace
{

//===================================================================

Application *theApp;
bool programEnded = false;

class Cleanup
{
public:
	~Cleanup()
	{
		delete theApp;
		theApp = 0;
		programEnded = true;
	}
} cleanup;

//===================================================================

} // end of anonymous namespace

//===================================================================

Application::Application() : m_imp(new Imp)
{
}

//------------------------------------------------------------------------------

Application::~Application()
{
	delete m_imp;
}

//------------------------------------------------------------------------------

Application *Application::instance()
{
	assert(!programEnded);
	if (!theApp) {
		static TThread::Mutex AppMutex;
		TThread::ScopedLock sl(AppMutex);
		if (programEnded)
			return 0;

		if (!theApp)
			theApp = new Application;
	}
	return theApp;
}

//------------------------------------------------------------------------------

TFarmController *Application::getController()
{
	return m_imp->m_farmController;
}

//------------------------------------------------------------------------------

bool Application::testControllerConnection() const
{
	TTcpIpClient client;

	int sock;
	int ret = client.connect(m_imp->m_controllerData.m_hostName,
							 m_imp->m_controllerData.m_ipAddress,
							 m_imp->m_controllerData.m_port,
							 sock);
	if (ret == OK) {
		client.disconnect(sock);
		return true;
	}
	return false;
}

//------------------------------------------------------------------------------

void Application::getControllerData(string &hostName, string &ipAddr, int &port) const
{
	hostName = m_imp->m_controllerData.m_hostName;
	ipAddr = m_imp->m_controllerData.m_ipAddress;
	port = m_imp->m_controllerData.m_port;
}

//------------------------------------------------------------------------------

void Application::init()
{
	m_imp->loadControllerData();

	TFarmControllerFactory factory;
	int ret = factory.create(m_imp->m_controllerData, &m_imp->m_farmController);
}

//------------------------------------------------------------------------------

void Application::setCurrentFolder(const TFilePath &fp)
{
	m_imp->m_currentFolder = fp;
}

//------------------------------------------------------------------------------

TFilePath Application::getCurrentFolder()
{
	return m_imp->m_currentFolder;
}