/*! \file pisingleapplication.h
 * \ingroup System
 * \~\brief
 * \~english Single-instance application control
 * \~russian Контроль одного экземпляра приложения
 */
/*
	PIP - Platform Independent Primitives
	Single application
	Ivan Pelipenko peri4ko@yandex.ru

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU Lesser General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef PISINGLEAPPLICATION_H
#define PISINGLEAPPLICATION_H

#include "pithread.h"

class PISharedMemory;

//! \ingroup System
//! \~\brief
//! \~english Single-instance application control.
//! \~russian Контроль одного экземпляра приложения.
class PIP_EXPORT PISingleApplication: public PIThread {
	PIOBJECT_SUBCLASS(PISingleApplication, PIThread);
public:

	//! \~english Construct %PISingleApplication with name "app_name"
	//! \~russian Создает %PISingleApplication с именем "app_name"
	PISingleApplication(const PIString & app_name = PIString());

	~PISingleApplication();


	//! \~english Returns if this application instance is launched first
	//! \~russian Возвращает первым ли был запущен этот экземпляр приложения
	bool isFirst() const;

	EVENT_HANDLER1(void, sendMessage, const PIByteArray &, m);
	EVENT1(messageReceived, PIByteArray, m);

//! \handlers
//! \{

	//! \fn void sendMessage(const PIByteArray & m)
	//! \brief
	//! \~english Send message "m" to first launched application
	//! \~russian Посылает сообщение "m" первому запущеному приложению

//! \}
//! \events
//! \{

	//! \fn void messageReceived(PIByteArray m)
	//! \brief
	//! \~english Raise on first launched application receive message from another
	//! \~russian Вызывается первым запущеным приложением по приему сообщения от других

//! \}

private:
	void begin() override;
	void run() override;
	void waitFirst() const;

	PISharedMemory * shm;
	PITimeMeasurer ftm;
	PIByteArray readed;
	bool first, started;
	int sacnt;

};

#endif // PISINGLEAPPLICATION_H
