Files
2026-03-25 14:14:07 +01:00

82 lines
2.1 KiB
C++

// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2025 Niels Martignène <niels.martignene@protonmail.com>
#pragma once
#include "lib/native/base/base.hh"
#include "lib/native/wrap/json.hh"
namespace K {
static const int MaxTowerSources = 10;
class TowerServer {
#if defined(_WIN32)
char name[512] = {};
LocalArray<struct OverlappedPipe *, MaxTowerSources> pipes;
#else
int fd = -1;
#endif
LocalArray<WaitSource, MaxTowerSources> sources;
std::function<bool(StreamReader *, StreamWriter *)> handle_func;
public:
TowerServer() {}
~TowerServer() { Stop(); }
bool Bind(const char *path);
void Start(std::function<bool(StreamReader *, StreamWriter *)> func);
void Stop();
Span<const WaitSource> GetWaitSources() const { return sources; }
bool Process(uint64_t ready = UINT64_MAX);
void Send(FunctionRef<void(StreamWriter *)> func);
void Send(Span<const uint8_t> buf) { Send([&](StreamWriter *writer) { writer->Write(buf); }); }
void Send(Span<const char> buf) { Send([&](StreamWriter *writer) { writer->Write(buf); }); }
private:
#if defined(_WIN32)
void RunClients(FunctionRef<bool(Size, struct OverlappedPipe *)> func);
#else
void RunClients(FunctionRef<bool(Size, int)> func);
#endif
};
class TowerClient {
#if defined(_WIN32)
struct OverlappedPipe *pipe = nullptr;
#else
int sock = -1;
#endif
std::function<void(StreamReader *)> handle_func;
WaitSource src = {};
public:
~TowerClient() { Stop(); }
bool Connect(const char *path);
void Start(std::function<void(StreamReader *)> func);
void Stop();
WaitSource GetWaitSource() const { return src; }
bool Process();
bool Send(FunctionRef<void(StreamWriter *)> func);
bool Send(Span<const uint8_t> buf) { return Send([&](StreamWriter *writer) { writer->Write(buf); }); }
bool Send(Span<const char> buf) { return Send([&](StreamWriter *writer) { writer->Write(buf); }); }
};
enum class ControlScope {
System,
User
};
const char *GetControlSocketPath(ControlScope scope, const char *name, Allocator *alloc);
}