summaryrefslogtreecommitdiff
path: root/src/libclient
diff options
context:
space:
mode:
Diffstat (limited to 'src/libclient')
-rw-r--r--src/libclient/client.c31
-rw-r--r--src/libclient/client.h2
-rw-r--r--src/libclient/resource_client.c9
-rw-r--r--src/libclient/resource_client.h5
4 files changed, 25 insertions, 22 deletions
diff --git a/src/libclient/client.c b/src/libclient/client.c
index 71825e3..1194994 100644
--- a/src/libclient/client.c
+++ b/src/libclient/client.c
@@ -31,9 +31,6 @@ static void connection_closed_callback(void *userdata, struct aki_rpc_connection
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;
}
@@ -112,6 +109,10 @@ bool camu_client_login(struct camu_client *client, str *username, str *addr, s32
if (!aki_rpc_connect(&client->client, client->loop, addr, port)) {
return false;
}
+ while (!client->conn) {
+ aki_event_loop_run_once(client->loop);
+ }
+ // TODO: Timeout.
return true;
}
@@ -144,29 +145,31 @@ static void results_callback(void *userdata, struct aki_packet *packet)
{
struct camu_client *client = (struct camu_client *)userdata;
+ 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, NULL);
+ client->callback(client->userdata, CAMU_CLIENT_END_OF_RESULTS, &id);
return;
}
- s32 id = aki_packet_read_s32(packet);
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 *list;
- al_array_foreach(search->lists, i, list) {
- if (list->num == page_num) {
+ 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;
}
}
- list = al_alloc_object(struct camu_result_list);
- al_array_push(search->lists, list);
- list->num = page_num;
- al_array_init(list->unique_ids);
+ 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++) {
@@ -181,10 +184,10 @@ static void results_callback(void *userdata, struct aki_packet *packet)
for (u32 i = 0; i < size; i++) {
aki_packet_read_str(packet, &s);
al_str_clone(&unique_id, &s);
- al_array_push(list->unique_ids, unique_id);
+ al_array_push(results->unique_ids, unique_id);
}
- client->callback(client->userdata, CAMU_CLIENT_RESULTS, list);
+ client->callback(client->userdata, CAMU_CLIENT_RESULTS, results);
}
void camu_client_get_page(struct camu_client *client, struct camu_search *search, u32 num)
diff --git a/src/libclient/client.h b/src/libclient/client.h
index 2b2e093..edb7881 100644
--- a/src/libclient/client.h
+++ b/src/libclient/client.h
@@ -23,8 +23,8 @@ struct camu_list {
struct camu_result_list {
u32 num;
- s32 search_id;
array(str) unique_ids;
+ struct camu_search *search;
};
struct camu_search {
diff --git a/src/libclient/resource_client.c b/src/libclient/resource_client.c
index 1e07b0b..0318305 100644
--- a/src/libclient/resource_client.c
+++ b/src/libclient/resource_client.c
@@ -48,6 +48,7 @@ static void signal_callback(void *userdata)
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);
}
@@ -63,8 +64,7 @@ void camu_resource_client_init(struct camu_resource_client *client,
connection_closed_callback, packet_callback, packet_sent_callback, client);
}
-
-void camu_resource_client_connect(struct camu_resource_client *client, str *addr, s32 port)
+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);
@@ -72,10 +72,11 @@ void camu_resource_client_connect(struct camu_resource_client *client, str *addr
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)
+void camu_resource_request(struct camu_resource_client *client, str *unique_id, u32 index, u16 id)
{
struct camu_resource_request request;
request.id = id;
diff --git a/src/libclient/resource_client.h b/src/libclient/resource_client.h
index 17ac31e..755e661 100644
--- a/src/libclient/resource_client.h
+++ b/src/libclient/resource_client.h
@@ -25,6 +25,5 @@ struct camu_resource_client {
void camu_resource_client_init(struct camu_resource_client *client,
struct aki_event_loop *loop, void (*callback)(void *, u16, struct aki_buffer *), void *userdata);
-void 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);
+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);