summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/server.c90
1 files changed, 53 insertions, 37 deletions
diff --git a/src/server/server.c b/src/server/server.c
index d7ff702..467067a 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -23,23 +23,12 @@ static struct camu_user *get_user_by_username(struct camu_server *server, str *u
{
struct camu_user *user;
al_array_foreach(server->users, i, user) {
- if (al_str_eq(&user->name, username)) {
- return user;
- }
- }
- return NULL;
-}
-
-static struct camu_server_client *get_client_by_connection(struct camu_server *server, struct nn_rpc_connection *conn)
-{
- struct camu_server_client *client;
- al_array_foreach(server->clients, i, client) {
- if (client->conn == conn) return client;
+ if (al_str_eq(&user->name, username)) return user;
}
return NULL;
}
-static struct lia_list *get_list_from_name(struct camu_server *server, str *name)
+static struct lia_list *get_list_by_name(struct camu_server *server, str *name)
{
struct lia_list *list;
al_array_foreach(server->lists, i, list) {
@@ -48,7 +37,7 @@ static struct lia_list *get_list_from_name(struct camu_server *server, str *name
return NULL;
}
-static struct camu_server_sink *get_sink_from_name(struct camu_server *server, str *name)
+static struct camu_server_sink *get_sink_by_name(struct camu_server *server, str *name)
{
struct camu_server_sink *sink;
al_array_foreach(server->sinks, i, sink) {
@@ -57,6 +46,15 @@ static struct camu_server_sink *get_sink_from_name(struct camu_server *server, s
return NULL;
}
+static struct camu_server_client *get_client_by_connection(struct camu_server *server, struct nn_rpc_connection *conn)
+{
+ struct camu_server_client *client;
+ al_array_foreach(server->clients, i, client) {
+ if (client->conn == conn) return client;
+ }
+ return NULL;
+}
+
static void write_list_entry(struct lia_list_entry *entry, struct nn_packet *packet)
{
nn_packet_write_u32(packet, entry->id);
@@ -107,7 +105,7 @@ static bool identify_callback(void *userdata, struct nn_rpc_connection *conn,
struct camu_server_node *node = al_alloc_object(struct camu_server_node);
node->conn = conn;
al_array_push(server->nodes, node);
- info("New node.");
+ log_info("New node.");
break;
}
case CAMU_CLIENT: {
@@ -123,7 +121,7 @@ static bool identify_callback(void *userdata, struct nn_rpc_connection *conn,
}
client->user = user;
al_array_push(server->clients, client);
- info("User \"%.*s\" logged in.", al_str_x(&user->name));
+ log_info("User \"%.*s\" logged in.", al_str_x(&user->name));
write_initial_user_state(server, user, rpacket);
break;
}
@@ -136,7 +134,7 @@ static bool identify_callback(void *userdata, struct nn_rpc_connection *conn,
sink->server = server;
al_array_push(server->sinks, sink);
handle_toggle_sink(server, &al_str_c("default"), sink, true);
- info("New sink.");
+ log_info("New sink.");
break;
}
}
@@ -201,7 +199,7 @@ static void list_sink_callback(void *userdata, u8 op, struct lia_list_entry *ent
void handle_toggle_sink(struct camu_server *server, str *name, struct camu_server_sink *sink, bool enable)
{
- struct lia_list *list = get_list_from_name(server, name);
+ struct lia_list *list = get_list_by_name(server, name);
if (!list) return;
if (enable) lia_list_add_sink(list, list_sink_callback, sink);
else lia_list_remove_sink(list, sink);
@@ -236,6 +234,18 @@ static void node_callback(void *userdata, u8 op, u64 duration)
process_pending(resource);
}
+static void send_clients_added_entry(struct camu_server *server, struct lia_list *list, struct lia_list_entry *entry)
+{
+ struct camu_server_client *client;
+ al_array_foreach(server->clients, i, client) {
+ struct nn_packet *packet = nn_rpc_get_packet(client->conn->rpc, CAMU_CLIENT_META);
+ nn_packet_write_u8(packet, LIANA_META_ADDED_ENTRY);
+ nn_packet_write_str(packet, &list->name);
+ write_list_entry(entry, packet);
+ nn_rpc_connection_command(client->conn, packet, NULL, NULL);
+ }
+}
+
static void send_clients_current_changed(struct camu_server *server, struct lia_list *list, struct lia_list_entry *entry)
{
struct camu_server_client *client;
@@ -249,14 +259,18 @@ static void send_clients_current_changed(struct camu_server *server, struct lia_
}
}
-static void send_clients_added_entry(struct camu_server *server, struct lia_list *list, struct lia_list_entry *entry)
+static void send_clients_order_changed(struct camu_server *server, struct lia_list *list)
{
struct camu_server_client *client;
al_array_foreach(server->clients, i, client) {
struct nn_packet *packet = nn_rpc_get_packet(client->conn->rpc, CAMU_CLIENT_META);
- nn_packet_write_u8(packet, LIANA_META_ADDED_ENTRY);
+ nn_packet_write_u8(packet, LIANA_META_ORDER_CHANGED);
nn_packet_write_str(packet, &list->name);
- write_list_entry(entry, packet);
+ nn_packet_write_u32(packet, list->entries.count);
+ struct lia_list_entry *entry;
+ al_array_foreach(list->entries, i, entry) {
+ nn_packet_write_u32(packet, entry->id);
+ }
nn_rpc_connection_command(client->conn, packet, NULL, NULL);
}
}
@@ -284,7 +298,7 @@ static struct cch_entry *entry_from_post(struct camu_server *server, struct camu
}
}
if (!entry) {
- error("Failed to load post media %.*s %u.", al_str_x(&post->unique_id), index);
+ log_error("Failed to load post media %.*s %u.", al_str_x(&post->unique_id), index);
return NULL;
}
entry->handler->maybe_spawn_worker(entry->handler, 0);
@@ -408,25 +422,27 @@ static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, v
if (server->meta_callback) {
server->meta_callback(server->userdata, *(u8 *)opaque, entry);
}
+ struct lia_list *list = entry->list;
switch (*(u8 *)opaque) {
- case LIANA_META_CURRENT_CHANGED:
- info("Now playing: %ls.", entry->name.data);
- send_clients_current_changed(server, entry->list, entry);
- break;
case LIANA_META_ADDED_ENTRY:
- send_clients_added_entry(server, entry->list, entry);
+ send_clients_added_entry(server, list, entry);
break;
case LIANA_META_REMOVED_ENTRY:
break;
+ case LIANA_META_CURRENT_CHANGED:
+ log_info("Now playing: %ls.", entry->name.data);
+ send_clients_current_changed(server, list, entry);
+ break;
+ case LIANA_META_ORDER_CHANGED:
+ send_clients_order_changed(server, list);
+ break;
case LIANA_META_ENTRY_PAUSED:
break;
case LIANA_META_ENTRY_SEEKED:
- send_clients_entry_seeked(server, entry->list, entry);
+ send_clients_entry_seeked(server, list, entry);
break;
case LIANA_META_ENTRY_ERRORED:
- error("Failed to load: %ls.", entry->name.data);
- break;
- case LIANA_META_ORDER_CHANGED:
+ log_error("Failed to load: %ls.", entry->name.data);
break;
}
break;
@@ -502,7 +518,7 @@ static bool client_command_callback(void *userdata, struct nn_rpc_connection *co
case CAMU_CLIENT_TOGGLE_SINK: {
str name;
nn_packet_read_str(packet, &name);
- struct camu_server_sink *sink = get_sink_from_name(server, &name);
+ struct camu_server_sink *sink = get_sink_by_name(server, &name);
if (!sink) goto out;
nn_packet_read_str(packet, &name); // list name.
bool enable = nn_packet_read_bool(packet);
@@ -557,7 +573,7 @@ static void simple_search_portal_callback(void *userdata0, void *userdata1, stru
return;
}
// No return is the error case.
- warn("Failed to process simple search request.");
+ log_warn("Failed to process simple search request.");
resource->load = LIANA_ENTRY_ERRORED;
}
#endif
@@ -656,7 +672,7 @@ static bool list_action_callback(void *userdata, struct nn_rpc_connection *conn,
str name;
nn_packet_read_str(packet, &name);
- struct lia_list *list = get_list_from_name(server, &name);
+ struct lia_list *list = get_list_by_name(server, &name);
if (!list) goto out;
u8 op = nn_packet_read_u8(packet);
@@ -748,7 +764,7 @@ static void connection_closed_callback(void *userdata, struct nn_rpc_connection
struct camu_server_node *node;
al_array_foreach(server->nodes, i, node) {
if (node->conn == conn) {
- info("Node removed.");
+ log_info("Node removed.");
cleanup_node(node);
al_array_remove_at(server->nodes, i);
break;
@@ -758,7 +774,7 @@ static void connection_closed_callback(void *userdata, struct nn_rpc_connection
struct camu_server_client *client;
al_array_foreach(server->clients, i, client) {
if (client->conn == conn) {
- info("User \"%.*s\" logged out.", al_str_x(&client->user->name));
+ log_info("User \"%.*s\" logged out.", al_str_x(&client->user->name));
cleanup_client(client);
al_array_remove_at(server->clients, i);
break;
@@ -768,7 +784,7 @@ static void connection_closed_callback(void *userdata, struct nn_rpc_connection
struct camu_server_sink *sink;
al_array_foreach(server->sinks, i, sink) {
if (sink->conn == conn) {
- info("Sink removed.");
+ log_info("Sink removed.");
struct lia_list *list;
al_array_foreach(server->lists, j, list) {
lia_list_remove_sink(list, sink);