-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgserver_base.h
230 lines (188 loc) · 7.07 KB
/
gserver_base.h
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/***************************************************************************
***************************************************************************
(c) 1999-2006 Ganymede Technologies All Rights Reserved
Krakow, Poland www.ganymede.eu
***************************************************************************
***************************************************************************/
#include "mysql.h"
extern MYSQL mysql;
#pragma warning(disable: 4511)
#pragma warning(disable: 4505)
/***************************************************************************/
enum EConsoleTaskType
{
ECTT_None,
ECTT_Request,
ECTT_Response,
};
/***************************************************************************/
struct SConsoleTask
{
SConsoleTask()
{
socketid = -1;
type = ECTT_None;
}
SConsoleTask(const SConsoleTask & t)
{
operator=(t);
}
INT32 socketid;
EConsoleTaskType type;
ECmdConsole cmd;
map<string, string> options;
string result;
void operator=(const SConsoleTask & t)
{
socketid = t.socketid;
type = t.type;
cmd = t.cmd;
options = t.options;
result = t.result;
}
};
typedef queue<SConsoleTask> TConsoleTaskQueue;
/***************************************************************************/
typedef map<EServiceTypes,GTicketInternalClient* > TServiceMap;
typedef vector<GTicketInternalClient*> TServiceVector;
class GServerBase: private boost::noncopyable, public boost::signals2::trackable
{
friend class GSocket;
friend class GTicketInternalClient;
public:
GServerBase();
virtual ~GServerBase(){Destroy();};
virtual bool Init();
void Destroy();
virtual void Action();
virtual void ActionLoopBegin() {};
virtual void ActionLoopEnd() {};
GSocket * SocketAdd(EServiceTypes type);
virtual void SocketRemove(GSocket *,EUSocketMode);
virtual void SocketDestroy(GSocket *,EUSocketMode);
bool DuplicateSocket(SOCKET socket);
virtual GSocket * SocketNew(EServiceTypes type){GSocket * s=new GSocket();return s;};
GSocket * GetBaseSocketByID(INT32 socketid);
GSocket * GetPlayerSocketByID(INT32 socketid);
bool Continue(){return !flags[EFClose];};
void Close(){flags.set(EFClose);};
virtual bool ConfigureServices();
virtual void InitServices();
virtual void InitService(SSockService & service,int & ok);
SSockService * FindService(EServiceTypes type);
virtual bool ConfigureSockets();
void TestSocketsBinding();
virtual void InitInternalClients(){};
virtual void InitInternalClient(GTicketInternalClient *& target,EServiceTypes type,int level);
GTicketInternalClient * InternalClient(EServiceTypes type);
void AnalizeAccept(epoll_event * ev);
void AnalizeClient(epoll_event * ev);
void AnalizeServerClient(epoll_event * ev);
virtual void ProcessPoll();
virtual void ProcessTimeOut();
bool TestTimeOut(GSocket * socket);
virtual bool RegisterLogic(GSocket *){return true;};
virtual bool RegisterLogic(GSocket *,GSocket *){return true;};
virtual void UnregisterLogic(GSocket *,EUSocketMode , bool){};
//funkcje zwiazane z przejsciem miedzy watkami
virtual void ProcessMove();
virtual void SocketMoveAddToGlobalThread(vector<GSocket *> &);
virtual void SocketMoveRemoveFromGlobalThread(GSocket *);
virtual void SocketMoveAddToRoomThread(GSocket *);
virtual void SocketMoveToSocketGameInRoomThread(GSocket *);
void SetCurrentSTime();
void Clock();
virtual void ConfigureClock();
GClock & GetClock(){return clock;};
DWORD64 ActionLoopCounter() { return action_loop_counter; };
virtual void ServiceInfo(strstream &);
virtual void ServiceReinit(strstream & s,SSocketInternalReinit & reinit);
virtual INT32 CallAction(strstream &, ECmdConsole, map<string, string> &);
void InsertConsoleTask(SConsoleTask & task);
virtual void ProcessConsoleTasks();
virtual bool TestFirewall(const in_addr){return true;};
GMemoryManager & MemoryManager(){return memory_manager;};
int GenerateClientRID(){client_rid++;if(client_rid==-1) client_rid=1;return client_rid;};
DWORD64 StartSTime(){return start_s_time;};
DWORD64 CurrentSTime(){return current_s_time;};
void RaportRestartSQL(const char * status);
#ifndef LINUX
virtual void ParseKeyboard(){};
#endif
boost::signals2::signal<void()> signal_ms;
boost::signals2::signal<void()> signal_second;
boost::signals2::signal<void()> signal_seconds_5;
boost::signals2::signal<void()> signal_seconds_15;
boost::signals2::signal<void()> signal_minute;
boost::signals2::signal<void()> signal_minutes_5;
boost::signals2::signal<void()> signal_minutes_15;
boost::signals2::signal<void()> signal_hour;
boost::signals2::signal<void()> signal_day;
GRaportInterface raport_interface;
bool MySQL_Query_Raport(MYSQL * mysql, const char * query, char * qa_filename, int qa_line);
boost::signals2::signal<void()> signal_new_sockets_initialized;
protected:
SServiceManager service_manager;
vector<GSocket*> socket_listen;
vector<GSocket*> socket_move;
vector<GSocket*> socket_move_destroy;
INT32 seq_socket_id;
bool all_sockets_initialized;
struct hash_addr
{
size_t operator()(GSocket * x) const { return (size_t)x;} ;
};
struct eq_addr
{
bool operator()(GSocket* a1, GSocket* a2) const
{
return (a1==a2);
}
};
typedef dense_hash_set<GSocket*, hash_addr, eq_addr> TSocketHash;
typedef hash_map<INT32, GSocket *> TSocketIdMap;
TSocketHash socket_game;
TSocketIdMap socket_game_map;
TSocketIdMap socket_base_map;
TServiceVector socket_internal;
TServiceMap socket_internal_map;
int max_service_size;
int client_rid;
GClock clock;
GClocks clocks;
DWORD64 action_loop_counter;
DWORD64 action_loop_sql_queries_times;
DWORD32 action_loop_sql_queries_count;
bitset<numEFlags> flags;
GPollManager poll_manager;
GMemoryManager memory_manager;
DWORD64 start_s_time;
DWORD64 current_s_time;
TConsoleTaskQueue console_task_queue;
boost::mutex mtx_move;
boost::mutex mtx_console_task_queue;
};
/***************************************************************************/
class GServerBaseConsole: public GServerBase
{
typedef GServerBaseConsole base_t;
public:
GServerBaseConsole():GServerBase() {};
~GServerBaseConsole(){Destroy();};
void Destroy();
void AnalizeAcceptConsole(epoll_event * ev);
void AnalizeClientConsole(epoll_event * ev);
virtual void ParseConsole(GSocketConsole *);
virtual void ExecuteConsoleCommand(GSocketConsole * socket, string & cmd) {};
virtual void ProcessPoll();
GSocketConsole * SocketConsoleAdd();
virtual void SocketConsoleRemove(GSocketConsole *);
virtual void SocketConsoleDestroy(GSocketConsole *);
virtual void ProcessConsoleTasks();
private:
vector<GSocketConsole*> socket_console_accept;
TSocketIdMap socket_console_map;
};
/***************************************************************************/
#pragma warning(default: 4505)
#pragma warning(default: 4511)