17 #ifndef LIB_WINSS_PIPE_SERVER_HPP_ 18 #define LIB_WINSS_PIPE_SERVER_HPP_ 24 #include "easylogging/easylogging++.hpp" 47 template<
typename TPipeInstance>
50 bool stopping =
false;
54 std::map<winss::HandleWrapper, TPipeInstance>
instances;
63 while (!stopping && !open) {
64 TPipeInstance instance;
65 if (instance.CreateNamedPipe(pipe_name)) {
67 instances.emplace(handle, std::move(instance));
73 VLOG(6) <<
"Pipe server clients: " << instances.size();
84 for (
auto it = instances.begin(); it != instances.end(); ++it) {
85 if (!it->second.IsConnected()) {
98 auto it = instances.find(handle);
99 if (it != instances.end()) {
102 if (!it->second.IsConnected()) {
103 VLOG(1) <<
"Pipe server client did not connect (closing)";
106 it->second.DisconnectNamedPipe();
109 VLOG(6) <<
"Pipe server clients: " << instances.size();
119 if (result ==
SKIP) {
123 if (it->second.SetConnected()) {
124 Connected(&it->second);
128 Triggered(&it->second);
131 VLOG(6) <<
"Pipe instance not found";
156 pipe_name(config.pipe_name), multiplexer(config.multiplexer) {
193 return instances.size();
203 for (
auto it = instances.begin(); it != instances.end(); ++it) {
204 it->second.DisconnectNamedPipe();
215 template<
typename TPipeInstance>
225 void Connected(TPipeInstance* instance) {
226 Send(instance, { 0 });
234 void Triggered(TPipeInstance* instance) {
235 if (instance->FinishWrite()) {
249 bool Send(TPipeInstance* instance,
const std::vector<char>& data) {
250 if (instance->Queue(data)) {
251 return instance->Write();
271 virtual bool Send(
const std::vector<char>& data) {
273 for (
auto it = instances.begin(); it != instances.end(); ++it) {
274 if (!Send(&it->second, data)) {
303 virtual bool Received(
const std::vector<char>& data) = 0;
314 template<
typename TPipeInstance>
317 std::vector<winss::NotOwningPtr<PipeServerReceiveListener>> listeners;
326 void Connected(TPipeInstance* instance) {
335 void Triggered(TPipeInstance* instance) {
336 if (instance->FinishRead()) {
346 void Notify(TPipeInstance* instance) {
347 std::vector<char> buff = instance->SwapBuffer();
350 auto it = listeners.begin();
351 while (it != listeners.end()) {
352 if ((*it)->Received(buff)) {
355 it = listeners.erase(it);
375 listeners.push_back(listener);
390 #endif // LIB_WINSS_PIPE_SERVER_HPP_ A wrapper for a Windows HANDLE.
Definition: handle_wrapper.hpp:39
InboundPipeServerTmpl(const PipeServerConfig &config)
Definition: pipe_server.hpp:362
virtual size_t InstanceCount() const
Gets the current instance count.
Definition: pipe_server.hpp:192
OverlappedResult
The result of the overlapped operation.
Definition: pipe_instance.hpp:30
A listener for server receiving data from pipe clients.
Definition: pipe_server.hpp:296
void StartClient()
Open a new named pipe for a new client to connect to.
Definition: pipe_server.hpp:62
virtual void AddListener(winss::NotOwningPtr< PipeServerReceiveListener > listener)
Add a listener to the pipe server for receive events.
Definition: pipe_server.hpp:373
winss::PipeName pipe_name
Definition: pipe_server.hpp:36
winss::NotOwningPtr< winss::WaitMultiplexer > multiplexer
The event multiplexer for the named pipe server.
Definition: pipe_server.hpp:56
virtual ~PipeServer()
Disconnect all clients and close all connections.
Definition: pipe_server.hpp:202
Pipe names are based on file system paths.
Definition: pipe_name.hpp:32
virtual void AddStopCallback(Callback callback)
Add a stop callback.
Definition: wait_multiplexer.cpp:60
An inbound pipe server.
Definition: pipe_server.hpp:315
Definition: case_ignore.hpp:23
virtual bool Send(const std::vector< char > &data)
Send the given data to all instances.
Definition: pipe_server.hpp:271
virtual void AddTriggeredCallback(const winss::HandleWrapper &handle, TriggeredCallback callback)
Add a triggered callback for when an event happens on the given handle.
Definition: wait_multiplexer.cpp:43
OutboundPipeServerTmpl< winss::OutboundPipeInstance > OutboundPipeServer
Concrete outbound pipe server implementation.
Definition: pipe_server.hpp:291
Config for a named pipe server.
Definition: pipe_server.hpp:35
Wait till next result.
Definition: pipe_instance.hpp:33
void Stop()
Stop the pipe server.
Definition: pipe_server.hpp:81
virtual void Triggered(TPipeInstance *instance)
Called when an event is triggered.
Definition: pipe_server.hpp:147
winss::NotOwningPtr< winss::WaitMultiplexer > multiplexer
Definition: pipe_server.hpp:37
std::map< winss::HandleWrapper, TPipeInstance > instances
A mapping of handles to instances.
Definition: pipe_server.hpp:54
InboundPipeServerTmpl< winss::InboundPipeInstance > InboundPipeServer
Concrete inbound pipe server implementation.
Definition: pipe_server.hpp:387
Base named pipe server.
Definition: pipe_server.hpp:48
A HANDLE wait multiplexer.
Definition: wait_multiplexer.hpp:70
winss::PipeName pipe_name
The name of the pipe.
Definition: pipe_server.hpp:57
virtual void AddInitCallback(Callback callback)
Add an initialization callback.
Definition: wait_multiplexer.cpp:37
An outbound pipe server.
Definition: pipe_server.hpp:216
virtual ~PipeServerReceiveListener()
Default destructor.
Definition: pipe_server.hpp:306
virtual bool IsStopping() const
Gets if the pipe server is stopping.
Definition: pipe_server.hpp:183
virtual void Connected(TPipeInstance *instance)
Called when a client is connected.
Definition: pipe_server.hpp:140
PipeServer(const PipeServerConfig &config)
Create a new pipe instance with the given config.
Definition: pipe_server.hpp:155
Close client.
Definition: pipe_instance.hpp:31
virtual bool IsAccepting() const
Gets if the pipe server is accepting a new connection.
Definition: pipe_server.hpp:174
void Triggered(const winss::HandleWrapper &handle)
The event handler for the pipe server.
Definition: pipe_server.hpp:97
OutboundPipeServerTmpl(const PipeServerConfig &config)
Definition: pipe_server.hpp:258