#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; }