diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/common.h | 14 | ||||
| -rw-r--r-- | src/server/resource.h | 42 | ||||
| -rw-r--r-- | src/server/server.c | 146 |
3 files changed, 73 insertions, 129 deletions
diff --git a/src/server/common.h b/src/server/common.h index 9cb9501..5b27768 100644 --- a/src/server/common.h +++ b/src/server/common.h @@ -39,20 +39,6 @@ enum { CAMU_LIST_END }; -enum { - CAMU_RESOURCE_FILE = 0, -#ifdef NAUNET_HAS_CURL - CAMU_RESOURCE_HTTP, -#endif -#ifdef CACHE_HAVE_CDIO - CAMU_RESOURCE_CDIO, -#endif -#ifdef CAMU_HAVE_PORTAL - CAMU_RESOURCE_PORTAL, - CAMU_RESOURCE_SIMPLE_SEARCH -#endif -}; - static inline bool camu_is_url(str *s, u32 i) { return al_str_cmp(s, &al_str_c("https://"), i, 8) == 0 diff --git a/src/server/resource.h b/src/server/resource.h index 3158479..cdbb42e 100644 --- a/src/server/resource.h +++ b/src/server/resource.h @@ -1,7 +1,21 @@ #pragma once #include "../liana/server.h" -#include "../liana/process.h" +#include "../portal/src/post.h" + +enum { + CAMU_RESOURCE_FILE = 0, +#ifdef NAUNET_HAS_CURL + CAMU_RESOURCE_HTTP, +#endif +#ifdef CACHE_HAVE_CDIO + CAMU_RESOURCE_CDIO, +#endif +#ifdef CAMU_HAVE_PORTAL + CAMU_RESOURCE_PORTAL, + CAMU_RESOURCE_SIMPLE_SEARCH +#endif +}; struct camu_resource { u8 type; @@ -10,28 +24,8 @@ struct camu_resource { struct lia_node *node; u64 duration; u32 ref; - array(struct lia_list_entry *) pending; - struct lia_visual_data visual_data; - struct camu_server *server; -}; - -struct camu_resource_file { - struct camu_resource r; - str path; -}; - -struct camu_resource_http { - struct camu_resource r; - str url; -}; - -struct camu_resource_portal { - struct camu_resource r; - struct camu_post *post; + str uri; u32 index; -}; - -struct camu_resource_cdio { - struct camu_resource r; - u32 track; + struct camu_post *post; + array(struct lia_list_entry *) pending; }; diff --git a/src/server/server.c b/src/server/server.c index 0275147..6f8da78 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -12,7 +12,6 @@ #ifdef CAMU_HAVE_PORTAL #include "../portal/src/packet_ext.h" #endif -#include "../codec/packet_ext.h" #include "server.h" #include "common.h" @@ -79,7 +78,7 @@ static void write_list_entry(struct lia_list_entry *entry, struct nn_packet *pac 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); + nn_packet_write_str(packet, &entry->brief); } static void write_initial_user_state(struct camu_server *server, struct camu_user *user, struct nn_packet *packet) @@ -236,20 +235,6 @@ static void process_pending(struct camu_resource *resource) al_array_free(pending); } -static void send_clients_visual_data(struct camu_server *server, u32 node_id, struct lia_visual_data *visual_data) -{ - 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_VISUAL_DATA); - nn_packet_write_u32(packet, node_id); - nn_packet_write_audio_format(packet, &visual_data->fmt); - nn_packet_write_u32(packet, visual_data->size); - NNWT_PACKET_WRITE_DATA(packet, visual_data->samples, visual_data->size); - nn_packet_write_u32(packet, visual_data->count); - nn_rpc_connection_command(client->conn, packet, NULL, NULL); - } -} - static void node_callback(void *userdata, u8 op, void *opaque) { struct camu_resource *resource = (struct camu_resource *)userdata; @@ -260,10 +245,6 @@ static void node_callback(void *userdata, u8 op, void *opaque) resource->duration = duration; break; } - case LIANA_NODE_VISUAL_DATA: { - resource->visual_data = *(struct lia_visual_data *)opaque; - break; - } case LIANA_NODE_ERRORED: resource->load = LIANA_ENTRY_ERRORED; break; @@ -359,20 +340,17 @@ static bool prepare_server_resource(struct camu_server *server, struct camu_reso { struct cch_entry *entry = NULL; switch (resource->type) { - case CAMU_RESOURCE_FILE: { - struct camu_resource_file *file = (struct camu_resource_file *)resource; - entry = cch_handler_file_create(&file->path, &al_str_c("codec")); + case CAMU_RESOURCE_FILE: + entry = cch_handler_file_create(&resource->uri, &al_str_c("codec")); if (!entry) { resource->load = LIANA_ENTRY_ERRORED; return false; } resource->load = LIANA_ENTRY_PREPARED; break; - } #ifdef NAUNET_HAS_CURL - case CAMU_RESOURCE_HTTP: { - struct camu_resource_http *http = (struct camu_resource_http *)resource; - entry = cch_handler_http_create(&http->url, server->loop); + case CAMU_RESOURCE_HTTP: + entry = cch_handler_http_create(&resource->uri, server->loop); if (!entry) { resource->load = LIANA_ENTRY_ERRORED; return false; @@ -380,34 +358,29 @@ static bool prepare_server_resource(struct camu_server *server, struct camu_reso entry->handler->maybe_spawn_worker(entry->handler, 0); resource->load = LIANA_ENTRY_PREPARED; break; - } #endif #ifdef CAMU_HAVE_PORTAL - case CAMU_RESOURCE_PORTAL: { - struct camu_resource_portal *portal = (struct camu_resource_portal *)resource; - entry = entry_from_post(server, portal->post, portal->index); + case CAMU_RESOURCE_PORTAL: + entry = entry_from_post(server, resource->post, resource->index); if (!entry) { resource->load = LIANA_ENTRY_ERRORED; return false; } resource->load = LIANA_ENTRY_PREPARED; break; - } #endif #ifdef CACHE_HAVE_CDIO - case CAMU_RESOURCE_CDIO: { - struct camu_resource_cdio *cdio = (struct camu_resource_cdio *)resource; + case CAMU_RESOURCE_CDIO: entry = cch_handler_cdio_create(); if (!entry) { resource->load = LIANA_ENTRY_ERRORED; return false; } - cdio->track = MIN(cdio->track, entry->chapters.count); - entry->chapter = &al_array_at(entry->chapters, cdio->track); + resource->index = MIN(resource->index, entry->chapters.count); + entry->chapter = &al_array_at(entry->chapters, resource->index); entry->handler->maybe_spawn_worker(entry->handler, entry->chapter->start); resource->load = LIANA_ENTRY_PREPARED; break; - } #endif } @@ -479,7 +452,7 @@ static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, v case LIANA_META_REMOVED_ENTRY: break; case LIANA_META_CURRENT_CHANGED: - log_info("Now playing: %ls.", entry->name.data); + log_info("Now playing: %.*s.", al_str_x(&entry->brief)); send_clients_current_changed(server, list, entry); break; case LIANA_META_ORDER_CHANGED: @@ -492,7 +465,7 @@ static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, v send_clients_entry_seeked(server, list, entry); break; case LIANA_META_ENTRY_ERRORED: - log_error("Failed to load: %ls.", entry->name.data); + log_error("Failed to load: %.*s.", al_str_x(&entry->brief)); break; } break; @@ -594,9 +567,7 @@ static bool client_command_callback(void *userdata, struct nn_rpc_connection *co case CAMU_CLIENT_REQUEST_VISUAL_DATA: { u32 node_id = nn_packet_read_u32(packet); struct camu_resource *resource = get_resource_by_node_id(server, node_id); - if (resource) { - send_clients_visual_data(resource->server, resource->node->id, &resource->visual_data); - } + (void)resource; break; } } @@ -611,20 +582,19 @@ out: static void simple_search_portal_callback(void *userdata0, void *userdata1, struct camu_portal_result *result) { struct camu_server *server = (struct camu_server *)userdata0; - struct camu_resource_portal *portal = (struct camu_resource_portal *)userdata1; - struct camu_resource *resource = (struct camu_resource *)portal; + struct camu_resource *resource = (struct camu_resource *)userdata1; switch (result->op) { case CAMU_CLIENT_CREATE_SEARCH: if (result->id == -1) { break; } - camu_portal_get_page(&server->bridge, result->id, 0, simple_search_portal_callback, portal); + camu_portal_get_page(&server->bridge, result->id, 0, simple_search_portal_callback, resource); return; case CAMU_CLIENT_GET_PAGE: if (result->id == -1 || !result->page || !result->page->list.count) { break; } - portal->post = camu_post_cache_get(&server->cache, &al_array_at(result->page->list, 0)); + resource->post = camu_post_cache_get(&server->cache, &al_array_at(result->page->list, 0)); resource->type = CAMU_RESOURCE_PORTAL; prepare_server_resource(server, resource); process_pending(resource); @@ -636,31 +606,41 @@ static void simple_search_portal_callback(void *userdata0, void *userdata1, stru } #endif +static u8 parse_resource_type(str *line) +{ +#if defined CAMU_HAVE_PORTAL + if (al_str_at(line, 0) == ';' || camu_is_url(line, 0)) { + return CAMU_RESOURCE_SIMPLE_SEARCH; +#elif defined NAUNET_HAS_CURL + if (camu_is_url(line, 0)) { + return CAMU_RESOURCE_HTTP; +#else + if (0) { +#endif +#if CACHE_HAVE_CDIO + } else if (al_str_cmp(line, &al_str_c("cdda://"), 0, 7) == 0) { + return CAMU_RESOURCE_CDIO; +#endif + } else { + return CAMU_RESOURCE_FILE; + } +} + static void handle_add_command(struct camu_server *server, struct lia_list *list, struct nn_packet *packet) { - u8 op = nn_packet_read_u8(packet); - struct camu_resource *resource = NULL; - wstr name; - switch (op) { + struct camu_resource *resource = al_alloc_object(struct camu_resource); + str line; + nn_packet_read_str(packet, &line); + switch (parse_resource_type(&line)) { case CAMU_RESOURCE_FILE: { - str path; - nn_packet_read_str(packet, &path); - struct camu_resource_file *file = al_alloc_object(struct camu_resource_file); - al_str_clone(&file->path, &path); - al_wstr_from_str(&name, &path); - resource = (struct camu_resource *)file; + al_str_clone(&resource->uri, &line); resource->type = CAMU_RESOURCE_FILE; resource->load = LIANA_ENTRY_UNLOADED; break; } #ifdef NAUNET_HAS_CURL case CAMU_RESOURCE_HTTP: { - str url; - nn_packet_read_str(packet, &url); - struct camu_resource_http *http = al_alloc_object(struct camu_resource_http); - al_str_clone(&http->url, &url); - al_wstr_from_str(&name, &url); - resource = (struct camu_resource *)http; + al_str_clone(&resource->uri, &line); resource->type = CAMU_RESOURCE_HTTP; resource->load = LIANA_ENTRY_UNLOADED; break; @@ -668,20 +648,15 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list #endif #ifdef CACHE_HAVE_CDIO case CAMU_RESOURCE_CDIO: { - str url; - nn_packet_read_str(packet, &url); u32 track = 0; - if (url.length > 7) { + if (line.length > 7) { bool error; - s64 index = al_str_to_long(&al_str_substr(&url, 7, url.length), 10, &error); + s64 index = al_str_to_long(&al_str_substr(&line, 7, line.length), 10, &error); if (!error && index > 0) { track = (u32)index - 1; } } - struct camu_resource_cdio *cdio = al_alloc_object(struct camu_resource_cdio); - cdio->track = track; - al_wstr_from_cstr(&name, "cdio"); - resource = (struct camu_resource *)cdio; + resource->index = track; resource->type = CAMU_RESOURCE_CDIO; resource->load = LIANA_ENTRY_UNLOADED; break; @@ -689,37 +664,30 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list #endif #ifdef CAMU_HAVE_PORTAL case CAMU_RESOURCE_SIMPLE_SEARCH: { - str search; - nn_packet_read_str(packet, &search); - struct camu_resource_portal *portal = al_alloc_object(struct camu_resource_portal); - portal->post = NULL; - al_wstr_from_str(&name, &search); - resource = (struct camu_resource *)portal; + resource->post = NULL; resource->type = CAMU_RESOURCE_SIMPLE_SEARCH; resource->load = LIANA_ENTRY_PREPARING; str query; - if (al_str_at(&search, 0) == ';') { // search. - al_str_clone(&query, &al_str_substr(&search, 1, search.length)); + if (al_str_at(&line, 0) == ';') { // search. + al_str_clone(&query, &al_str_substr(&line, 1, line.length)); } else { al_str_from(&query, "link:"); - al_str_cat(&query, &search); + al_str_cat(&query, &line); } - camu_portal_create_search(&server->bridge, &al_str_c("youtube"), &query, - simple_search_portal_callback, portal); + camu_portal_create_search(&server->bridge, &al_str_c("youtube"), + &query, simple_search_portal_callback, resource); al_str_free(&query); break; } #endif } al_assert(resource); - resource->server = server; al_array_push(server->data.resources, resource); resource->entry = NULL; resource->node = NULL; resource->duration = LIANA_TIMESTAMP_INVALID; al_array_init(resource->pending); - lia_list_add(list, resource, resource->duration, &name); - al_wstr_free(&name); + lia_list_add(list, resource, resource->duration, &line); } static bool list_action_callback(void *userdata, struct nn_rpc_connection *conn, @@ -953,13 +921,12 @@ void camu_server_free(struct camu_server *server) al_array_free(resource->pending); switch (resource->type) { case CAMU_RESOURCE_FILE: { - struct camu_resource_file *file = (struct camu_resource_file *)resource; - al_str_free(&file->path); - al_free(file); + al_str_free(&resource->uri); break; } #ifdef NAUNET_HAS_CURL case CAMU_RESOURCE_HTTP: + al_str_free(&resource->uri); break; #endif #ifdef CACHE_HAVE_CDIO @@ -968,17 +935,14 @@ void camu_server_free(struct camu_server *server) #endif #ifdef CAMU_HAVE_PORTAL case CAMU_RESOURCE_PORTAL: { - struct camu_resource_portal *portal = (struct camu_resource_portal *)resource; - al_free(portal); break; } case CAMU_RESOURCE_SIMPLE_SEARCH: { - struct camu_resource_portal *portal = (struct camu_resource_portal *)resource; - al_free(portal); break; } #endif } + al_free(resource); } al_array_free(server->data.resources); |