summaryrefslogtreecommitdiff
path: root/src/libclient
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-11-08 14:53:40 -0500
committerAndrew Opalach <andrew@akon.city> 2024-11-08 14:53:40 -0500
commit5e3641e5e692c3f2f644a4bb809c88727cb8bee9 (patch)
treefbac2007fdcebda13406350fdcef977910427078 /src/libclient
parentf56abfafcd4fa722b807278b138f805112cd953e (diff)
downloadcamu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.tar.gz
camu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.tar.bz2
camu-5e3641e5e692c3f2f644a4bb809c88727cb8bee9.zip
Command queue for portal and list, work on server
Most of the server stuff can undoubtedly be simplified. I'm still working that out. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/libclient')
-rw-r--r--src/libclient/client.c73
-rw-r--r--src/libclient/client.h15
-rw-r--r--src/libclient/common.h5
3 files changed, 87 insertions, 6 deletions
diff --git a/src/libclient/client.c b/src/libclient/client.c
index 58264e0..0776842 100644
--- a/src/libclient/client.c
+++ b/src/libclient/client.c
@@ -1,8 +1,41 @@
#include "client.h"
+#include "common.h"
#include "../server/common.h"
-static struct aki_rpc_command commands[] = { };
+static bool results_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;
+
+ u8 op = aki_packet_read_u8(packet);
+ switch (op) {
+ case CAMU_CLIENT_CREATE_SEARCH: {
+ s32 id = aki_packet_read_s32(packet);
+ client->callback(client->userdata, CAMU_CLIENT_SEARCH_CREATED, &id);
+ break;
+ }
+ case CAMU_CLIENT_GET_PAGE:
+ client->callback(client->userdata, CAMU_CLIENT_PAGE_RESULTS, packet);
+ break;
+ }
+
+ aki_packet_free(packet);
+ return false;
+}
+
+static struct aki_rpc_command commands[] = {
+ { .op = CAMU_CLIENT_RESULTS, .callback = results_callback, .userdata = NULL }
+};
+
+static void idd_callback(void *userdata, struct aki_packet *packet)
+{
+ struct camu_client *client = (struct camu_client *)userdata;
+ (void)packet;
+ client->callback(client->userdata, CAMU_CLIENT_LOGIN, NULL);
+}
static void connection_callback(void *userdata, struct aki_rpc_connection *conn)
{
@@ -11,7 +44,7 @@ static void connection_callback(void *userdata, struct aki_rpc_connection *conn)
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, NULL, NULL);
+ aki_rpc_connection_command(client->conn, packet, idd_callback, client);
}
static void connection_closed_callback(void *userdata, struct aki_rpc_connection *conn)
@@ -47,12 +80,42 @@ void camu_client_create_list(struct camu_client *client, str *name,
aki_rpc_connection_command(client->conn, packet, callback, userdata);
}
-void camu_client_enable_sink(struct camu_client *client, str *list, str *sink,
+void camu_client_toggle_sink(struct camu_client *client, str *sink, str *list, bool enable,
void (*callback)(void *, struct aki_packet *), void *userdata)
{
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_u8(packet, CAMU_CLIENT_TOGGLE_SINK);
aki_packet_write_str(packet, sink);
+ aki_packet_write_str(packet, list);
+ aki_packet_write_bool(packet, enable);
aki_rpc_connection_command(client->conn, packet, callback, userdata);
}
+
+void camu_client_create_search(struct camu_client *client, str *module, str *query)
+{
+ struct aki_packet *packet = aki_rpc_get_packet(&client->client, CAMU_SERVER_CLIENT_COMMAND);
+ aki_packet_write_u8(packet, CAMU_CLIENT_CREATE_SEARCH);
+ aki_packet_write_str(packet, module);
+ aki_packet_write_str(packet, query);
+ aki_rpc_connection_command(client->conn, packet, NULL, NULL);
+}
+
+void camu_client_get_page(struct camu_client *client, s32 id, u32 num)
+{
+ struct aki_packet *packet = aki_rpc_get_packet(&client->client, CAMU_SERVER_CLIENT_COMMAND);
+ aki_packet_write_u8(packet, CAMU_CLIENT_GET_PAGE);
+ aki_packet_write_s32(packet, id);
+ aki_packet_write_u32(packet, num);
+ aki_rpc_connection_command(client->conn, packet, NULL, NULL);
+}
+
+void camu_client_add(struct camu_client *client, str *list, str *unique_id, u32 index)
+{
+ struct aki_packet *packet = aki_rpc_get_packet(&client->client, CAMU_SERVER_LIST_ACTION);
+ aki_packet_write_str(packet, list);
+ aki_packet_write_u8(packet, CAMU_LIST_ADD);
+ aki_packet_write_u8(packet, CAMU_RESOURCE_PORTAL);
+ aki_packet_write_str(packet, unique_id);
+ aki_packet_write_u32(packet, index);
+ aki_rpc_connection_command(client->conn, packet, NULL, NULL);
+}
diff --git a/src/libclient/client.h b/src/libclient/client.h
index a56be26..02a6639 100644
--- a/src/libclient/client.h
+++ b/src/libclient/client.h
@@ -2,11 +2,19 @@
#include <aki/rpc2.h>
+enum {
+ CAMU_CLIENT_LOGIN = 0,
+ CAMU_CLIENT_SEARCH_CREATED,
+ CAMU_CLIENT_PAGE_RESULTS
+};
+
struct camu_client {
struct aki_event_loop *loop;
str username;
struct aki_rpc client;
struct aki_rpc_connection *conn;
+ void (*callback)(void *, u8, void *);
+ void *userdata;
};
bool camu_client_login(struct camu_client *client, struct aki_event_loop *loop,
@@ -14,5 +22,10 @@ bool camu_client_login(struct camu_client *client, struct aki_event_loop *loop,
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 camu_client_toggle_sink(struct camu_client *client, str *sink, str *list, bool enable,
void (*callback)(void *, struct aki_packet *), void *userdata);
+
+void camu_client_create_search(struct camu_client *client, str *module, str *query);
+void camu_client_get_page(struct camu_client *client, s32 id, u32 num);
+
+void camu_client_add(struct camu_client *client, str *list, str *unique_id, u32 index);
diff --git a/src/libclient/common.h b/src/libclient/common.h
new file mode 100644
index 0000000..5b8dcbf
--- /dev/null
+++ b/src/libclient/common.h
@@ -0,0 +1,5 @@
+#pragma once
+
+enum {
+ CAMU_CLIENT_RESULTS = 0
+};