CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/HLE/proAdhocServer.h
Views: 1401
1
// Copyright (c) 2014- PPSSPP Project.
2
3
// This program is free software: you can redistribute it and/or modify
4
// it under the terms of the GNU General Public License as published by
5
// the Free Software Foundation, version 2.0 or later versions.
6
7
// This program is distributed in the hope that it will be useful,
8
// but WITHOUT ANY WARRANTY; without even the implied warranty of
9
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
// GNU General Public License 2.0 for more details.
11
12
// A copy of the GPL 2.0 should have been included with the program.
13
// If not, see http://www.gnu.org/licenses/
14
15
// Official git repository and contact information can be found at
16
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
17
18
19
// proAdhocServer
20
21
// This is a direct port of Coldbird's code from http://code.google.com/p/aemu/
22
// All credit goes to him!
23
24
#pragma once
25
26
#include <cstdint>
27
#include <time.h>
28
#include "proAdhoc.h"
29
30
// Server Listening Port
31
//#define SERVER_PORT 27312
32
33
// Listener Connection Backlog (aka. Max Concurrent Logins)
34
#define SERVER_LISTEN_BACKLOG 128
35
36
// Server User Maximum
37
#define SERVER_USER_MAXIMUM 1024
38
39
// Server User Timeout (in seconds)
40
#define SERVER_USER_TIMEOUT 15
41
42
// Server SQLite3 Database
43
#define SERVER_DATABASE "database.db"
44
45
// Server Status Logfile
46
#define SERVER_STATUS_XMLOUT "www/status.xml"
47
48
// Server Shutdown Message
49
#define SERVER_SHUTDOWN_MESSAGE "ADHOC SERVER HUB IS SHUTTING DOWN!"
50
51
typedef struct db_crosslink{
52
char id_from[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id_from;
53
char id_to[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id_to;
54
} db_crosslink;
55
56
typedef struct db_productid {
57
char id[PRODUCT_CODE_LENGTH + 1]; //SceNetAdhocctlProductCode id;
58
char name[ADHOCCTL_NICKNAME_LEN]; //Title name
59
} db_productid;
60
61
/* PSPSTRUCTS */
62
63
// Ethernet Address (MAC)
64
/*#define ETHER_ADDR_LEN 6
65
typedef struct SceNetEtherAddr {
66
uint8_t data[ETHER_ADDR_LEN];
67
} SceNetEtherAddr;
68
69
// Adhoc Virtual Network Name (1234ABCD)
70
#define ADHOCCTL_GROUPNAME_LEN 8
71
typedef struct SceNetAdhocctlGroupName {
72
uint8_t data[ADHOCCTL_GROUPNAME_LEN];
73
} SceNetAdhocctlGroupName;
74
75
// Player Nickname
76
#define ADHOCCTL_NICKNAME_LEN 128
77
typedef struct SceNetAdhocctlNickname {
78
uint8_t data[ADHOCCTL_NICKNAME_LEN];
79
} SceNetAdhocctlNickname;*/
80
81
/* PACKETS */
82
83
/*#define OPCODE_PING 0
84
#define OPCODE_LOGIN 1
85
#define OPCODE_CONNECT 2
86
#define OPCODE_DISCONNECT 3
87
#define OPCODE_SCAN 4
88
#define OPCODE_SCAN_COMPLETE 5
89
#define OPCODE_CONNECT_BSSID 6
90
#define OPCODE_CHAT 7
91
92
// PSP Product Code
93
#define PRODUCT_CODE_LENGTH 9
94
typedef struct
95
{
96
// Game Product Code (ex. ULUS12345)
97
char data[PRODUCT_CODE_LENGTH];
98
} PACK SceNetAdhocctlProductCode; // __attribute__((packed))
99
100
// Basic Packet
101
typedef struct
102
{
103
uint8_t opcode;
104
} PACK SceNetAdhocctlPacketBase;
105
106
// C2S Login Packet
107
typedef struct
108
{
109
SceNetAdhocctlPacketBase base;
110
SceNetEtherAddr mac;
111
SceNetAdhocctlNickname name;
112
SceNetAdhocctlProductCode game;
113
} PACK SceNetAdhocctlLoginPacketC2S;
114
115
// C2S Connect Packet
116
typedef struct
117
{
118
SceNetAdhocctlPacketBase base;
119
SceNetAdhocctlGroupName group;
120
} PACK SceNetAdhocctlConnectPacketC2S;
121
122
// C2S Chat Packet
123
typedef struct
124
{
125
SceNetAdhocctlPacketBase base;
126
char message[64];
127
} PACK SceNetAdhocctlChatPacketC2S;
128
129
// S2C Connect Packet
130
typedef struct
131
{
132
SceNetAdhocctlPacketBase base;
133
SceNetAdhocctlNickname name;
134
SceNetEtherAddr mac;
135
uint32_t ip;
136
} PACK SceNetAdhocctlConnectPacketS2C;
137
138
// S2C Disconnect Packet
139
typedef struct
140
{
141
SceNetAdhocctlPacketBase base;
142
uint32_t ip;
143
} PACK SceNetAdhocctlDisconnectPacketS2C;
144
145
// S2C Scan Packet
146
typedef struct
147
{
148
SceNetAdhocctlPacketBase base;
149
SceNetAdhocctlGroupName group;
150
SceNetEtherAddr mac;
151
} PACK SceNetAdhocctlScanPacketS2C;
152
153
// S2C Connect BSSID Packet
154
typedef struct
155
{
156
SceNetAdhocctlPacketBase base;
157
SceNetEtherAddr mac;
158
} PACK SceNetAdhocctlConnectBSSIDPacketS2C;
159
160
// S2C Chat Packet
161
typedef struct
162
{
163
SceNetAdhocctlChatPacketC2S base;
164
SceNetAdhocctlNickname name;
165
} PACK SceNetAdhocctlChatPacketS2C;*/
166
167
/* USER */
168
169
// User States
170
#define USER_STATE_WAITING 0
171
#define USER_STATE_LOGGED_IN 1
172
#define USER_STATE_TIMED_OUT 2
173
174
// PSP Resolver Information
175
typedef struct
176
{
177
// PSP MAC Address
178
SceNetEtherAddr mac;
179
180
// PSP Hotspot IP Address
181
uint32_t ip;
182
183
// PSP Player Name
184
SceNetAdhocctlNickname name;
185
} SceNetAdhocctlResolverInfo;
186
187
// Type Prototypes
188
typedef struct SceNetAdhocctlGameNode SceNetAdhocctlGameNode;
189
typedef struct SceNetAdhocctlGroupNode SceNetAdhocctlGroupNode;
190
191
// Double-Linked User List
192
typedef struct SceNetAdhocctlUserNode {
193
// Next Element
194
struct SceNetAdhocctlUserNode * next;
195
196
// Previous Element
197
struct SceNetAdhocctlUserNode * prev;
198
199
// Next Element (Group)
200
struct SceNetAdhocctlUserNode * group_next;
201
202
// Previous Element
203
struct SceNetAdhocctlUserNode * group_prev;
204
205
// Resolver Information
206
SceNetAdhocctlResolverInfo resolver;
207
208
// Game Link
209
SceNetAdhocctlGameNode * game;
210
211
// Group Link
212
SceNetAdhocctlGroupNode * group;
213
214
// TCP Socket
215
int stream;
216
217
// Last Ping Update
218
time_t last_recv;
219
220
// RX Buffer
221
uint8_t rx[1024];
222
uint32_t rxpos;
223
} SceNetAdhocctlUserNode;
224
225
// Double-Linked Game List
226
struct SceNetAdhocctlGameNode {
227
// Next Element
228
struct SceNetAdhocctlGameNode * next;
229
230
// Previous Element
231
struct SceNetAdhocctlGameNode * prev;
232
233
// PSP Game Product Code
234
SceNetAdhocctlProductCode game;
235
236
// Number of Players
237
uint32_t playercount;
238
239
// Number of Groups
240
uint32_t groupcount;
241
242
// Double-Linked Group List
243
SceNetAdhocctlGroupNode * group;
244
};
245
246
// Double-Linked Group List
247
struct SceNetAdhocctlGroupNode {
248
// Next Element
249
struct SceNetAdhocctlGroupNode * next;
250
251
// Previous Element
252
struct SceNetAdhocctlGroupNode * prev;
253
254
// Game Link
255
SceNetAdhocctlGameNode * game;
256
257
// PSP Adhoc Group Name
258
SceNetAdhocctlGroupName group;
259
260
// Number of Players
261
uint32_t playercount;
262
263
// Double-Linked Player List
264
SceNetAdhocctlUserNode * player;
265
};
266
267
// User Count
268
extern uint32_t _db_user_count;
269
270
// User Database
271
extern SceNetAdhocctlUserNode * _db_user;
272
273
// Game Database
274
extern SceNetAdhocctlGameNode * _db_game;
275
276
void __AdhocServerInit();
277
278
/**
279
* Login User into Database (Stream)
280
* @param fd Socket
281
* @param ip IP Address (Network Order)
282
*/
283
void login_user_stream(int fd, uint32_t ip);
284
285
/**
286
* Login User into Database (Login Data)
287
* @param user User Node
288
* @param data Login Packet
289
*/
290
void login_user_data(SceNetAdhocctlUserNode * user, SceNetAdhocctlLoginPacketC2S * data);
291
292
/**
293
* Logout User from Database
294
* @param user User Node
295
*/
296
void logout_user(SceNetAdhocctlUserNode * user);
297
298
/**
299
* Free Database Memory
300
*/
301
void free_database();
302
303
/**
304
* Connect User to Game Group
305
* @param user User Node
306
* @param group Group Name
307
*/
308
void connect_user(SceNetAdhocctlUserNode * user, SceNetAdhocctlGroupName * group);
309
310
/**
311
* Disconnect User from Game Group
312
* @param user User Node
313
*/
314
void disconnect_user(SceNetAdhocctlUserNode * user);
315
316
/**
317
* Send Game Group List
318
* @param user User Node
319
*/
320
void send_scan_results(SceNetAdhocctlUserNode * user);
321
322
/**
323
* Spread Chat Message in P2P Network
324
* @param user Sender User Node
325
* @param message Chat Message
326
*/
327
void spread_message(SceNetAdhocctlUserNode *user, const char *message);
328
329
/**
330
* Get User State
331
* @param user User Node
332
*/
333
int get_user_state(SceNetAdhocctlUserNode * user);
334
335
/**
336
* Clear RX Buffer
337
* @param user User Node
338
* @param clear Number of Bytes to clear (-1 for all)
339
*/
340
void clear_user_rxbuf(SceNetAdhocctlUserNode * user, int clear);
341
342
/**
343
* Patch Game Product Code
344
* @param product To-be-patched Product Code
345
* @param from If the Product Code matches this...
346
* @param to ... then change it to this one.
347
*/
348
void game_product_relink(SceNetAdhocctlProductCode * product, char * from, char * to);
349
350
/**
351
* Game Product Override (used for mixing multi-region games)
352
* @param product IN: Source Product OUT: Override Product
353
*/
354
void game_product_override(SceNetAdhocctlProductCode * product);
355
356
/* STATUS */
357
358
/**
359
* Update Status Logfile
360
*/
361
void update_status();
362
363
/**
364
* Server Entry Point
365
* @param argc Number of Arguments
366
* @param argv Arguments
367
* @return OS Error Code
368
*/
369
int proAdhocServerThread(int port); // (int argc, char * argv[])
370
371
//extern int _status;
372
extern std::atomic<bool> adhocServerRunning;
373
extern std::thread adhocServerThread;
374
375