Babel
Epitech's C++ VoIP project
BabelServer.hpp
Go to the documentation of this file.
1 //
2 // Created by cbihan on 05/10/2021.
3 //
4 
5 #pragma once
6 
7 #include "AsioTCPServer.hpp"
8 #include "AsioTCPConnection.hpp"
9 #include "Network/Message.hpp"
10 #include "Network/RFCCodes.hpp"
11 #include "Utilities/FreeList.hpp"
12 #include "User.hpp"
13 #include <array>
14 #include <functional>
15 #include "Call.hpp"
16 #include <iostream>
17 #include <algorithm>
18 #include <string>
19 #include <map>
20 #include <iomanip>
21 #include <sstream>
22 #include <utility>
23 
24 namespace Babel
25 {
27  class BabelServer : public AsioTCPServer<RFCCodes>
28  {
29  public:
30 
32  void onMessage(std::shared_ptr<ITCPConnection<RFCCodes>> client, Message<RFCCodes> &msg) override;
33 
36  bool onClientConnect(std::shared_ptr<ITCPConnection<RFCCodes>> client) override;
37 
39  void onClientDisconnect(std::shared_ptr<ITCPConnection<RFCCodes>> client) override;
40 
45  Message<RFCCodes> login(std::shared_ptr<ITCPConnection<RFCCodes>> connection, Message<RFCCodes> message);
46 
51  Message<RFCCodes> listUsers(std::shared_ptr<ITCPConnection<RFCCodes>> connection, Message<RFCCodes> message);
52 
57  Message<RFCCodes> callUser(std::shared_ptr<ITCPConnection<RFCCodes>> connection, Message<RFCCodes> message);
58 
63  Message<RFCCodes> joinCall(std::shared_ptr<ITCPConnection<RFCCodes>> connection, Message<RFCCodes> message);
64 
69  Message<RFCCodes> denyCall(std::shared_ptr<ITCPConnection<RFCCodes>> connection, Message<RFCCodes> message);
70 
75  Message<RFCCodes> hangUpCall(std::shared_ptr<ITCPConnection<RFCCodes>> connection, Message<RFCCodes> message);
76 
77  private:
78 
83  bool getUserByUsername(const std::string &username, User &user);
84 
88  bool isValidCallId(int callId) const;
89 
91 
96  std::shared_ptr<ITCPConnection<RFCCodes>> getConnectionById(uint64_t id) const;
97 
100  void messageAllParticipants(Call &call, const Message<RFCCodes> &m);
101 
102  void announceUserLeftCall(Call &call, const ITCPConnection<RFCCodes> &connectionLeaving);
103 
104 
106  std::map<uint64_t, User> _users;
107 
110 
113  {
115  std::function<Message<RFCCodes>(std::shared_ptr<ITCPConnection<RFCCodes>>, Message<RFCCodes>)> method;
118  };
119 
121  std::map<RFCCodes, RequestHandler> requestsHandlers{
123  {
124  [this](std::shared_ptr<ITCPConnection<RFCCodes>> c,
125  Message<RFCCodes> m) { return this->login(std::move(c), std::move(m)); },
126  false
127  }},
129  {
130  [this](std::shared_ptr<ITCPConnection<RFCCodes>> c, Message<RFCCodes> m) {
131  return this->listUsers(std::move(c), std::move(m));
132  },
133  false
134  }},
136  [this](std::shared_ptr<ITCPConnection<RFCCodes>> c, Message<RFCCodes> m) {
137  return this->callUser(std::move(c), std::move(m));
138  },
139  true
140  }},
142  {
143  [this](std::shared_ptr<ITCPConnection<RFCCodes>> c, Message<RFCCodes> m) {
144  return this->joinCall(std::move(c), std::move(m));
145  },
146  true
147  }},
149  {
150  [this](std::shared_ptr<ITCPConnection<RFCCodes>> c, Message<RFCCodes> m) {
151  return this->denyCall(std::move(c), std::move(m));
152  },
153  true
154  }},
156  {
157  [this](std::shared_ptr<ITCPConnection<RFCCodes>> c, Message<RFCCodes> m) {
158  return this->hangUpCall(std::move(c), std::move(m));
159  },
160  true
161  }}
162  };
163 
164  };
165 }
Babel::BabelServer::getCallAllIPs
Message< RFCCodes > & getCallAllIPs(Message< RFCCodes > &m, const Call &call)
Definition: BabelServer.cpp:196
Babel::BabelServer::ongoingCalls
FreeList< Call > ongoingCalls
The list of all ongoing calls.
Definition: BabelServer.hpp:109
Message.hpp
Babel::Call
struct to handle all Call related data
Definition: Call.hpp:16
Call.hpp
Babel::BabelServer::denyCall
Message< RFCCodes > denyCall(std::shared_ptr< ITCPConnection< RFCCodes >> connection, Message< RFCCodes > message)
The function to call to manage a denyCall request.
Definition: BabelServer.cpp:174
FreeList.hpp
Babel::BabelServer::onClientDisconnect
void onClientDisconnect(std::shared_ptr< ITCPConnection< RFCCodes >> client) override
Called when a client disconnect.
Definition: BabelServer.cpp:56
Babel::BabelServer::hangUpCall
Message< RFCCodes > hangUpCall(std::shared_ptr< ITCPConnection< RFCCodes >> connection, Message< RFCCodes > message)
The function to call to manage a hangUp request.
Definition: BabelServer.cpp:181
Babel::BabelServer::_users
std::map< uint64_t, User > _users
All the connected user.
Definition: BabelServer.hpp:106
User.hpp
Babel::BabelServer::messageAllParticipants
void messageAllParticipants(Call &call, const Message< RFCCodes > &m)
Send a message to all current call participants.
Definition: BabelServer.cpp:214
AsioTCPServer.hpp
Babel::BabelServer::isValidCallId
bool isValidCallId(int callId) const
Tells if a given callId is currently pointing to an active call.
Definition: BabelServer.cpp:222
Babel::BabelServer::onClientConnect
bool onClientConnect(std::shared_ptr< ITCPConnection< RFCCodes >> client) override
Called when a client connect.
Definition: BabelServer.cpp:50
Babel::Message< RFCCodes >
RFCCodes.hpp
Babel::FreeList
Provides an indexed free list with constant-time removals from anywhere in the list without invalidat...
Definition: FreeList.hpp:16
Babel::BabelServer::callUser
Message< RFCCodes > callUser(std::shared_ptr< ITCPConnection< RFCCodes >> connection, Message< RFCCodes > message)
The function to call to manage a callUser request.
Definition: BabelServer.cpp:101
Babel::BabelServer::onMessage
void onMessage(std::shared_ptr< ITCPConnection< RFCCodes >> client, Message< RFCCodes > &msg) override
Called when we received a message from a client.
Definition: BabelServer.cpp:33
Babel::BabelServer::joinCall
Message< RFCCodes > joinCall(std::shared_ptr< ITCPConnection< RFCCodes >> connection, Message< RFCCodes > message)
The function to call to manage a joinCall request.
Definition: BabelServer.cpp:128
Babel::BabelServer::listUsers
Message< RFCCodes > listUsers(std::shared_ptr< ITCPConnection< RFCCodes >> connection, Message< RFCCodes > message)
The function to call to manage a listUser request.
Definition: BabelServer.cpp:77
Babel
Definition: IAudioManager.hpp:13
Babel::RFCCodes::DenyCall
@ DenyCall
Deny a receiving call from a user.
Babel::BabelServer
Main server class contains almost all the logic for the server.
Definition: BabelServer.hpp:27
Babel::RFCCodes::ListUsers
@ ListUsers
Get the list of server currently active users.
Babel::User
Definition: User.hpp:12
Babel::ITCPConnection< RFCCodes >
Babel::BabelServer::RequestHandler
Utils struct to store requests information.
Definition: BabelServer.hpp:112
Babel::BabelServer::announceUserLeftCall
void announceUserLeftCall(Call &call, const ITCPConnection< RFCCodes > &connectionLeaving)
Definition: BabelServer.cpp:239
AsioTCPConnection.hpp
Babel::RFCCodes::HangUp
@ HangUp
Hang up a call.
Babel::RFCCodes::Login
@ Login
Login a user in the server.
Babel::BabelServer::RequestHandler::method
std::function< Message< RFCCodes >std::shared_ptr< ITCPConnection< RFCCodes > >, Message< RFCCodes >)> method
the actual function to call to process the request
Definition: BabelServer.hpp:115
Babel::AsioTCPServer
Implementation of ITCPServer using ASIO.
Definition: AsioTCPServer.hpp:22
Babel::BabelServer::getUserByUsername
bool getUserByUsername(const std::string &username, User &user)
Utility function to get the User from it's username.
Definition: BabelServer.cpp:163
Babel::BabelServer::getConnectionById
std::shared_ptr< ITCPConnection< RFCCodes > > getConnectionById(uint64_t id) const
Get the connection from it's Id.
Definition: BabelServer.cpp:204
Babel::BabelServer::requestsHandlers
std::map< RFCCodes, RequestHandler > requestsHandlers
map that map a RFCCode to an requestHandler
Definition: BabelServer.hpp:121
Babel::BabelServer::login
Message< RFCCodes > login(std::shared_ptr< ITCPConnection< RFCCodes >> connection, Message< RFCCodes > message)
The function to call to manage a login request.
Definition: BabelServer.cpp:15
Babel::RFCCodes::JoinCall
@ JoinCall
Accept a call from a user.
Babel::BabelServer::RequestHandler::loginRequired
bool loginRequired
prerequisite of the request
Definition: BabelServer.hpp:117
Babel::RFCCodes::CallUser
@ CallUser
Call a user from it's username.