summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/server.c82
-rw-r--r--src/server/server.h2
2 files changed, 78 insertions, 6 deletions
diff --git a/src/server/server.c b/src/server/server.c
index 794030a..d75146e 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -54,7 +54,17 @@ static struct camu_server_sink *get_sink_from_name(struct camu_server *server, s
return NULL;
}
-static void write_user_state(struct camu_server *server, struct camu_user *user, struct nn_packet *packet)
+static void write_list_entry(struct lia_list_entry *entry, struct nn_packet *packet)
+{
+ nn_packet_write_u32(packet, entry->id);
+ nn_packet_write_u64(packet, entry->duration);
+ nn_packet_write_u64(packet, entry->start);
+ nn_packet_write_u64(packet, entry->paused_at);
+ nn_packet_write_u64(packet, entry->offset);
+ nn_packet_write_wstr(packet, &entry->name);
+}
+
+static void write_initial_user_state(struct camu_server *server, struct camu_user *user, struct nn_packet *packet)
{
(void)user;
#ifdef CAMU_HAVE_PORTAL
@@ -68,6 +78,17 @@ static void write_user_state(struct camu_server *server, struct camu_user *user,
#else
nn_packet_write_u32(packet, 0);
#endif
+ nn_packet_write_u32(packet, server->lists.count);
+ struct lia_list *list;
+ al_array_foreach(server->lists, i, list) {
+ nn_packet_write_str(packet, &list->name);
+ nn_packet_write_s32(packet, list->current);
+ nn_packet_write_u32(packet, list->entries.count);
+ struct lia_list_entry *entry;
+ al_array_foreach(list->entries, j, entry) {
+ write_list_entry(entry, packet);
+ }
+ }
}
static void handle_toggle_sink(struct camu_server *server, str *name, struct camu_server_sink *sink, bool enable);
@@ -100,7 +121,7 @@ static bool identify_callback(void *userdata, struct nn_rpc_connection *conn,
client->user = user;
al_array_push(server->clients, client);
al_log_info("server", "User \"%.*s\" logged in.", al_str_fmt(&user->name));
- write_user_state(server, user, rpacket);
+ write_initial_user_state(server, user, rpacket);
break;
}
case CAMU_SINK: {
@@ -207,6 +228,43 @@ static void node_callback(void *userdata, u8 op, u64 duration)
}
}
+static void send_clients_current_changed(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_CURRENT_CHANGED);
+ nn_packet_write_str(packet, &list->name);
+ nn_packet_write_s32(packet, list->current);
+ write_list_entry(entry, packet);
+ nn_rpc_connection_command(client->conn, packet, NULL, NULL);
+ }
+}
+
+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_entry_seeked(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_ENTRY_SEEKED);
+ nn_packet_write_str(packet, &list->name);
+ write_list_entry(entry, packet);
+ nn_rpc_connection_command(client->conn, packet, NULL, NULL);
+ }
+}
+
static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, void *opaque)
{
struct camu_server *server = (struct camu_server *)userdata;
@@ -236,8 +294,24 @@ static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, v
case LIANA_UNLOAD_ENTRY:
break;
case LIANA_LIST_META:
- if (server->meta_callback) {
- server->meta_callback(server->userdata, *(u8 *)opaque, entry->list, entry);
+ switch (*(u8 *)opaque) {
+ case LIANA_META_CURRENT_CHANGED:
+ send_clients_current_changed(server, entry->list, entry);
+ break;
+ case LIANA_META_ADDED_ENTRY:
+ send_clients_added_entry(server, entry->list, entry);
+ break;
+ case LIANA_META_REMOVED_ENTRY:
+ break;
+ case LIANA_META_ENTRY_PAUSED:
+ break;
+ case LIANA_META_ENTRY_SEEKED:
+ send_clients_entry_seeked(server, entry->list, entry);
+ break;
+ case LIANA_META_ENTRY_ERRORED:
+ break;
+ case LIANA_META_ORDER_CHANGED:
+ break;
}
break;
}
diff --git a/src/server/server.h b/src/server/server.h
index 1b250dc..210f8a4 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -45,8 +45,6 @@ struct camu_server {
struct camu_portal_bridge bridge;
struct camu_post_cache cache;
#endif
- void (*meta_callback)(void *, u8, struct lia_list *, struct lia_list_entry *);
- void *userdata;
};
void camu_server_init(struct camu_server *server, struct nn_event_loop *loop);