diff options
| author | 2024-10-21 19:22:50 -0400 | |
|---|---|---|
| committer | 2024-10-21 19:22:50 -0400 | |
| commit | 60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2 (patch) | |
| tree | 08ff2ce7975f523112e7ad2fe4f797b4fc7db5de /src/libclient | |
| parent | 2f9a0945bfeee3296cec3d38d094e4c49f9cb65f (diff) | |
| download | camu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.tar.gz camu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.tar.bz2 camu-60b4ebfbf3be78dba9dc7c65ab2bdaa0b218c0c2.zip | |
Everything before initial synced list
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/libclient')
| -rw-r--r-- | src/libclient/client.c | 239 | ||||
| -rw-r--r-- | src/libclient/client.h | 60 | ||||
| -rw-r--r-- | src/libclient/meson.build | 4 | ||||
| -rw-r--r-- | src/libclient/resource_client.c | 87 | ||||
| -rw-r--r-- | src/libclient/resource_client.h | 29 |
5 files changed, 35 insertions, 384 deletions
diff --git a/src/libclient/client.c b/src/libclient/client.c index cd0bdf5..58264e0 100644 --- a/src/libclient/client.c +++ b/src/libclient/client.c @@ -1,247 +1,58 @@ -#include <al/log.h> +#include "client.h" #include "../server/common.h" -#include "client.h" - -static void identifed_callback(void *userdata, struct aki_packet *packet) -{ - struct camu_client *client = (struct camu_client *)userdata; - client->callback(client->userdata, CAMU_CLIENT_CONNECTED, NULL); - aki_packet_free(packet); -} +static struct aki_rpc_command commands[] = { }; static void connection_callback(void *userdata, struct aki_rpc_connection *conn) { struct camu_client *client = (struct camu_client *)userdata; client->conn = conn; - struct aki_packet *packet = aki_rpc_get_packet(&client->client, CAMU_SRV_IDENTIFY); + struct aki_packet *packet = aki_rpc_get_packet(&client->client, CAMU_SERVER_IDENTIFY); aki_packet_write_u8(packet, CAMU_CLIENT); aki_packet_write_str(packet, &client->username); - aki_rpc_connection_command(client->conn, packet, identifed_callback, client); + aki_rpc_connection_command(client->conn, packet, NULL, NULL); } static void connection_closed_callback(void *userdata, struct aki_rpc_connection *conn) { struct camu_client *client = (struct camu_client *)userdata; - (void)conn; - client->callback(client->userdata, CAMU_CLIENT_DISCONNECTED, NULL); + al_assert(client->conn == conn); + client->conn = NULL; } -static u8 packet_pool_callback(void *userdata, struct aki_packet *packet) -{ - struct camu_client *client = (struct camu_client *)userdata; - aki_rpc_connection_command(client->conn, packet, packet->userdata, client); - return AKI_PACKET_POOL_NOP; -} - -static bool update_state_command_callback(void *userdata, struct aki_rpc_connection *conn, - struct aki_packet *packet, struct aki_packet *rpacket) -{ - struct camu_client *client = (struct camu_client *)userdata; - (void)conn; - (void)rpacket; - - str s; - u32 size = aki_packet_read_u32(packet); - for (u32 i = 0; i < size; i++) { - struct camu_list *list = al_alloc_object(struct camu_list); - aki_packet_read_str(packet, &s); - al_str_clone(&list->name, &s); - al_array_init(list->entries); - u32 entries = aki_packet_read_u32(packet); - for (u32 j = 0; j < entries; j++) { - aki_packet_read_str(packet, &s); - str unique_id; - al_str_clone(&unique_id, &s); - al_array_push(list->entries, unique_id); - } - list->current = aki_packet_read_s32(packet); - al_array_push(client->state.lists, list); - } - - size = aki_packet_read_u32(packet); - for (u32 i = 0; i < size; i++) { - struct camu_search *search = al_alloc_object(struct camu_search); - search->id = aki_packet_read_s32(packet); - aki_packet_read_str(packet, &s); - al_str_clone(&search->module, &s); - aki_packet_read_str(packet, &s); - al_str_clone(&search->query, &s); - search->page = aki_packet_read_u32(packet); - al_array_push(client->state.searches, search); - } - - client->callback(client->userdata, CAMU_CLIENT_STATE_UPDATED, NULL); - - return false; -} - -static struct aki_rpc_command commands[] = { - { .op = CAMU_CONN_STATE, .callback = update_state_command_callback, .userdata = NULL } -}; - -bool camu_client_init(struct camu_client *client, struct aki_event_loop *loop, - void (*callback)(void *, u8, void *), void *userdata) +bool camu_client_login(struct camu_client *client, struct aki_event_loop *loop, + u8 type, str *addr, u16 port, str *username) { client->loop = loop; - client->callback = callback; - client->userdata = userdata; - client->username = AL_STR_EMPTY; - al_array_init(client->state.lists); - aki_packet_pool_init_ex(&client->pool, 0, client->loop, - AKI_PACKET_POOL_MODE_PASSTHROUGH, packet_pool_callback, client); - if (!aki_rpc_init(&client->client, AKI_SOCKET_TCP, connection_callback, - connection_closed_callback, client)) { - return false; - } + al_str_clone(&client->username, username); + aki_rpc_init(&client->client, client->loop, connection_callback, connection_closed_callback, client); for (u32 i = 0; i < AL_ARRAY_SIZE(commands); i++) { commands[i].userdata = client; aki_rpc_add_command(&client->client, &commands[i]); } - sho_post_cache_init(&client->cache); - return true; -} - -bool camu_client_login(struct camu_client *client, str *username, str *addr, s32 port) -{ - al_str_clone(&client->username, username); - if (!aki_rpc_connect(&client->client, client->loop, addr, port)) { + if (!aki_rpc_prepare_client(&client->client, type, CAMU_MULTIPLEX_RPC)) { return false; } - while (!client->conn) { - aki_event_loop_run_once(client->loop); - } - // TODO: Timeout. + aki_rpc_connect(&client->client, addr, port); return true; } -static void create_search_callback(void *userdata, struct aki_packet *packet) -{ - struct camu_client *client = (struct camu_client *)userdata; - s32 id = aki_packet_read_s32(packet); - client->callback(client->userdata, CAMU_CLIENT_SEARCH_CREATED, &id); -} - -void camu_client_create_search(struct camu_client *client, str *module, str *query) -{ - /* - struct aki_packet *packet = aki_rpc_get_packet(&client->client, TREE_CMD_CREATE_SEARCH); - aki_packet_write_str(packet, module); - aki_packet_write_str(packet, query); - packet->userdata = create_search_callback; - aki_packet_pool_submit(&client->pool, packet); - */ -} - -static struct camu_search *get_search_from_id(struct camu_client *client, s32 id) -{ - struct camu_search *search; - al_array_foreach(client->state.searches, i, search) { - if (search->id == id) return search; - } - return NULL; -} - -static void results_callback(void *userdata, struct aki_packet *packet) -{ - struct camu_client *client = (struct camu_client *)userdata; - - // We still get the requested id even if there was an error. - s32 id = aki_packet_read_s32(packet); - - s32 ok = aki_packet_read_s32(packet); - if (ok != 0) { - client->callback(client->userdata, CAMU_CLIENT_END_OF_RESULTS, &id); - return; - } - - struct camu_search *search = get_search_from_id(client, id); - if (!search) return; - - u32 page_num = aki_packet_read_u32(packet); - struct camu_result_list *results; - al_array_foreach(search->lists, i, results) { - if (results->num == page_num) { - al_log_warn("client", "Requested page was already loaded."); - return; - } - } - - results = al_alloc_object(struct camu_result_list); - al_array_push(search->lists, results); - results->num = page_num; - al_array_init(results->unique_ids); - results->search = search; - - u32 size = aki_packet_read_u32(packet); - for (u32 i = 0; i < size; i++) { - struct sho_post post; - aki_packet_read_sho_post(packet, &post); - sho_post_cache_push(&client->cache, &post); - } - - str s; - str unique_id; - size = aki_packet_read_u32(packet); - for (u32 i = 0; i < size; i++) { - aki_packet_read_str(packet, &s); - al_str_clone(&unique_id, &s); - al_array_push(results->unique_ids, unique_id); - } - - client->callback(client->userdata, CAMU_CLIENT_RESULTS, results); -} - -void camu_client_get_page(struct camu_client *client, struct camu_search *search, u32 num) -{ - /* - struct aki_packet *packet = aki_rpc_get_packet(&client->client, TREE_CMD_GET_PAGE); - aki_packet_write_s32(packet, search->id); - aki_packet_write_u32(packet, num); - packet->userdata = results_callback; - aki_packet_pool_submit(&client->pool, packet); - */ -} - -void camu_client_add(struct camu_client *client, str *unique_id, u32 index, bool set) -{ - /* - struct aki_packet *packet = aki_rpc_get_packet(&client->client, TREE_CMD_LIST_ACTION); - aki_packet_write_u8(packet, TREE_LIST_ADD); - aki_packet_write_str(packet, unique_id); - aki_packet_write_u32(packet, index); - aki_packet_write_u8(packet, set); - packet->userdata = NULL; - aki_packet_pool_submit(&client->pool, packet); - */ -} - -void camu_client_skip(struct camu_client *client, s32 n) -{ - /* - struct aki_packet *packet = aki_rpc_get_packet(&client->client, TREE_CMD_LIST_ACTION); - aki_packet_write_u8(packet, TREE_LIST_SKIP); - aki_packet_write_s32(packet, n); - packet->userdata = NULL; - aki_packet_pool_submit(&client->pool, packet); - */ -} - -void camu_client_skipto(struct camu_client *client, s32 i) +void camu_client_create_list(struct camu_client *client, str *name, + void (*callback)(void *, struct aki_packet *), void *userdata) { - /* - struct aki_packet *packet = aki_rpc_get_packet(&client->client, TREE_CMD_LIST_ACTION); - aki_packet_write_u8(packet, TREE_LIST_SKIPTO); - aki_packet_write_s32(packet, i); - packet->userdata = NULL; - aki_packet_pool_submit(&client->pool, packet); - */ + struct aki_packet *packet = aki_rpc_get_packet(&client->client, CAMU_SERVER_CLIENT_COMMAND); + aki_packet_write_u8(packet, CAMU_CLIENT_CREATE_LIST); + aki_packet_write_str(packet, name); + aki_rpc_connection_command(client->conn, packet, callback, userdata); } -void camu_client_close(struct camu_client *client) +void camu_client_enable_sink(struct camu_client *client, str *list, str *sink, + void (*callback)(void *, struct aki_packet *), void *userdata) { - aki_packet_pool_free(&client->pool); - al_str_free(&client->username); - al_array_free(client->state.lists); + struct aki_packet *packet = aki_rpc_get_packet(&client->client, CAMU_SERVER_CLIENT_COMMAND); + aki_packet_write_u8(packet, CAMU_CLIENT_ENABLE_SINK); + aki_packet_write_str(packet, list); + aki_packet_write_str(packet, sink); + aki_rpc_connection_command(client->conn, packet, callback, userdata); } diff --git a/src/libclient/client.h b/src/libclient/client.h index 98276f2..a56be26 100644 --- a/src/libclient/client.h +++ b/src/libclient/client.h @@ -1,62 +1,18 @@ #pragma once #include <aki/rpc2.h> -#include <aki/thread.h> -#include <aki/packet_pool.h> -#include <sho/post.h> -#include <sho/post_cache.h> - -enum { - CAMU_CLIENT_CONNECTED = 0, - CAMU_CLIENT_STATE_UPDATED, - CAMU_CLIENT_SEARCH_CREATED, - CAMU_CLIENT_RESULTS, - CAMU_CLIENT_END_OF_RESULTS, - CAMU_CLIENT_DISCONNECTED -}; - -struct camu_list { - str name; - s32 current; - array(str) entries; -}; - -struct camu_result_list { - u32 num; - array(str) unique_ids; - struct camu_search *search; -}; - -struct camu_search { - s32 id; - str module; - str query; - u32 page; - array(struct camu_result_list *) lists; -}; struct camu_client { struct aki_event_loop *loop; - struct aki_rpc client; str username; - struct { - array(struct camu_list *) lists; - array(struct camu_search *) searches; - } state; - struct sho_post_cache cache; + struct aki_rpc client; struct aki_rpc_connection *conn; - struct aki_packet_pool pool; - void (*callback)(void *, u8, void *); - void *userdata; }; -bool camu_client_init(struct camu_client *client, struct aki_event_loop *loop, - void (*callback)(void *, u8, void *), void *userdata); -bool camu_client_login(struct camu_client *client, str *username, str *addr, s32 port); -void camu_client_create_search(struct camu_client *client, str *module, str *query); -void camu_client_create_browse(struct camu_client *client); -void camu_client_get_page(struct camu_client *client, struct camu_search *search, u32 num); -void camu_client_add(struct camu_client *client, str *unique_id, u32 index, bool set); -void camu_client_skip(struct camu_client *client, s32 n); -void camu_client_skipto(struct camu_client *client, s32 i); -void camu_client_close(struct camu_client *client); +bool camu_client_login(struct camu_client *client, struct aki_event_loop *loop, + u8 type, str *addr, u16 port, str *username); + +void camu_client_create_list(struct camu_client *client, str *name, + void (*callback)(void *, struct aki_packet *), void *userdata); +void camu_client_enable_sink(struct camu_client *client, str *list, str *sink, + void (*callback)(void *, struct aki_packet *), void *userdata); diff --git a/src/libclient/meson.build b/src/libclient/meson.build index dff4014..197f0ff 100644 --- a/src/libclient/meson.build +++ b/src/libclient/meson.build @@ -1,3 +1,3 @@ -libclient_src = ['client.c', 'resource_client.c'] -libclient_deps = [portal] +libclient_src = ['client.c'] +libclient_deps = [common_deps] libclient = declare_dependency(sources: libclient_src, dependencies: libclient_deps) diff --git a/src/libclient/resource_client.c b/src/libclient/resource_client.c deleted file mode 100644 index a016fa6..0000000 --- a/src/libclient/resource_client.c +++ /dev/null @@ -1,87 +0,0 @@ -#include <al/random.h> - -#include "resource_client.h" - -static void connection_callback(void *userdata, struct aki_packet_stream *stream) -{ - struct camu_resource_client *client = (struct camu_resource_client *)userdata; - (void)stream; - client->connected = true; -} - -static void connection_closed_callback(void *userdata, struct aki_packet_stream *stream) -{ - struct camu_resource_client *client = (struct camu_resource_client *)userdata; - (void)stream; - client->connected = true; -} - -static void packet_callback(void *userdata, struct aki_packet_stream *stream, - struct aki_packet *packet) -{ - struct camu_resource_client *client = (struct camu_resource_client *)userdata; - (void)stream; - u16 id = aki_packet_read_u16(packet); - struct aki_buffer buffer; - aki_buffer_init(&buffer); - aki_packet_read_buffer(packet, &buffer); - client->callback(client->userdata, id, &buffer); - aki_packet_free(packet); -} - -static void packet_sent_callback(void *userdata, struct aki_packet *packet) -{ - (void)userdata; - aki_packet_free(packet); -} - -static void signal_callback(void *userdata) -{ - struct camu_resource_client *client = (struct camu_resource_client *)userdata; - u32 size; - struct camu_resource_request request; - do { - camu_queue_try_pop(client->queue, size, request); - if (size == 0) break; - struct aki_packet *packet = aki_packet_create(); - aki_packet_write_u16(packet, request.id); - aki_packet_write_str(packet, &request.unique_id); - aki_packet_write_u32(packet, request.index); - aki_packet_stream_send_packet(&client->client, packet); - al_str_free(&request.unique_id); - } while (1); -} - -void camu_resource_client_init(struct camu_resource_client *client, - struct aki_event_loop *loop, void (*callback)(void *, u16, struct aki_buffer *), void *userdata) -{ - client->loop = loop; - client->callback = callback; - client->userdata = userdata; - camu_queue_init(client->queue); - aki_signal_init(&client->signal, signal_callback, client); - aki_packet_stream_init(&client->client, AKI_SOCKET_TCP, connection_callback, connection_closed_callback, - packet_callback, packet_sent_callback, client); -} - -bool camu_resource_client_connect(struct camu_resource_client *client, str *addr, s32 port) -{ - aki_signal_start(&client->signal, client->loop); - aki_packet_stream_connect(&client->client, client->loop, addr, port); - client->connected = false; - while (!client->connected) { - aki_event_loop_run_once(client->loop); - } - // TODO: Timeout. - return true; -} - -void camu_resource_request(struct camu_resource_client *client, str *unique_id, u32 index, u16 id) -{ - struct camu_resource_request request; - request.id = id; - al_str_clone(&request.unique_id, unique_id); - request.index = index; - camu_queue_push(client->queue, request); - aki_signal_send(&client->signal); -} diff --git a/src/libclient/resource_client.h b/src/libclient/resource_client.h deleted file mode 100644 index 755e661..0000000 --- a/src/libclient/resource_client.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include <aki/packet_stream.h> -#include <aki/thread.h> -#include <aki/signal.h> - -#include "../util/queue.h" - -struct camu_resource_request { - u16 id; - str unique_id; - u32 index; -}; - -struct camu_resource_client { - struct aki_event_loop *loop; - struct aki_packet_stream client; - bool connected; - struct aki_thread thread; - struct aki_signal signal; - queue(struct camu_resource_request) queue; - void (*callback)(void *, u16, struct aki_buffer *); - void *userdata; -}; - -void camu_resource_client_init(struct camu_resource_client *client, - struct aki_event_loop *loop, void (*callback)(void *, u16, struct aki_buffer *), void *userdata); -bool camu_resource_client_connect(struct camu_resource_client *client, str *addr, s32 port); -void camu_resource_request(struct camu_resource_client *client, str *unique_id, u32 index, u16 id); |