Blob Blame Raw


#include "serverstatuspage.h"
#include "tfarmcontroller.h"
#include "application.h"
#include "textlist.h"
#include "tw/mainshell.h"
#include "tw/textfield.h"
#include "tw/event.h"

#include "tw/message.h"

#include <vector>
#include <set>
using namespace std;

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

class ServerList : public TTextList
{
public:
	ServerList(TWidget *parent);

	void rightButtonDown(const TMouseEvent &e);

	void onDeactivate();
	void onActivate();

	TPopupMenuItem *m_activationItem;
	TPopupMenu *m_popupMenu;
};

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

ServerList::ServerList(TWidget *parent)
	: TTextList(parent, "servers")
{
	m_popupMenu = new TPopupMenu(this);

	TPopupMenuItem *item = new TPopupMenuItem(m_popupMenu, "deactivate");
	TGuiCommand("deactivate").setAction(new TCommandAction<ServerList>(this, onDeactivate));
	TGuiCommand("deactivate").add(item);

	item = new TPopupMenuItem(m_popupMenu, "activate");
	TGuiCommand("activate").setAction(new TCommandAction<ServerList>(this, onActivate));
	TGuiCommand("activate").add(item);
}

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

void ServerList::rightButtonDown(const TMouseEvent &e)
{
	leftButtonDown(e);
	TTextListItem *item = getSelectedItem(0);
	if (item) {
		TFarmController *controller = Application::instance()->getController();
		ServerState state;
		try {
			state = controller->queryServerState2(item->getId());
		} catch (TException &e) {
			TMessage::error(toString(e.getMessage()));
			return;
		}

		if (state != Offline) {
			TGuiCommand("activate").disable();
			TGuiCommand("deactivate").enable();
		} else {
			TGuiCommand("activate").enable();
			TGuiCommand("deactivate").disable();
		}

		TPoint pos = getAbsolutePosition() + TPoint(e.m_pos.x, getSize().ly - e.m_pos.y);
		m_popupMenu->popup(pos);
	}
}

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

void ServerList::onDeactivate()
{
	TTextListItem *item = getSelectedItem(0);
	if (item) {
		TFarmController *controller = Application::instance()->getController();
		try {
			controller->deactivateServer(item->getId());
		} catch (TException &e) {
			TMessage::error(toString(e.getMessage()));
		}
	}
}

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

void ServerList::onActivate()
{
	TTextListItem *item = getSelectedItem(0);
	if (item) {
		TFarmController *controller = Application::instance()->getController();
		try {
			controller->activateServer(item->getId());
		} catch (TException &e) {
			TMessage::error(toString(e.getMessage()));
		}
	}
}

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

class ServerStatusPage::Data
{
public:
	Data(ServerStatusPage *parent)
	{
		m_serverList = new ServerList(parent);
		m_serverList->setSelAction(new TTextListAction<Data>(
			this, &Data::onServerSelection));
		m_name = new TTextField(parent, "name");
		m_ipAddress = new TTextField(parent, "ipAddress");
		m_portNumber = new TTextField(parent, "portNumber");
		m_tasks = new TTextField(parent, "tasks");
		m_state = new TTextField(parent, "state");
		m_cpuCount = new TTextField(parent, "cpuCount");
		m_totPhysMem = new TTextField(parent, "totalPhysMemory");

		m_nameLbl = new TLabel(parent, "name");
		m_ipAddressLbl = new TLabel(parent, "ipAddress");
		m_portNumberLbl = new TLabel(parent, "portNumber");
		m_tasksLbl = new TLabel(parent, "tasks");
		m_stateLbl = new TLabel(parent, "state");
		m_cpuCountLbl = new TLabel(parent, "cpuCount");
		m_totPhysMemLbl = new TLabel(parent, "totalPhysMemory");
	}
	~Data() {}

	void onServerSelection(int index)
	{
		TTextListItem *item = m_serverList->getSelectedItem(0);
		if (item) {
			showServerInfo(item->getId());
		}
	}

	void showServerInfo(const string &id)
	{
		TFarmController *controller = Application::instance()->getController();
		ServerInfo info;

		try {
			controller->queryServerInfo(id, info);
		} catch (TException &e) {
			TMessage::error(toString(e.getMessage()));
		}

		switch (info.m_state) {
		case Ready:
			m_state->setText("Ready");
			break;
		case Busy:
			m_state->setText("Busy");
			break;
		case NotResponding:
			m_state->setText("Not Responding");
			break;
		case Down:
			m_state->setText("Down");
			break;
		case Offline:
			m_state->setText("Offline");
			break;
		case ServerUnknown:
			m_state->setText("");
			m_name->setText("");
			m_ipAddress->setText("");
			m_portNumber->setText("");
			m_tasks->setText("");
			m_cpuCount->setText("");
			m_totPhysMem->setText("");
			return;
		}

		m_name->setText(info.m_name);
		m_ipAddress->setText(info.m_ipAddress);
		m_portNumber->setText(info.m_portNumber);
		if (info.m_currentTaskId == "")
			m_tasks->setText("");
		else {
			TFarmTask task;
			try {
				controller->queryTaskInfo(info.m_currentTaskId, task);
				m_tasks->setText("<" + task.m_id + "> " + task.m_name);
			} catch (TException &e) {
				m_tasks->setText("");
				TMessage::error(toString(e.getMessage()));
			}
		}

		if (info.m_state != Down) {
			m_cpuCount->setText(toString(info.m_cpuCount));
			m_totPhysMem->setText(toString((long)info.m_totPhysMem));
		} else {
			m_cpuCount->setText("");
			m_totPhysMem->setText("");
		}
	}

