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
|
#ifndef CC_LWEB_H
#define CC_LWEB_H
#include "Bitmap.h"
#include "Constants.h"
/* Implements asynchronous web tasks for the launcher.
Copyright 2014-2023 ClassiCube | Licensed under BSD-3
*/
struct HttpRequest;
struct JsonContext;
typedef void (*JsonOnValue)(struct JsonContext* ctx, const cc_string* v);
typedef void (*JsonOnNew)(struct JsonContext* ctx);
/* State for parsing JSON text */
struct JsonContext {
char* cur; /* Pointer to current character in JSON stream being inspected. */
int left; /* Number of characters left to be inspected. */
cc_bool failed; /* Whether there was an error parsing the JSON. */
cc_string curKey; /* Key/Name of current member */
int depth; /* Object/Array depth (e.g. { { { is depth 3 */
JsonOnNew OnNewArray; /* Invoked when start of an array is read. */
JsonOnNew OnNewObject; /* Invoked when start of an object is read. */
JsonOnValue OnValue; /* Invoked on each member value in an object/array. */
cc_string _tmp; /* temp value used for reading string values */
char _tmpBuffer[STRING_SIZE];
};
/* Initialises state of JSON parser. */
void Json_Init(struct JsonContext* ctx, STRING_REF char* str, int len);
/* Parses the JSON text, invoking callbacks when value/array/objects are read. */
/* NOTE: DO NOT persist the value argument in OnValue. */
cc_bool Json_Parse(struct JsonContext* ctx);
/* Represents all known details about a server. */
struct ServerInfo {
cc_string hash, name, ip, mppass, software;
int players, maxPlayers, port, uptime;
cc_bool featured;
char country[2];
int _order; /* (internal) order in servers table after filtering */
char _hashBuffer[32], _nameBuffer[STRING_SIZE];
char _ipBuffer[16], _mppassBuffer[STRING_SIZE];
char _softBuffer[STRING_SIZE];
};
/* Represents a country flag */
struct Flag {
struct Bitmap bmp;
char country[2]; /* ISO 3166-1 alpha-2 */
void* meta; /* Backend specific meta */
};
struct LWebTask {
cc_bool completed; /* Whether the task has finished executing. */
cc_bool working; /* Whether the task is currently in progress, or is scheduled to be. */
cc_bool success; /* Whether the task completed successfully. */
int reqID; /* Unique request identifier for this web task. */
/* Called when task successfully downloaded/uploaded data. */
void (*Handle)(cc_uint8* data, cc_uint32 len);
};
typedef void (*LWebTask_ErrorCallback)(struct HttpRequest* req);
void LWebTask_Tick(struct LWebTask* task, LWebTask_ErrorCallback errorCallback);
void LWebTasks_Init(void);
extern struct GetTokenTaskData {
struct LWebTask Base;
cc_string token; /* Random CSRF token for logging in. */
cc_string username; /* Username if session is already logged in. */
cc_bool error; /* Whether a signin error occurred */
} GetTokenTask;
void GetTokenTask_Run(void);
extern struct SignInTaskData {
struct LWebTask Base;
cc_string username; /* Username to sign in as. Changed to case correct username. */
const char* error; /* If sign in fails, the reason why. */
cc_bool needMFA; /* need login code for multifactor authentication */
} SignInTask;
void SignInTask_Run(const cc_string* user, const cc_string* pass, const cc_string* mfaCode);
extern struct FetchServerData {
struct LWebTask Base;
struct ServerInfo server; /* Details about the given server on success. */
} FetchServerTask;
void FetchServerTask_Run(const cc_string* hash);
extern struct FetchServersData {
struct LWebTask Base;
struct ServerInfo* servers; /* List of all public servers on server list. */
cc_uint16* orders; /* Order of each server (after sorting) */
int numServers; /* Number of public servers. */
} FetchServersTask;
void FetchServersTask_Run(void);
void FetchServersTask_ResetOrder(void);
#define Servers_Get(i) (&FetchServersTask.servers[FetchServersTask.orders[i]])
extern struct CheckUpdateData {
struct LWebTask Base;
/* Unix timestamp latest commit/dev build and release were at. */
cc_uint64 devTimestamp, relTimestamp;
/* Version of latest release. */
cc_string latestRelease;
} CheckUpdateTask; /* TODO: Work out the JSON for this.. */
void CheckUpdateTask_Run(void);
extern struct FetchUpdateData {
struct LWebTask Base;
/* Unix timestamp downloaded build was originally built at. */
cc_uint64 timestamp;
} FetchUpdateTask;
void FetchUpdateTask_Run(cc_bool release, int buildIndex);
extern struct FetchFlagsData {
struct LWebTask Base;
/* Number of flags downloaded. */
int count;
} FetchFlagsTask;
/* Asynchronously downloads the flag associated with the given server's country. */
void FetchFlagsTask_Add(const struct ServerInfo* server);
/* Gets the country flag associated with the given server's country. */
struct Flag* Flags_Get(const struct ServerInfo* server);
/* Frees all flag bitmaps. */
void Flags_Free(void);
void Session_Load(void);
void Session_Save(void);
#endif
|