diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/server.c | 82 | ||||
| -rw-r--r-- | src/server/server.h | 2 |
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); |