diff options
author | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
---|---|---|
committer | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
commit | abef6da56913f1c55528103e60a50451a39628b1 (patch) | |
tree | b3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/LWeb.h |
initial commit
Diffstat (limited to 'src/LWeb.h')
-rw-r--r-- | src/LWeb.h | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/src/LWeb.h b/src/LWeb.h new file mode 100644 index 0000000..b9edd9a --- /dev/null +++ b/src/LWeb.h @@ -0,0 +1,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 |