Blob Blame Raw
#pragma once

#ifndef SERVICE_H
#define SERVICE_H

#include <memory>

class TFilePath;

#include <string>
#include <QString>

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

#ifdef TFARMAPI
#undef TFARMAPI
#endif

#ifdef _WIN32
#ifdef TFARM_EXPORTS
#define TFARMAPI __declspec(dllexport)
#else
#define TFARMAPI __declspec(dllimport)
#endif
#else
#define TFARMAPI
#endif

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

bool ReportStatusToSCMgr(long currentState,
						 long win32ExitCode,
						 long WaitHint);

void AddToMessageLog(char *msg);

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

TFARMAPI std::string getLastErrorText();

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

class TFARMAPI TService
{
public:
	TService(const std::string &name, const std::string &displayName);
	virtual ~TService();

	static TService *instance();

	enum Status {
		Stopped = 1,
		StartPending,
		StopPending,
		Running,
		ContinuePending,
		PausePending,
		Paused
	};

	void setStatus(Status status, long exitCode, long waitHint);

	std::string getName() const;
	std::string getDisplayName() const;

	void run(int argc, char *argv[], bool console = false);

	virtual void onStart(int argc, char *argv[]) = 0;
	virtual void onStop() = 0;

	bool isRunningAsConsoleApp() const;

	static void start(const std::string &name);
	static void stop(const std::string &name);

	static void install(
		const std::string &name,
		const std::string &displayName,
		const TFilePath &appPath);

	static void remove(const std::string &name);

	static void addToMessageLog(const std::string &msg);
	static void addToMessageLog(const QString &msg);

private:
	class Imp;
	std::unique_ptr<Imp> m_imp;

	static TService *m_instance;
};

#endif