summaryrefslogtreecommitdiff
path: root/src/libclient
diff options
context:
space:
mode:
Diffstat (limited to 'src/libclient')
-rw-r--r--src/libclient/client.c97
-rw-r--r--src/libclient/client.h26
-rw-r--r--src/libclient/commands.h1
-rw-r--r--src/libclient/resource_client.c2
4 files changed, 78 insertions, 48 deletions
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 <al/log.h>
+
+#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 <sho/post.h>
#include <sho/post_cache.h>
-#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 <al/random.h>
-#include "../tree/tree.h"
-
#include "resource_client.h"
static void connection_callback(void *userdata, struct aki_packet_stream *stream)