Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
tcp_session_tpl.h
Go to the documentation of this file.
1#pragma once
2#ifndef DVD_SESSION_TPL_H_
3#define DVD_SESSION_TPL_H_
4
5#include "WorldPacket.h"
6
7#include <boost/asio/strand.hpp>
8
9namespace Divide
10{
11 //----------------------------------------------------------------------
12
13 //This is game specific but core functionality
14 extern void UpdateEntities( WorldPacket& p );
15
17 {
18 public:
19 virtual ~subscriber() = default;
20 virtual void sendPacket( const WorldPacket& p ) = 0;
21 };
22
23 using subscriber_ptr = std::shared_ptr<subscriber>;
24
25 //----------------------------------------------------------------------
26
27 class channel
28 {
29 public:
30 void join( const subscriber_ptr& sub )
31 {
32 subscribers_.insert( sub );
33 }
34
35 void leave( const subscriber_ptr& sub )
36 {
37 subscribers_.erase( sub );
38 }
39
40 void sendPacket( const WorldPacket& p )
41 {
42 eastl::for_each( subscribers_.begin(), subscribers_.end(),
43 [&p]( auto& subscriber )
44 {
45 subscriber->sendPacket( p );
46 } );
47 }
48
49 private:
50 eastl::set<subscriber_ptr> subscribers_;
51 };
52
56 public std::enable_shared_from_this<tcp_session_tpl>
57 {
58 public:
59 tcp_session_tpl( boost::asio::io_context& io_context, channel& ch );
60
62 {
63 return _socket;
64 }
65
66 // Called by the server object to initiate the four actors.
67 virtual void start();
68
69 // Push a new packet in the output queue
70 void sendPacket( const WorldPacket& p ) override;
71
72 // Push a new file in the output queue
73 virtual void sendFile( const string& fileName );
74
75 private:
76 virtual void stop();
77 virtual bool stopped() const;
78
79 // Read Packet;
80 virtual void start_read();
81 virtual void handle_read_body( const boost::system::error_code& ec,
82 size_t bytes_transferred );
83 virtual void handle_read_packet( const boost::system::error_code& ec,
84 size_t bytes_transferred );
85
86 // Write Packet
87 virtual void start_write();
88 virtual void handle_write( const boost::system::error_code& ec );
89
90 // Write File
91 virtual void handle_write_file( const boost::system::error_code& ec );
92
93 // Update Timers
94 virtual void await_output();
95 virtual void check_deadline( deadline_timer* deadline );
96
97 protected:
98 // Define this functions to implement various packet handling (a switch
99 // statement for example)
100 // switch(p.getOpcode()) { case SMSG_XXXXX: bla bla bla break; case
101 // MSG_HEARTBEAT: break;}
102 virtual void handlePacket( WorldPacket& p );
103
104 virtual void HandleHeartBeatOpCode( WorldPacket& p );
105 virtual void HandleDisconnectOpCode( WorldPacket& p );
106 virtual void HandlePingOpCode( WorldPacket& p );
107 virtual void HandleEntityUpdateOpCode( WorldPacket& p );
108
109 private:
110 size_t _header;
113 boost::asio::streambuf _inputBuffer;
114 eastl::deque<WorldPacket> _outputQueue;
115 eastl::deque<string> _outputFileQueue;
120
121 std::unique_ptr<boost::asio::io_context::strand> _strand;
122 };
123
124 using tcp_session_ptr = std::shared_ptr<tcp_session_tpl>;
125
126 //----------------------------------------------------------------------
127
128 class udp_broadcaster final : public subscriber
129 {
130 public:
131 udp_broadcaster( boost::asio::io_context& io_context,
132 const boost::asio::ip::udp::endpoint& broadcast_endpoint );
133
134 [[nodiscard]] inline udp_socket& getSocket() noexcept
135 {
136 return socket_;
137 }
138 void sendPacket( const WorldPacket& p ) override;
139
140 private:
142 };
143
144}; // namespace Divide
145
146#endif //DVD_SESSION_TPL_H_
void sendPacket(const WorldPacket &p)
void leave(const subscriber_ptr &sub)
void join(const subscriber_ptr &sub)
eastl::set< subscriber_ptr > subscribers_
virtual ~subscriber()=default
virtual void sendPacket(const WorldPacket &p)=0
eastl::deque< WorldPacket > _outputQueue
deadline_timer _inputDeadline
eastl::deque< string > _outputFileQueue
virtual void HandlePingOpCode(WorldPacket &p)
virtual void HandleEntityUpdateOpCode(WorldPacket &p)
boost::asio::streambuf _inputBuffer
virtual void sendFile(const string &fileName)
virtual void handlePacket(WorldPacket &p)
virtual void HandleDisconnectOpCode(WorldPacket &p)
virtual void handle_write_file(const boost::system::error_code &ec)
virtual void handle_read_body(const boost::system::error_code &ec, size_t bytes_transferred)
std::unique_ptr< boost::asio::io_context::strand > _strand
deadline_timer _outputDeadline
deadline_timer _nonEmptyOutputQueue
virtual void handle_read_packet(const boost::system::error_code &ec, size_t bytes_transferred)
virtual void HandleHeartBeatOpCode(WorldPacket &p)
void sendPacket(const WorldPacket &p) override
virtual bool stopped() const
virtual void handle_write(const boost::system::error_code &ec)
tcp_socket & getSocket() noexcept
virtual void check_deadline(deadline_timer *deadline)
void sendPacket(const WorldPacket &p) override
udp_socket & getSocket() noexcept
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
boost::asio::basic_stream_socket< boost::asio::ip::tcp, boost::asio::io_context::executor_type > tcp_socket
Definition: Utils.h:45
std::shared_ptr< tcp_session_tpl > tcp_session_ptr
void UpdateEntities(WorldPacket &p)
boost::asio::basic_datagram_socket< boost::asio::ip::udp, boost::asio::io_context::executor_type > udp_socket
Definition: Utils.h:49
boost::asio::basic_deadline_timer< boost::posix_time::ptime, boost::asio::time_traits< boost::posix_time::ptime >, boost::asio::io_context::executor_type > deadline_timer
Definition: Utils.h:43
std::shared_ptr< subscriber > subscriber_ptr