From a0d9d9c6decbc7b7484cc1d00cb8e6cfd99d67be Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Tue, 3 Feb 2026 17:04:20 +0100 Subject: [PATCH] Started work on the server, continuing client to be able to test --- server/CMakeLists.txt | 5 +++++ server/inc/.gitempty | 0 server/inc/logic/.gitempty | 0 server/inc/logic/reactor.h | 33 +++++++++++++++++++++++++++++++++ server/inc/logic/service.h | 20 ++++++++++++++++++++ server/inc/models/.gitempty | 0 server/inc/ui/.gitempty | 0 server/lib/.gitempty | 0 server/main.cpp | 14 +++++++++++++- server/src/.gitempty | 0 server/src/logic/.gitempty | 0 server/src/logic/reactor.cpp | 20 ++++++++++++++++++++ server/src/logic/service.cpp | 21 +++++++++++++++++++++ server/src/models/.gitempty | 0 server/src/ui/.gitempty | 0 15 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 server/inc/.gitempty create mode 100644 server/inc/logic/.gitempty create mode 100644 server/inc/logic/reactor.h create mode 100644 server/inc/logic/service.h create mode 100644 server/inc/models/.gitempty create mode 100644 server/inc/ui/.gitempty create mode 100644 server/lib/.gitempty create mode 100644 server/src/.gitempty create mode 100644 server/src/logic/.gitempty create mode 100644 server/src/logic/reactor.cpp create mode 100644 server/src/logic/service.cpp create mode 100644 server/src/models/.gitempty create mode 100644 server/src/ui/.gitempty diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index da2f237..acd7d5e 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -8,6 +8,11 @@ add_executable(chat_server ${SOURCES} ) +target_include_directories(chat_server + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/inc +) + target_link_libraries(chat_server PRIVATE proto_static diff --git a/server/inc/.gitempty b/server/inc/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/inc/logic/.gitempty b/server/inc/logic/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/inc/logic/reactor.h b/server/inc/logic/reactor.h new file mode 100644 index 0000000..a3ea31d --- /dev/null +++ b/server/inc/logic/reactor.h @@ -0,0 +1,33 @@ +#pragma once + +#include "messages.pb.h" +#include +#include +#include +#include + +class Service; + +class ChatReactor + : public grpc::ServerBidiReactor { +public: + ChatReactor(Service *service, absl::Mutex *mu, + std::vector *msgs); + + void OnReadDone(bool ok) override; + void OnWriteDone(bool /*ok*/) override { StartRead(&m_msg); } + + void OnDone() override { + std::cout << "RPC Completed"; + delete this; + } + + void OnCancel() override { std::cout << "RPC Cancelled"; } + +private: + Service *m_service; + chat::chatMsg m_msg; + + absl::Mutex *m_mu; + std::vector *m_messages ABSL_GUARDED_BY(m_mu); +}; diff --git a/server/inc/logic/service.h b/server/inc/logic/service.h new file mode 100644 index 0000000..ee5bdec --- /dev/null +++ b/server/inc/logic/service.h @@ -0,0 +1,20 @@ +#pragma once + +#include "logic/reactor.h" +#include "messages.pb.h" +#include "services.grpc.pb.h" +#include +#include + +class Service : public chat::Chat::CallbackService { +public: + ~Service(); + grpc::ServerBidiReactor * + sendMsg(grpc::CallbackServerContext *context) override; + void sendToAll(const chat::chatMsg &msg); + +private: + std::vector m_clients; + absl::Mutex m_mu; + std::vector m_messages ABSL_GUARDED_BY(m_mu); +}; diff --git a/server/inc/models/.gitempty b/server/inc/models/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/inc/ui/.gitempty b/server/inc/ui/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/lib/.gitempty b/server/lib/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/main.cpp b/server/main.cpp index 72c4403..15917ed 100644 --- a/server/main.cpp +++ b/server/main.cpp @@ -1,2 +1,14 @@ +#include "logic/service.h" +#include -int main(int argc, char *argv[]) { return 0; } +int main(int argc, char *argv[]) { + Service service; + std::string server_address = "0.0.0.0:50051"; + grpc::ServerBuilder builder; + builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); + builder.RegisterService(&service); + std::unique_ptr server(builder.BuildAndStart()); + std::cout << "Server listening on " << server_address << std::endl; + server->Wait(); + return 0; +} diff --git a/server/src/.gitempty b/server/src/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/src/logic/.gitempty b/server/src/logic/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/src/logic/reactor.cpp b/server/src/logic/reactor.cpp new file mode 100644 index 0000000..ed28b96 --- /dev/null +++ b/server/src/logic/reactor.cpp @@ -0,0 +1,20 @@ +#include "logic/reactor.h" +#include "logic/service.h" + +ChatReactor::ChatReactor(Service *service, absl::Mutex *mu, + std::vector *msgs) + : m_service(service), m_mu(mu), m_messages(msgs) { + StartRead(&m_msg); +} + +void ChatReactor::OnReadDone(bool ok) { + if (ok) { + m_mu->lock(); + m_messages->push_back(m_msg); + m_mu->unlock(); + m_service->sendToAll(m_msg); + StartRead(&m_msg); + } else { + Finish(grpc::Status::OK); + } +} diff --git a/server/src/logic/service.cpp b/server/src/logic/service.cpp new file mode 100644 index 0000000..8dd51cb --- /dev/null +++ b/server/src/logic/service.cpp @@ -0,0 +1,21 @@ +#include "logic/service.h" +#include "logic/reactor.h" + +Service::~Service() { + for (auto *client : m_clients) { + delete client; + } +} + +grpc::ServerBidiReactor * +Service::sendMsg(grpc::CallbackServerContext *context) { + auto newClient = new ChatReactor(this, &m_mu, &m_messages); + m_clients.push_back(newClient); + return newClient; +} + +void Service::sendToAll(const chat::chatMsg &msg) { + for (auto *client : m_clients) { + client->StartWrite(&msg); + } +} diff --git a/server/src/models/.gitempty b/server/src/models/.gitempty new file mode 100644 index 0000000..e69de29 diff --git a/server/src/ui/.gitempty b/server/src/ui/.gitempty new file mode 100644 index 0000000..e69de29