From d4cd0b12f32a3250de21a9c496c598413de355e9 Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Tue, 9 Dec 2025 13:34:51 -0500 Subject: [PATCH] cleanup (?) of writing to airplay_video struct --- lib/airplay_video.c | 93 +++++++++++++++++++++++++++------------------ lib/airplay_video.h | 13 ++++--- lib/http_handlers.h | 35 +++++++++-------- 3 files changed, 79 insertions(+), 62 deletions(-) diff --git a/lib/airplay_video.c b/lib/airplay_video.c index 626ae63..921f0e4 100644 --- a/lib/airplay_video.c +++ b/lib/airplay_video.c @@ -126,15 +126,62 @@ airplay_video_destroy(airplay_video_t *airplay_video) { airplay_video = NULL; } -void set_apple_session_id(airplay_video_t *airplay_video, const char * apple_session_id) { +void set_apple_session_id(airplay_video_t *airplay_video, const char * apple_session_id, size_t len) { + assert(apple_session_id && len == 36); + char *str = (char *) calloc(len + 1, sizeof(char)); + strncpy(str, apple_session_id, len); if (airplay_video->apple_session_id) { - free (airplay_video->apple_session_id); + free(airplay_video->apple_session_id); } - assert(apple_session_id && strlen(apple_session_id) == 36); - airplay_video->apple_session_id = (char *) calloc(strlen(apple_session_id) + 1, sizeof(char)); - memcpy(airplay_video->apple_session_id, apple_session_id, strlen(apple_session_id)); + airplay_video->apple_session_id = str; + str = NULL; } +void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid, size_t len) { + assert(playback_uuid && len == 36); + char *str = (char *) calloc(len + 1, sizeof(char)); + strncpy(str, playback_uuid, len); + if (airplay_video->playback_uuid) { + free(airplay_video->playback_uuid); + } + airplay_video->playback_uuid = str; + str = NULL; +} + +void set_uri_prefix(airplay_video_t *airplay_video, const char *uri_prefix, size_t len) { + assert(uri_prefix && len ); + char *str = (char *) calloc(len + 1, sizeof(char)); + strncpy(str, uri_prefix, len); + if (airplay_video->uri_prefix) { + free(airplay_video->uri_prefix); + } + airplay_video->uri_prefix = str; + str = NULL; +} + +void set_language_name(airplay_video_t *airplay_video, const char *language_name, size_t len) { + assert(language_name && len ); + char *str = (char *) calloc(len + 1, sizeof(char)); + strncpy(str, language_name, len); + if (airplay_video->language_name) { + free(airplay_video->language_name); + } + airplay_video->language_name = str; + str = NULL; +} + +void set_language_code(airplay_video_t *airplay_video, const char *language_code, size_t len) { + assert(language_code && len ); + char *str = (char *) calloc(len + 1, sizeof(char)); + strncpy(str, language_code, len); + if (airplay_video->language_code) { + free(airplay_video->language_code); + } + airplay_video->language_code = str; + str = NULL; +} + + const char *get_apple_session_id(airplay_video_t *airplay_video) { if (!airplay_video || !airplay_video->apple_session_id) { return NULL; @@ -165,48 +212,18 @@ void set_resume_position_seconds(airplay_video_t *airplay_video, float resume_po airplay_video->resume_position_seconds = resume_position_seconds; } -void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid) { - if (airplay_video->playback_uuid) { - free (airplay_video->playback_uuid); - } - assert(playback_uuid && strlen(playback_uuid) == 36); - airplay_video->playback_uuid = (char *) calloc(strlen(playback_uuid) + 1, sizeof(char)); - memcpy(airplay_video->playback_uuid, playback_uuid, strlen(playback_uuid)); -} - const char *get_playback_uuid(airplay_video_t *airplay_video) { return (const char *) (!airplay_video ? NULL : airplay_video->playback_uuid); } -void set_uri_prefix(airplay_video_t *airplay_video, char *uri_prefix) { - if (airplay_video->uri_prefix) { - free (airplay_video->uri_prefix); - } - airplay_video->uri_prefix = uri_prefix; -} - const char *get_uri_prefix(airplay_video_t *airplay_video) { return (const char *) airplay_video->uri_prefix; } -void set_language_name(airplay_video_t *airplay_video, char *language_name) { - if (airplay_video->language_name) { - free (airplay_video->language_name); - } - airplay_video->language_name = language_name; -} - const char *get_language_name(airplay_video_t *airplay_video) { return (const char *)airplay_video->language_name; } -void set_language_code(airplay_video_t *airplay_video, char *language_code) {; - if (airplay_video->language_code) { - free (airplay_video->language_code); - } - airplay_video->language_code = language_code; -} - const char *get_language_code(airplay_video_t *airplay_video) { return (const char *) airplay_video->language_code; } @@ -418,14 +435,14 @@ char * select_master_playlist_language(airplay_video_t *airplay_video, char *mas /* update stored language code, name if changed */ if (name != language_name) { /* compare addresses */ - int len = strlen(name); + size_t len = strlen(name); char *new_language_name = (char *) calloc(len + 1, sizeof(char)); memcpy(new_language_name, name, len); - set_language_name(airplay_video, new_language_name); + set_language_name(airplay_video, new_language_name, len); len = strlen(code); char *new_language_code = (char *) calloc(len + 1, sizeof(char)); memcpy(new_language_code, code, len); - set_language_code(airplay_video, new_language_code); + set_language_code(airplay_video, new_language_code, len); } int len = 0; diff --git a/lib/airplay_video.h b/lib/airplay_video.h index 179cb25..8a547a4 100644 --- a/lib/airplay_video.h +++ b/lib/airplay_video.h @@ -17,30 +17,31 @@ #ifndef AIRPLAY_VIDEO_H #define AIRPLAY_VIDEO_H - +#include #include #include #include "raop.h" #include "logger.h" + typedef struct airplay_video_s airplay_video_t; typedef struct media_item_s media_item_t; -void set_apple_session_id(airplay_video_t *airplay_video, const char *apple_session_id); +void set_apple_session_id(airplay_video_t *airplay_video, const char *apple_session_id, size_t len); const char *get_apple_session_id(airplay_video_t *airplay_video); void set_start_position_seconds(airplay_video_t *airplay_video, float start_position_seconds); void set_resume_position_seconds(airplay_video_t *airplay_video, float resume_position_seconds); float get_duration(airplay_video_t *airplay_video); float get_start_position_seconds(airplay_video_t *airplay_video); float get_resume_position_seconds(airplay_video_t *airplay_video); -void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid); +void set_playback_uuid(airplay_video_t *airplay_video, const char *playback_uuid, size_t len); const char *get_playback_uuid(airplay_video_t *airplay_video); -void set_uri_prefix(airplay_video_t *airplay_video, char *uri_prefix); +void set_uri_prefix(airplay_video_t *airplay_video, const char *uri_prefix, size_t len); const char *get_uri_prefix(airplay_video_t *airplay_video); char *get_uri_local_prefix(airplay_video_t *airplay_video); -void set_language_code(airplay_video_t *airplay_video, char *language_code); +void set_language_code(airplay_video_t *airplay_video, const char *language_code, size_t len); const char *get_language_code(airplay_video_t *airplay_video); -void set_language_name(airplay_video_t *airplay_video, char *language_name); +void set_language_name(airplay_video_t *airplay_video, const char *language_name, size_t len); const char *get_language_name(airplay_video_t *airplay_video); int get_next_FCUP_RequestID(airplay_video_t *airplay_video); diff --git a/lib/http_handlers.h b/lib/http_handlers.h index 23c46df..14e4635 100644 --- a/lib/http_handlers.h +++ b/lib/http_handlers.h @@ -214,16 +214,14 @@ http_handler_set_property(raop_conn_t *conn, } } plist_free (req_root_node); - const char *lname = NULL, *lcode = NULL; - if (language_code) { - set_language_code(airplay_video, language_code); - lcode = get_language_code(airplay_video); + if (language_code && language_name) { + set_language_code(airplay_video, language_code, strlen(language_code)); + set_language_name(airplay_video, language_name, strlen(language_name)); + logger_log(conn->raop->logger, LOGGER_INFO, "stored language from MediaSelectionOptions: %s \"%s\"", + get_language_code(airplay_video), get_language_name(airplay_video)); } - if (language_name) { - set_language_name(airplay_video, language_name); - lname = get_language_name(airplay_video); - } - logger_log(conn->raop->logger, LOGGER_INFO, "stored language from MediaSelectionOptions: %s \"%s\"", lcode, lname); + plist_mem_free(language_name); + plist_mem_free(language_code); } else if (!strcmp(property, "reverseEndTime") || !strcmp(property, "forwardEndTime") || !strcmp(property, "actionAtItemEnd")) { @@ -745,7 +743,7 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r printf("use: airplay_video[%d] %p %s %s\n", id, airplay_video, playback_uuid, get_playback_uuid(airplay_video)); airplay_video = conn->raop->airplay_video[id]; assert(airplay_video); - set_apple_session_id(airplay_video, apple_session_id); + set_apple_session_id(airplay_video, apple_session_id, strlen(apple_session_id)); char * uri_local_prefix = get_uri_local_prefix(airplay_video); conn->raop->callbacks.on_video_play(conn->raop->callbacks.cls, strcat(uri_local_prefix, "/master.m3u8"), @@ -789,7 +787,7 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r airplay_video = airplay_video_init(conn->raop, conn->raop->port, conn->raop->lang); if (airplay_video) { - set_playback_uuid(airplay_video, playback_uuid); + set_playback_uuid(airplay_video, playback_uuid, strlen(playback_uuid)); plist_mem_free (playback_uuid); conn->raop->current_video = id; conn->raop->airplay_video[id] = airplay_video; @@ -818,7 +816,7 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r get_duration(conn->raop->airplay_video[i])); } #endif - set_apple_session_id(airplay_video, apple_session_id); + set_apple_session_id(airplay_video, apple_session_id, strlen(apple_session_id)); plist_t req_content_location_node = plist_dict_get_item(req_root_node, "Content-Location"); if (!req_content_location_node) { @@ -849,15 +847,16 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r } set_start_position_seconds(airplay_video, (float) start_position_seconds); - char *ptr = strstr(playback_location, "/master.m3u8"); - if (!ptr) { + if (!strstr(playback_location, "/master.m3u8")) { logger_log(conn->raop->logger, LOGGER_ERR, "Content-Location has unsupported form:\n%s\n", playback_location); goto play_error; } else { - int prefix_len = (int) (ptr - playback_location); - char *uri_prefix = (char *) calloc(prefix_len + 1, sizeof(char)); - memcpy(uri_prefix, playback_location, prefix_len); - set_uri_prefix(airplay_video, uri_prefix); + char *uri_prefix = (char *) calloc(strlen(playback_location) + 1, sizeof(char)); + strncpy(uri_prefix, playback_location, strlen(playback_location)); + char *ptr = strstr(uri_prefix, "/master.m3u8"); + *ptr = '\0'; + set_uri_prefix(airplay_video, uri_prefix, strlen(uri_prefix)); + free (uri_prefix); } set_next_media_uri_id(airplay_video, 0); printf("FCUP REQUEST\n");