#ifndef OpenTestSystem_OtxDiagManager_Client_ClientFactory_H
#define OpenTestSystem_OtxDiagManager_Client_ClientFactory_H

#include "ClientDefs.h"
#include "TypeDefs.h"
#include <string>
#include <memory>

namespace OpenTestSystem { namespace OtxDiagManager { namespace Common {
	class ICommandProcessor;
}}}

namespace OpenTestSystem
{
	namespace OtxDiagManager
	{
		namespace Client
		{
			class Client;
			class ClientFactory
			{
			public:
				CLIENT_EXPORTS ClientFactory();
				CLIENT_EXPORTS ~ClientFactory();
				CLIENT_EXPORTS std::shared_ptr<Client> CreateSocketClient(unsigned short port);
				CLIENT_EXPORTS std::shared_ptr<Client> CreatePipeClient(const std::string & pipeName);
				CLIENT_EXPORTS std::shared_ptr<Client> CreateRawClient(OpenTestSystem::OtxDiagManager::Common::ICommandProcessor * commandProcessor);
				CLIENT_EXPORTS std::shared_ptr<Client> CreateSocketClient(const std::string & clientName, unsigned short port);
				CLIENT_EXPORTS std::shared_ptr<Client> CreatePipeClient(const std::string & clientName, const std::string & pipeName);
				CLIENT_EXPORTS std::shared_ptr<Client> CreateRawClient(const std::string & clientName, OpenTestSystem::OtxDiagManager::Common::ICommandProcessor * commandProcessor);
			private:
				class impl; 
				std::unique_ptr<impl> pimpl;
			};
		}
	}
}

#endif // OpenTestSystem_OtxDiagManager_Client_ClientFactory_H
