summaryrefslogtreecommitdiff
path: root/src/libclient
diff options
context:
space:
mode:
Diffstat (limited to 'src/libclient')
-rw-r--r--src/libclient/client.c239
-rw-r--r--src/libclient/client.h60
-rw-r--r--src/libclient/meson.build4
-rw-r--r--src/libclient/resource_client.c87
-rw-r--r--src/libclient/resource_client.h29
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);