	void addServer(const ServerIdentity &sid)
	{
		m_serverList->addItem(new TTextListItem(sid.m_id, sid.m_name));
	}

	void configureNotify(const TDimension &size)
	{
		const int dx = 10;
		const int dy = 5;
		const int h = 20;
		const int lw = 120;
		const int leftSize = tmin(250, size.lx / 3);

		const int w = size.lx - leftSize - lw - dx * 3;
		int left = leftSize + dx;
		int y0 = size.ly - 30;
		int x0;

		//prima la parte a sx
		m_serverList->setGeometry(0, 0, leftSize /*100*/, size.ly - 1);

		// ora la parte a dx
		x0 = left;
		m_nameLbl->setGeometry(x0, y0, x0 + lw, y0 + h);
		x0 += lw + dx;
		m_name->setGeometry(x0, y0, x0 + w, y0 + h);

		x0 = left;
		y0 -= h + dy;
		m_ipAddressLbl->setGeometry(x0, y0, x0 + lw, y0 + h);
		x0 += lw + dx;
		m_ipAddress->setGeometry(x0, y0, x0 + w, y0 + h);

		x0 = left;
		y0 -= h + dy;
		m_portNumberLbl->setGeometry(x0, y0, x0 + lw, y0 + h);
		x0 += lw + dx;
		m_portNumber->setGeometry(x0, y0, x0 + w, y0 + h);

		x0 = left;
		y0 -= h + dy;
		m_tasksLbl->setGeometry(x0, y0, x0 + lw, y0 + h);
		x0 += lw + dx;
		m_tasks->setGeometry(x0, y0, x0 + w, y0 + h);

		x0 = left;
		y0 -= h + dy;
		m_stateLbl->setGeometry(x0, y0, x0 + lw, y0 + h);
		x0 += lw + dx;
		m_state->setGeometry(x0, y0, x0 + w, y0 + h);

		x0 = left;
		y0 -= h + dy;
		m_cpuCountLbl->setGeometry(x0, y0, x0 + lw, y0 + h);
		x0 += lw + dx;
		m_cpuCount->setGeometry(x0, y0, x0 + w, y0 + h);

		x0 = left;
		y0 -= h + dy;
		m_totPhysMemLbl->setGeometry(x0, y0, x0 + lw, y0 + h);
		x0 += lw + dx;
		m_totPhysMem->setGeometry(x0, y0, x0 + w, y0 + h);
	}

	TTextList *m_serverList;

	TTextField *m_name, *m_ipAddress, *m_portNumber, *m_tasks,
		*m_state, *m_cpuCount, *m_totPhysMem;

	TLabel *m_nameLbl, *m_ipAddressLbl, *m_portNumberLbl, *m_tasksLbl,
		*m_stateLbl, *m_cpuCountLbl, *m_totPhysMemLbl;
};

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

void ServerStatusPage::onActivate()
{
	TFarmController *controller = Application::instance()->getController();
	try {
		vector<ServerIdentity> servers;
		controller->getServers(servers);
		vector<ServerIdentity>::iterator it = servers.begin();
		for (; it != servers.end(); ++it)
			m_data->addServer(*it);
	} catch (TException &e) {
		TMessage::error(toString(e.getMessage()));
	}
}

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

void ServerStatusPage::onDeactivate()
{
}

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

ServerStatusPage::ServerStatusPage(TWidget *parent)
	: TabPage(parent, "Servers")
{
	m_data = new Data(this);
}

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

ServerStatusPage::~ServerStatusPage()
{
}

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

void ServerStatusPage::configureNotify(const TDimension &size)
{
	m_data->configureNotify(size);
}

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

void ServerStatusPage::update()
{
	TFarmController *controller = Application::instance()->getController();
	vector<ServerIdentity> servers;
	try {
		controller->getServers(servers);
	} catch (TException &e) {
		TMessage::error(toString(e.getMessage()));
		return;
	}

	vector<ServerIdentity>::iterator it = servers.begin();
	vector<ServerIdentity> newServers;
	std::set<int> oldServers;
	TTextList *sl = m_data->m_serverList;
	for (; it != servers.end(); ++it) {
		int index;
		if ((index = sl->itemToIndex(it->m_id)) == -1)
			newServers.push_back(*it);
		else
			oldServers.insert(index);
	}
	int i = 0, count = sl->getItemCount();
	for (; i < count; ++i)
		if (oldServers.find(i) == oldServers.end()) {
			string itemId = sl->getItem(i)->getId();
			/*      
      if(sl->isSelected(itemId))
        sl->select((i+1)%sl->getItemCount(), true);
        */
			sl->removeItem(itemId);
		}
	it = newServers.begin();
	for (; it != newServers.end(); it++)
		sl->addItem(new TTextListItem(it->m_id, it->m_name));

	TTextListItem *item = m_data->m_serverList->getSelectedItem(0);
	if (item)
		m_data->showServerInfo(item->getId());
	invalidate();
}