Blob Blame Raw
#pragma once

#ifndef TIPC_SERVER_H
#define TIPC_SERVER_H

//Toonz includes
#include "tcommon.h"

//STL includes
#include <map>

//Qt includes
#include <QString>
#include <QHash>
#include <QSharedMemory>
#include <QLocalServer>
#include <QLocalSocket>

#undef DVAPI
#undef DVVAR
#ifdef TNZCORE_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

namespace tipc
{

class MessageParser;

//*******************************************************************************
//    Server declaration
//*******************************************************************************

/*!
  The tipc::Server class is the base server class for inter-process communication
  in Toonz-related applications.

  A tipc::Server is a specialized QLocalServer which stores header/message-callback
  associations to perform message parsing.
*/

class DVAPI Server : public QLocalServer
{
	Q_OBJECT

	QHash<QString, MessageParser *> m_parsers;
	bool m_lock;

public:
	Server();
	~Server();

	void addParser(MessageParser *parser);
	void removeParser(QString header);

	//!Generic dispatcher function for socket messages.
	//!Acceptable socket messages are composed of a header and a body part.
	//!The header part, containing an explanation of the message's body, is
	//!the first line of the message, and is expected to be at max 1024 chars long.
	//!Depending on the header content, the rest of the message is read in
	//!specialized message handler functions.
	void dispatchSocket(QLocalSocket *socket);

public Q_SLOTS:

	//! Receives a client connection to the server and prepares a socket for the connection.
	void onNewConnection();
	void onError(QLocalSocket::LocalSocketError);
};

} //namespace tipc

#endif //TIPC_SERVER_H