From b100eb175e0cfa59a15c4125f26ab5474c2347ec Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Sat, 27 Jan 2024 20:39:25 -0500 Subject: wip - Mostly work in the client Signed-off-by: Andrew Opalach --- src/libclient/client.c | 97 +++++++++++++++++++++++++++-------------- src/libclient/client.h | 26 ++++++----- src/libclient/commands.h | 1 - src/libclient/resource_client.c | 2 - 4 files changed, 78 insertions(+), 48 deletions(-) delete mode 100644 src/libclient/commands.h (limited to 'src/libclient') diff --git a/src/libclient/client.c b/src/libclient/client.c index e42f662..71825e3 100644 --- a/src/libclient/client.c +++ b/src/libclient/client.c @@ -1,3 +1,7 @@ +#include + +#include "../tree/common.h" + #include "client.h" static void identifed_callback(void *userdata, struct aki_packet *packet) @@ -19,18 +23,22 @@ static void connection_callback(void *userdata, struct aki_rpc_connection *conn) static void connection_closed_callback(void *userdata, struct aki_rpc_connection *conn) { - (void)userdata; + struct camu_client *client = (struct camu_client *)userdata; (void)conn; + client->callback(client->userdata, CAMU_CLIENT_DISCONNECTED, NULL); } static u8 packet_pool_callback(void *userdata, struct aki_packet *packet) { struct camu_client *client = (struct camu_client *)userdata; + while (!client->conn) { + aki_event_loop_run_once(client->loop); + } aki_rpc_connection_command(client->conn, packet, packet->userdata, client); return AKI_PACKET_POOL_NOP; } -static bool status_command_callback(void *userdata, struct aki_rpc_connection *conn, +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; @@ -43,6 +51,15 @@ static bool status_command_callback(void *userdata, struct aki_rpc_connection *c 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); } @@ -51,20 +68,20 @@ static bool status_command_callback(void *userdata, struct aki_rpc_connection *c 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->provider, &s); + al_str_clone(&search->module, &s); aki_packet_read_str(packet, &s); al_str_clone(&search->query, &s); - search->page = aki_packet_read_s32(packet); + search->last_page = aki_packet_read_u32(packet); al_array_push(client->state.searches, search); } - client->callback(client->userdata, CAMU_CLIENT_STATUS_UPDATED, NULL); + client->callback(client->userdata, CAMU_CLIENT_STATE_UPDATED, NULL); return false; } static struct aki_rpc_command commands[] = { - { .op = TREE_CMD_STATUS, .callback = status_command_callback, .userdata = NULL } + { .op = TREE_CMD_UPDATE_STATE, .callback = update_state_command_callback, .userdata = NULL } }; bool camu_client_init(struct camu_client *client, struct aki_event_loop *loop, @@ -105,16 +122,16 @@ static void create_search_callback(void *userdata, struct aki_packet *packet) client->callback(client->userdata, CAMU_CLIENT_SEARCH_CREATED, &id); } -void camu_client_create_search(struct camu_client *client, str *provider, str *query) +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_SEARCH); - aki_packet_write_str(packet, provider); + 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 *search_from_id(struct camu_client *client, s32 id) +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) { @@ -126,49 +143,55 @@ static struct camu_search *search_from_id(struct camu_client *client, s32 id) static void results_callback(void *userdata, struct aki_packet *packet) { struct camu_client *client = (struct camu_client *)userdata; + s32 ok = aki_packet_read_s32(packet); - if (ok != 0) return; + if (ok != 0) { + client->callback(client->userdata, CAMU_CLIENT_END_OF_RESULTS, NULL); + return; + } + s32 id = aki_packet_read_s32(packet); - struct camu_search *search = search_from_id(client, id); + struct camu_search *search = get_search_from_id(client, id); if (!search) return; - s32 page = aki_packet_read_s32(packet); - while (search->pages.size <= (u32)page) { - struct camu_search_results result; - result.page = page; - al_array_init(result.unique_ids); - al_array_push(search->pages, result); + + u32 page_num = aki_packet_read_u32(packet); + struct camu_result_list *list; + al_array_foreach(search->lists, i, list) { + if (list->num == page_num) { + al_log_warn("client", "Requested page was already loaded."); + return; + } } + + list = al_alloc_object(struct camu_result_list); + al_array_push(search->lists, list); + list->num = page_num; + al_array_init(list->unique_ids); + 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); } - struct camu_search_results *result = &al_array_at(search->pages, page); - str s, unique_id; + + 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(result->unique_ids, unique_id); + al_array_push(list->unique_ids, unique_id); } - client->callback(client->userdata, CAMU_CLIENT_RESULTS, result); -} -void camu_client_resume_search(struct camu_client *client, struct camu_search *search) -{ - struct aki_packet *packet = aki_rpc_get_packet(&client->client, TREE_CMD_RESUME_SEARCH); - aki_packet_write_s32(packet, search->id); - aki_packet_write_s32(packet, search->page); - packet->userdata = results_callback; - aki_packet_pool_submit(&client->pool, packet); + client->callback(client->userdata, CAMU_CLIENT_RESULTS, list); } -void camu_client_more_results(struct camu_client *client, struct camu_search *search) +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_RESUME_SEARCH); + struct aki_packet *packet = aki_rpc_get_packet(&client->client, TREE_CMD_GET_PAGE); aki_packet_write_s32(packet, search->id); - aki_packet_write_s32(packet, -1); + aki_packet_write_u32(packet, num); packet->userdata = results_callback; aki_packet_pool_submit(&client->pool, packet); } @@ -182,6 +205,14 @@ void camu_client_add(struct camu_client *client, str *unique_id, u32 index) 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_SKIP); + aki_packet_write_s32(packet, n); + packet->userdata = NULL; + aki_packet_pool_submit(&client->pool, packet); +} + void camu_client_close(struct camu_client *client) { aki_packet_pool_free(&client->pool); diff --git a/src/libclient/client.h b/src/libclient/client.h index cdcaffe..2b2e093 100644 --- a/src/libclient/client.h +++ b/src/libclient/client.h @@ -6,31 +6,33 @@ #include #include -#include "../tree/common.h" - enum { CAMU_CLIENT_CONNECTED = 0, - CAMU_CLIENT_STATUS_UPDATED, + CAMU_CLIENT_STATE_UPDATED, CAMU_CLIENT_SEARCH_CREATED, - CAMU_CLIENT_RESULTS + CAMU_CLIENT_RESULTS, + CAMU_CLIENT_END_OF_RESULTS, + CAMU_CLIENT_DISCONNECTED }; struct camu_list { str name; + s32 current; array(str) entries; }; -struct camu_search_results { - s32 page; +struct camu_result_list { + u32 num; + s32 search_id; array(str) unique_ids; }; struct camu_search { s32 id; - str provider; + str module; str query; - s32 page; - array(struct camu_search_results) pages; + u32 last_page; + array(struct camu_result_list *) lists; }; struct camu_client { @@ -51,8 +53,8 @@ struct camu_client { 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 *provider, str *query); -void camu_client_resume_search(struct camu_client *client, struct camu_search *search); -void camu_client_more_results(struct camu_client *client, struct camu_search *search); +void camu_client_create_search(struct camu_client *client, str *module, str *query); +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); +void camu_client_skip(struct camu_client *client, s32 n); void camu_client_close(struct camu_client *client); diff --git a/src/libclient/commands.h b/src/libclient/commands.h deleted file mode 100644 index 6f70f09..0000000 --- a/src/libclient/commands.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/src/libclient/resource_client.c b/src/libclient/resource_client.c index 77c19c7..1e07b0b 100644 --- a/src/libclient/resource_client.c +++ b/src/libclient/resource_client.c @@ -1,7 +1,5 @@ #include -#include "../tree/tree.h" - #include "resource_client.h" static void connection_callback(void *userdata, struct aki_packet_stream *stream) -- cgit v1.2.3-101-g0448