summaryrefslogtreecommitdiff
path: root/src/session.cpp
blob: da7ebf64748ae29519132cb75f694cd2fa859400 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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;
}