Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tmsgcore.h"
Toshihiro Shimizu 890ddd
#include <qlocalserver.h></qlocalserver.h>
Toshihiro Shimizu 890ddd
#include <qlocalsocket.h></qlocalsocket.h>
Toshihiro Shimizu 890ddd
#include <qstringlist></qstringlist>
Toshihiro Shimizu 890ddd
#include <qcoreapplication></qcoreapplication>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qtcpserver></qtcpserver>
Toshihiro Shimizu 890ddd
#include <qtcpsocket></qtcpsocket>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMsgCore *TMsgCore::instance()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static TMsgCore *theInstance = 0;
Toshihiro Shimizu 890ddd
	if (!theInstance)
Toshihiro Shimizu 890ddd
		theInstance = new TMsgCore();
Toshihiro Shimizu 890ddd
	return theInstance;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMsgCore::TMsgCore()
Toshihiro Shimizu 890ddd
	: m_tcpServer(0), m_clientSocket(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMsgCore::OnNewConnection() //server side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QTcpSocket *socket;
Toshihiro Shimizu 890ddd
	if (m_tcpServer)
Toshihiro Shimizu 890ddd
		socket = m_tcpServer->nextPendingConnection();
Toshihiro Shimizu 890ddd
	assert(socket);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = connect(socket, SIGNAL(readyRead()), SLOT(OnReadyRead()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(socket, SIGNAL(disconnected()), SLOT(OnDisconnected()));
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
	m_sockets.insert(socket);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define TMSG_PORT 10545
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TMsgCore::openConnection() //server side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//QHostAddress host = (remoteConnection) ? QHostAddress::AnyQHostAddress::LocalHost : ;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_tcpServer != 0 && m_tcpServer->serverAddress() == QHostAddress::Any)
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	if (m_tcpServer != 0)
Toshihiro Shimizu 890ddd
		delete m_tcpServer;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_tcpServer = new QTcpServer();
Toshihiro Shimizu 890ddd
	bool ret = connect(m_tcpServer, SIGNAL(newConnection()), SLOT(OnNewConnection()));
Toshihiro Shimizu 890ddd
	//bool listen = m_tcpServer->listen(QString("tmsg")+QString::number(QCoreApplication::applicationPid()));
Toshihiro Shimizu 890ddd
	bool listen = m_tcpServer->listen(QHostAddress::Any, TMSG_PORT); //QString("tmsg")+QString::number(QCoreApplication::applicationPid()));
Toshihiro Shimizu 890ddd
	if (!listen) {
Toshihiro Shimizu 890ddd
		QString err = m_tcpServer->errorString();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(ret && listen);
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TMsgCore::getConnectionName() //server side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_tcpServer);
Toshihiro Shimizu 890ddd
	QString serverName = "pippo"; //m_tcpServer->serverName();
Toshihiro Shimizu 890ddd
	return serverName;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMsgCore::OnDisconnected() //server side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	std::set<qtcpsocket *="">::iterator it = m_sockets.begin();</qtcpsocket>
Toshihiro Shimizu 890ddd
	while (it != m_sockets.end()) {
Toshihiro Shimizu 890ddd
		if ((*it)->state() != QTcpSocket::ConnectedState)
Toshihiro Shimizu 890ddd
			m_sockets.erase(it++);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			it++;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//if (m_socketIn)
Toshihiro Shimizu 890ddd
	//delete m_socketIn;
Toshihiro Shimizu 890ddd
	//m_socketIn = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMsgCore::OnReadyRead() //server side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	std::set<qtcpsocket *="">::iterator it = m_sockets.begin();</qtcpsocket>
Toshihiro Shimizu 890ddd
	for (; it != m_sockets.end(); it++) //devo scorrerli tutti perche' non so da quale socket viene il messaggio...
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if ((*it)->state() == QTcpSocket::ConnectedState && (*it)->bytesAvailable() > 0)
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (it != m_sockets.end()) {
Toshihiro Shimizu 890ddd
		readFromSocket(*it);
Toshihiro Shimizu 890ddd
		OnReadyRead();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMsgCore::readFromSocket(QTcpSocket *socket) //server side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static char data[1024];
Toshihiro Shimizu 890ddd
	static QString prevMessage;
Toshihiro Shimizu 890ddd
	QString str;
Toshihiro Shimizu 890ddd
	int byteread;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while ((byteread = socket->read(data, 1023)) != 0) {
Toshihiro Shimizu 890ddd
		data[byteread] = '\0';
Toshihiro Shimizu 890ddd
		str += QString(data);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	QString message = prevMessage + str;
Toshihiro Shimizu 890ddd
	prevMessage = QString();
Toshihiro Shimizu 890ddd
	if (message.isEmpty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int lastEnd = message.lastIndexOf("#END");
Toshihiro Shimizu 890ddd
	int lastbegin = message.lastIndexOf("#TMSG");
Toshihiro Shimizu 890ddd
	if (lastbegin == -1 && lastEnd == -1) {
Toshihiro Shimizu 890ddd
		prevMessage = message;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	} else if (lastbegin != -1 && lastEnd != -1 && lastEnd < lastbegin) {
Toshihiro Shimizu 890ddd
		prevMessage = message.right(message.size() - lastbegin);
Toshihiro Shimizu 890ddd
		message.chop(lastbegin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QStringList messages = message.split("#TMSG", QString::SkipEmptyParts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < messages.size(); i++) {
Toshihiro Shimizu 890ddd
		QString str = messages.at(i).simplified();
Toshihiro Shimizu 890ddd
		str.chop(4); //rimuovo i "#END" alla fine
Toshihiro Shimizu 890ddd
		if (str.startsWith("ERROR"))
Shinya Kitaoka eabf18
			DVGui::error(str.right(str.size() - 5));
Toshihiro Shimizu 890ddd
		else if (str.startsWith("WARNING"))
Shinya Kitaoka eabf18
			DVGui::warning(str.right(str.size() - 7));
Toshihiro Shimizu 890ddd
		else if (str.startsWith("INFO"))
Shinya Kitaoka eabf18
			DVGui::info(str.right(str.size() - 4));
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMsgCore::~TMsgCore()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_tcpServer == 0 && m_clientSocket != 0) //client side
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		//m_socketIn->waitForBytesWritten (-1);
Toshihiro Shimizu 890ddd
		//   m_clientSocket->disconnectFromServer();
Toshihiro Shimizu 890ddd
		// m_clientSocket->waitForDisconnected();
Toshihiro Shimizu 890ddd
		delete m_clientSocket;
Toshihiro Shimizu 890ddd
		m_clientSocket = 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka bb1d04
bool TMsgCore::send(DVGui::MsgType type, const QString &message) //client side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (receivers(SIGNAL(sendMessage(int, const QString &))) == 0) {
Toshihiro Shimizu 890ddd
		if (m_clientSocket == 0 || m_clientSocket->state() != QTcpSocket::ConnectedState)
Toshihiro Shimizu 890ddd
			return false;
Toshihiro Shimizu 890ddd
Shinya Kitaoka bb1d04
		QString socketMessage = (type == DVGui::CRITICAL ? "#TMSG ERROR " : (type == DVGui::WARNING ? "#TMSG WARNING " : "#TMSG INFO ")) + message + " #END\n";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050000
Toshihiro Shimizu 890ddd
		m_clientSocket->write(socketMessage.toLatin1());
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		m_clientSocket->write(socketMessage.toAscii());
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		m_clientSocket->flush();
Toshihiro Shimizu 890ddd
		//m_clientSocket->waitForBytesWritten (1000);
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		Q_EMIT sendMessage(type, message);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMsgCore::connectTo(const QString &address) //client side
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_clientSocket = new QTcpSocket();
Toshihiro Shimizu 890ddd
	m_clientSocket->connectToHost(address == "" ? QHostAddress::LocalHost : QHostAddress(address), TMSG_PORT);
Toshihiro Shimizu 890ddd
	//m_clientSocket->connectToServer (connectionName, QIODevice::ReadWrite | QIODevice::Text);
Toshihiro Shimizu 890ddd
	bool ret = m_clientSocket->waitForConnected(1000);
Toshihiro Shimizu 890ddd
	if (!ret) {
Toshihiro Shimizu 890ddd
		// std::cout << "cannot connect to "<< address.toStdString() << std::endl;
Toshihiro Shimizu 890ddd
		//std::cout << "error "<< m_clientSocket->errorString().toStdString() << std::endl;
Toshihiro Shimizu 890ddd
		int err = m_clientSocket->error();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVGui::MsgBox(MsgType type, const QString &text)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TMsgCore::instance()->send(type, text);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVGui::error(const QString &msg)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka eabf18
	DVGui::MsgBox(DVGui::CRITICAL, msg);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVGui::warning(const QString &msg)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka eabf18
	DVGui::MsgBox(DVGui::WARNING, msg);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVGui::info(const QString &msg)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka eabf18
	DVGui::MsgBox(DVGui::INFORMATION, msg);
Toshihiro Shimizu 890ddd
}