summaryrefslogtreecommitdiff
path: root/src/session.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/session.cpp')
-rw-r--r--src/session.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/session.cpp b/src/session.cpp
new file mode 100644
index 0000000..da7ebf6
--- /dev/null
+++ b/src/session.cpp
@@ -0,0 +1,112 @@
+#include "session.hpp"
+#include <cmath>
+#include <ostream>
+#include <sys/socket.h>
+#include <print>
+#include <cerrno>
+#include <cstring>
+
+CSession::CSession(Hyprutils::OS::CFileDescriptor sockfd) : m_sockfd(std::move(sockfd)) {
+ if (!m_sockfd.isValid())
+ throw std::runtime_error("Failed to create socket");
+}
+
+CSession::~CSession() {
+ m_sockfd.reset();
+}
+
+void CSession::onConnect() const {
+ std::println("Client connected");
+}
+
+void CSession::onDisconnect() const {
+ std::println("Client disconnected");
+}
+
+void CSession::onErrno() const {
+ std::println("Error: {}", strerror(errno));
+}
+
+void CSession::onRecv(SRecvData &data) const {
+ std::println("Received: {}", data.data, data.dataSize);
+}
+
+void CSession::recvManager() {
+ while (true) {
+ CSession::SRecvData recvData = read();
+ if (!recvData.good) {
+ break;
+ }
+ }
+}
+
+CSession::SRecvData CSession::read() {
+ SRecvData recvData;
+ ssize_t dataSize = recv(m_sockfd.get(), recvData.data, recvData.dataSize, 0);
+ if (dataSize < 0) {
+ recvData.good = false;
+ onErrno();
+ }
+ if (dataSize == 0) {
+ recvData.good = false;
+ onDisconnect();
+ }
+ onRecv(recvData);
+ return recvData;
+}
+
+CSession::SRecvData CSession::read(std::string &msg) {
+ write(msg);
+ SRecvData recvData;
+ ssize_t dataSize = recv(m_sockfd.get(), recvData.data, recvData.dataSize, 0);
+
+ if (dataSize > 0) {
+ recvData.good = false;
+
+ if (dataSize < 0)
+ onErrno();
+
+ if (dataSize == 0)
+ onDisconnect();
+ }
+ onRecv(recvData);
+
+ return recvData;
+}
+
+void CSession::run() {
+ onConnect();
+ // std::jthread recvThread(&CSession::recvManager, this);
+ registerSession();
+ recvManager();
+}
+
+bool CSession::registerSession() {
+ SRecvData rervData = read((std::string&)"Name: ");
+ if (!rervData.good) {
+ return false;
+ }
+ m_name = rervData.data;
+
+ std::println("Client registered as: {}", m_name);
+
+ return true;
+}
+
+bool CSession::isValid() const {
+ return m_sockfd.isValid() && !m_name.empty();
+}
+
+bool CSession::write(const std::string &msg) const {
+ bool bad = false;
+ ssize_t bytes_sent = send(m_sockfd.get(), msg.c_str(), msg.size(), 0);
+ if (bytes_sent < 0) {
+ bad = true;
+ onErrno();
+ }
+ return bad;
+}
+
+std::string CSession::getName() const {
+ return m_name;
+}