mirror of
https://github.com/morgan9e/UxPlay
synced 2026-04-14 00:04:13 +09:00
whitespace cleanup
This commit is contained in:
@@ -58,7 +58,7 @@ int airplay_video_service_init(raop_t *raop, unsigned short http_port,
|
|||||||
|
|
||||||
airplay_video_t *airplay_video = deregister_airplay_video(raop);
|
airplay_video_t *airplay_video = deregister_airplay_video(raop);
|
||||||
if (airplay_video) {
|
if (airplay_video) {
|
||||||
airplay_video_service_destroy(airplay_video);
|
airplay_video_service_destroy(airplay_video);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calloc guarantees that the 36-character strings apple_session_id and
|
/* calloc guarantees that the 36-character strings apple_session_id and
|
||||||
@@ -74,11 +74,11 @@ int airplay_video_service_init(raop_t *raop, unsigned short http_port,
|
|||||||
snprintf(ptr, 6, "%-5u", http_port);
|
snprintf(ptr, 6, "%-5u", http_port);
|
||||||
ptr = strstr(airplay_video->local_uri_prefix, " ");
|
ptr = strstr(airplay_video->local_uri_prefix, " ");
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!register_airplay_video(raop, airplay_video)) {
|
if (!register_airplay_video(raop, airplay_video)) {
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf(" %p %p\n", airplay_video, get_airplay_video(raop));
|
//printf(" %p %p\n", airplay_video, get_airplay_video(raop));
|
||||||
@@ -118,7 +118,6 @@ airplay_video_service_destroy(airplay_video_t *airplay_video)
|
|||||||
free (airplay_video->master_playlist);
|
free (airplay_video->master_playlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
free (airplay_video);
|
free (airplay_video);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,19 +145,19 @@ const char *get_playback_uuid(airplay_video_t *airplay_video) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void set_uri_prefix(airplay_video_t *airplay_video, char *uri_prefix, int uri_prefix_len) {
|
void set_uri_prefix(airplay_video_t *airplay_video, char *uri_prefix, int uri_prefix_len) {
|
||||||
if (airplay_video->uri_prefix) {
|
if (airplay_video->uri_prefix) {
|
||||||
free (airplay_video->uri_prefix);
|
free (airplay_video->uri_prefix);
|
||||||
}
|
}
|
||||||
airplay_video->uri_prefix = (char *) calloc(uri_prefix_len + 1, sizeof(char));
|
airplay_video->uri_prefix = (char *) calloc(uri_prefix_len + 1, sizeof(char));
|
||||||
memcpy(airplay_video->uri_prefix, uri_prefix, uri_prefix_len);
|
memcpy(airplay_video->uri_prefix, uri_prefix, uri_prefix_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *get_uri_prefix(airplay_video_t *airplay_video) {
|
char *get_uri_prefix(airplay_video_t *airplay_video) {
|
||||||
return airplay_video->uri_prefix;
|
return airplay_video->uri_prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *get_uri_local_prefix(airplay_video_t *airplay_video) {
|
char *get_uri_local_prefix(airplay_video_t *airplay_video) {
|
||||||
return airplay_video->local_uri_prefix;
|
return airplay_video->local_uri_prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *get_master_uri(airplay_video_t *airplay_video) {
|
char *get_master_uri(airplay_video_t *airplay_video) {
|
||||||
@@ -198,7 +197,7 @@ void destroy_media_data_store(airplay_video_t *airplay_video) {
|
|||||||
media_item_t *media_data_store = airplay_video->media_data_store;
|
media_item_t *media_data_store = airplay_video->media_data_store;
|
||||||
if (media_data_store) {
|
if (media_data_store) {
|
||||||
for (int i = 0; i < airplay_video->num_uri ; i ++ ) {
|
for (int i = 0; i < airplay_video->num_uri ; i ++ ) {
|
||||||
if (media_data_store[i].uri) {
|
if (media_data_store[i].uri) {
|
||||||
free (media_data_store[i].uri);
|
free (media_data_store[i].uri);
|
||||||
}
|
}
|
||||||
if (media_data_store[i].playlist) {
|
if (media_data_store[i].playlist) {
|
||||||
@@ -336,7 +335,7 @@ char *adjust_master_playlist (char *fcup_response_data, int fcup_response_datale
|
|||||||
while (ptr != NULL) {
|
while (ptr != NULL) {
|
||||||
counter++;
|
counter++;
|
||||||
ptr++;
|
ptr++;
|
||||||
ptr = strstr(ptr, uri_prefix);
|
ptr = strstr(ptr, uri_prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t len = uri_local_prefix_len - uri_prefix_len;
|
size_t len = uri_local_prefix_len - uri_prefix_len;
|
||||||
|
|||||||
28
lib/dnssd.c
28
lib/dnssd.c
@@ -310,16 +310,16 @@ dnssd_register_raop(dnssd_t *dnssd, unsigned short port)
|
|||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "true");
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "true");
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 4, "0x84");
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 4, "0x84");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "true");
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("true"), "true");
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 3, "0x8c");
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", 3, "0x8c");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("false"), "false");
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "pw", strlen("false"), "false");
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", strlen(RAOP_SF), RAOP_SF);
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sf", strlen(RAOP_SF), RAOP_SF);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sr", strlen(RAOP_SR), RAOP_SR);
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "sr", strlen(RAOP_SR), RAOP_SR);
|
||||||
dnssd->TXTRecordSetValue(&dnssd->raop_record, "ss", strlen(RAOP_SS), RAOP_SS);
|
dnssd->TXTRecordSetValue(&dnssd->raop_record, "ss", strlen(RAOP_SS), RAOP_SS);
|
||||||
@@ -382,8 +382,8 @@ dnssd_register_airplay(dnssd_t *dnssd, unsigned short port)
|
|||||||
switch (dnssd->pin_pw) {
|
switch (dnssd->pin_pw) {
|
||||||
case 1: // display onscreen pin
|
case 1: // display onscreen pin
|
||||||
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true");
|
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true");
|
||||||
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4");
|
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "flags", 3, "0x4");
|
||||||
break;
|
break;
|
||||||
case 2: // require password
|
case 2: // require password
|
||||||
case 3:
|
case 3:
|
||||||
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true");
|
dnssd->TXTRecordSetValue(&dnssd->airplay_record, "pw", strlen("true"), "true");
|
||||||
@@ -476,13 +476,13 @@ dnssd_unregister_airplay(dnssd_t *dnssd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint64_t dnssd_get_airplay_features(dnssd_t *dnssd) {
|
uint64_t dnssd_get_airplay_features(dnssd_t *dnssd) {
|
||||||
uint64_t features = ((uint64_t) dnssd->features2) << 32;
|
uint64_t features = ((uint64_t) dnssd->features2) << 32;
|
||||||
features += (uint64_t) dnssd->features1;
|
features += (uint64_t) dnssd->features1;
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnssd_set_pk(dnssd_t *dnssd, char * pk_str) {
|
void dnssd_set_pk(dnssd_t *dnssd, char * pk_str) {
|
||||||
dnssd->pk = pk_str;
|
dnssd->pk = pk_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnssd_set_airplay_features(dnssd_t *dnssd, int bit, int val) {
|
void dnssd_set_airplay_features(dnssd_t *dnssd, int bit, int val) {
|
||||||
@@ -498,8 +498,8 @@ void dnssd_set_airplay_features(dnssd_t *dnssd, int bit, int val) {
|
|||||||
features = &(dnssd->features1);
|
features = &(dnssd->features1);
|
||||||
}
|
}
|
||||||
if (val) {
|
if (val) {
|
||||||
*features = *features | mask;
|
*features = *features | mask;
|
||||||
} else {
|
} else {
|
||||||
*features = *features & ~mask;
|
*features = *features & ~mask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ http_handler_rate(raop_conn_t *conn, http_request_t *request, http_response_t *r
|
|||||||
if (end && end != rate) {
|
if (end && end != rate) {
|
||||||
rate_value = value;
|
rate_value = value;
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "http_handler_rate: got rate = %.6f", rate_value);
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "http_handler_rate: got rate = %.6f", rate_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
conn->raop->callbacks.on_video_rate(conn->raop->callbacks.cls, rate_value);
|
conn->raop->callbacks.on_video_rate(conn->raop->callbacks.cls, rate_value);
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ http_handler_stop(raop_conn_t *conn, http_request_t *request, http_response_t *r
|
|||||||
static void
|
static void
|
||||||
http_handler_set_property(raop_conn_t *conn,
|
http_handler_set_property(raop_conn_t *conn,
|
||||||
http_request_t *request, http_response_t *response,
|
http_request_t *request, http_response_t *response,
|
||||||
char **response_data, int *response_datalen) {
|
char **response_data, int *response_datalen) {
|
||||||
|
|
||||||
const char *url = http_request_get_url(request);
|
const char *url = http_request_get_url(request);
|
||||||
const char *property = url + strlen("/setProperty?");
|
const char *property = url + strlen("/setProperty?");
|
||||||
@@ -247,12 +247,12 @@ int create_playback_info_plist_xml(playback_info_t *playback_info, char **plist_
|
|||||||
|
|
||||||
plist_t loaded_time_ranges_node = plist_new_array();
|
plist_t loaded_time_ranges_node = plist_new_array();
|
||||||
time_range_to_plist(playback_info->loadedTimeRanges, playback_info->num_loaded_time_ranges,
|
time_range_to_plist(playback_info->loadedTimeRanges, playback_info->num_loaded_time_ranges,
|
||||||
loaded_time_ranges_node);
|
loaded_time_ranges_node);
|
||||||
plist_dict_set_item(res_root_node, "loadedTimeRanges", loaded_time_ranges_node);
|
plist_dict_set_item(res_root_node, "loadedTimeRanges", loaded_time_ranges_node);
|
||||||
|
|
||||||
plist_t seekable_time_ranges_node = plist_new_array();
|
plist_t seekable_time_ranges_node = plist_new_array();
|
||||||
time_range_to_plist(playback_info->seekableTimeRanges, playback_info->num_seekable_time_ranges,
|
time_range_to_plist(playback_info->seekableTimeRanges, playback_info->num_seekable_time_ranges,
|
||||||
seekable_time_ranges_node);
|
seekable_time_ranges_node);
|
||||||
plist_dict_set_item(res_root_node, "seekableTimeRanges", seekable_time_ranges_node);
|
plist_dict_set_item(res_root_node, "seekableTimeRanges", seekable_time_ranges_node);
|
||||||
|
|
||||||
int len;
|
int len;
|
||||||
@@ -264,7 +264,6 @@ int create_playback_info_plist_xml(playback_info_t *playback_info, char **plist_
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* this handles requests from the Client for "Playback information" while the Media is playing on the
|
/* this handles requests from the Client for "Playback information" while the Media is playing on the
|
||||||
Media Player. (The Server gets this information by monitoring the Media Player). The Client could use
|
Media Player. (The Server gets this information by monitoring the Media Player). The Client could use
|
||||||
the information to e.g. update the slider it shows with progress to the player (0%-100%).
|
the information to e.g. update the slider it shows with progress to the player (0%-100%).
|
||||||
@@ -287,11 +286,11 @@ http_handler_playback_info(raop_conn_t *conn, http_request_t *request, http_resp
|
|||||||
conn->raop->callbacks.on_video_acquire_playback_info(conn->raop->callbacks.cls, &playback_info);
|
conn->raop->callbacks.on_video_acquire_playback_info(conn->raop->callbacks.cls, &playback_info);
|
||||||
if (playback_info.duration == -1.0) {
|
if (playback_info.duration == -1.0) {
|
||||||
/* video has finished, reset */
|
/* video has finished, reset */
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "playback_info not available (finishing)");
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "playback_info not available (finishing)");
|
||||||
//httpd_remove_known_connections(conn->raop->httpd);
|
//httpd_remove_known_connections(conn->raop->httpd);
|
||||||
http_response_set_disconnect(response,1);
|
http_response_set_disconnect(response,1);
|
||||||
conn->raop->callbacks.video_reset(conn->raop->callbacks.cls);
|
conn->raop->callbacks.video_reset(conn->raop->callbacks.cls);
|
||||||
return;
|
return;
|
||||||
} else if (playback_info.position == -1.0) {
|
} else if (playback_info.position == -1.0) {
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "playback_info not available");
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "playback_info not available");
|
||||||
return;
|
return;
|
||||||
@@ -345,9 +344,8 @@ http_handler_reverse(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
if (type_PTTH == 1) {
|
if (type_PTTH == 1) {
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "will use socket %d for %s connections", socket_fd, purpose);
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "will use socket %d for %s connections", socket_fd, purpose);
|
||||||
http_response_init(response, "HTTP/1.1", 101, "Switching Protocols");
|
http_response_init(response, "HTTP/1.1", 101, "Switching Protocols");
|
||||||
http_response_add_header(response, "Connection", "Upgrade");
|
http_response_add_header(response, "Connection", "Upgrade");
|
||||||
http_response_add_header(response, "Upgrade", "PTTH/1.0");
|
http_response_add_header(response, "Upgrade", "PTTH/1.0");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
logger_log(conn->raop->logger, LOGGER_ERR, "multiple TPPH connections (%d) are forbidden", type_PTTH );
|
logger_log(conn->raop->logger, LOGGER_ERR, "multiple TPPH connections (%d) are forbidden", type_PTTH );
|
||||||
}
|
}
|
||||||
@@ -368,7 +366,6 @@ http_handler_action(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
int request_id = 0;
|
int request_id = 0;
|
||||||
int fcup_response_statuscode = 0;
|
int fcup_response_statuscode = 0;
|
||||||
bool logger_debug = (logger_get_level(conn->raop->logger) >= LOGGER_DEBUG);
|
bool logger_debug = (logger_get_level(conn->raop->logger) >= LOGGER_DEBUG);
|
||||||
|
|
||||||
|
|
||||||
const char* session_id = http_request_get_header(request, "X-Apple-Session-ID");
|
const char* session_id = http_request_get_header(request, "X-Apple-Session-ID");
|
||||||
if (!session_id) {
|
if (!session_id) {
|
||||||
@@ -405,7 +402,7 @@ http_handler_action(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
/* determine type of data */
|
/* determine type of data */
|
||||||
plist_t req_type_node = plist_dict_get_item(req_root_node, "type");
|
plist_t req_type_node = plist_dict_get_item(req_root_node, "type");
|
||||||
if (!PLIST_IS_STRING(req_type_node)) {
|
if (!PLIST_IS_STRING(req_type_node)) {
|
||||||
goto post_action_error;
|
goto post_action_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
plist_t req_params_node = NULL;
|
plist_t req_params_node = NULL;
|
||||||
@@ -431,15 +428,15 @@ http_handler_action(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
}
|
}
|
||||||
plist_t req_params_item_uuid_node = plist_dict_get_item(req_params_item_node, "uuid");
|
plist_t req_params_item_uuid_node = plist_dict_get_item(req_params_item_node, "uuid");
|
||||||
char* remove_uuid = NULL;
|
char* remove_uuid = NULL;
|
||||||
plist_get_string_val(req_params_item_uuid_node, &remove_uuid);
|
plist_get_string_val(req_params_item_uuid_node, &remove_uuid);
|
||||||
const char *playback_uuid = get_playback_uuid(conn->raop->airplay_video);
|
const char *playback_uuid = get_playback_uuid(conn->raop->airplay_video);
|
||||||
if (strcmp(remove_uuid, playback_uuid)) {
|
if (strcmp(remove_uuid, playback_uuid)) {
|
||||||
logger_log(conn->raop->logger, LOGGER_ERR, "uuid of playlist removal action request did not match current playlist:\n"
|
logger_log(conn->raop->logger, LOGGER_ERR, "uuid of playlist removal action request did not match current playlist:\n"
|
||||||
" current: %s\n remove: %s", playback_uuid, remove_uuid);
|
" current: %s\n remove: %s", playback_uuid, remove_uuid);
|
||||||
} else {
|
} else {
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "removal_uuid matches playback_uuid\n");
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "removal_uuid matches playback_uuid\n");
|
||||||
}
|
}
|
||||||
free (remove_uuid);
|
free (remove_uuid);
|
||||||
}
|
}
|
||||||
logger_log(conn->raop->logger, LOGGER_ERR, "FIXME: playlist removal not yet implemented");
|
logger_log(conn->raop->logger, LOGGER_ERR, "FIXME: playlist removal not yet implemented");
|
||||||
goto finish;
|
goto finish;
|
||||||
@@ -531,11 +528,11 @@ http_handler_action(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
|
|
||||||
if (logger_debug) {
|
if (logger_debug) {
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "FCUP_Response datalen = %d", fcup_response_datalen);
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "FCUP_Response datalen = %d", fcup_response_datalen);
|
||||||
char *data = malloc(fcup_response_datalen + 1);
|
char *data = malloc(fcup_response_datalen + 1);
|
||||||
memcpy(data, fcup_response_data, fcup_response_datalen);
|
memcpy(data, fcup_response_data, fcup_response_datalen);
|
||||||
data[fcup_response_datalen] = '\0';
|
data[fcup_response_datalen] = '\0';
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "begin FCUP Response data:\n%s\nend FCUP Response data",data);
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "begin FCUP Response data:\n%s\nend FCUP Response data",data);
|
||||||
free (data);
|
free (data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -543,24 +540,24 @@ http_handler_action(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
if (ptr) {
|
if (ptr) {
|
||||||
/* this is a master playlist */
|
/* this is a master playlist */
|
||||||
char *uri_prefix = get_uri_prefix(conn->raop->airplay_video);
|
char *uri_prefix = get_uri_prefix(conn->raop->airplay_video);
|
||||||
char ** media_data_store = NULL;
|
char ** media_data_store = NULL;
|
||||||
int num_uri = 0;
|
int num_uri = 0;
|
||||||
|
|
||||||
char *uri_local_prefix = get_uri_local_prefix(conn->raop->airplay_video);
|
char *uri_local_prefix = get_uri_local_prefix(conn->raop->airplay_video);
|
||||||
char *new_master = adjust_master_playlist (fcup_response_data, fcup_response_datalen, uri_prefix, uri_local_prefix);
|
char *new_master = adjust_master_playlist (fcup_response_data, fcup_response_datalen, uri_prefix, uri_local_prefix);
|
||||||
store_master_playlist(conn->raop->airplay_video, new_master);
|
store_master_playlist(conn->raop->airplay_video, new_master);
|
||||||
create_media_uri_table(uri_prefix, fcup_response_data, fcup_response_datalen, &media_data_store, &num_uri);
|
create_media_uri_table(uri_prefix, fcup_response_data, fcup_response_datalen, &media_data_store, &num_uri);
|
||||||
create_media_data_store(conn->raop->airplay_video, media_data_store, num_uri);
|
create_media_data_store(conn->raop->airplay_video, media_data_store, num_uri);
|
||||||
num_uri = get_num_media_uri(conn->raop->airplay_video);
|
num_uri = get_num_media_uri(conn->raop->airplay_video);
|
||||||
set_next_media_uri_id(conn->raop->airplay_video, 0);
|
set_next_media_uri_id(conn->raop->airplay_video, 0);
|
||||||
} else {
|
} else {
|
||||||
/* this is a media playlist */
|
/* this is a media playlist */
|
||||||
assert(fcup_response_data);
|
assert(fcup_response_data);
|
||||||
char *playlist = (char *) calloc(fcup_response_datalen + 1, sizeof(char));
|
char *playlist = (char *) calloc(fcup_response_datalen + 1, sizeof(char));
|
||||||
memcpy(playlist, fcup_response_data, fcup_response_datalen);
|
memcpy(playlist, fcup_response_data, fcup_response_datalen);
|
||||||
int uri_num = get_next_media_uri_id(conn->raop->airplay_video);
|
int uri_num = get_next_media_uri_id(conn->raop->airplay_video);
|
||||||
--uri_num; // (next num is current num + 1)
|
--uri_num; // (next num is current num + 1)
|
||||||
store_media_playlist(conn->raop->airplay_video, playlist, uri_num);
|
store_media_playlist(conn->raop->airplay_video, playlist, uri_num);
|
||||||
float duration = 0.0f;
|
float duration = 0.0f;
|
||||||
int count = analyze_media_playlist(playlist, &duration);
|
int count = analyze_media_playlist(playlist, &duration);
|
||||||
if (count) {
|
if (count) {
|
||||||
@@ -583,7 +580,7 @@ http_handler_action(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
fcup_request((void *) conn, get_media_uri_by_num(conn->raop->airplay_video, uri_num),
|
fcup_request((void *) conn, get_media_uri_by_num(conn->raop->airplay_video, uri_num),
|
||||||
apple_session_id,
|
apple_session_id,
|
||||||
get_next_FCUP_RequestID(conn->raop->airplay_video));
|
get_next_FCUP_RequestID(conn->raop->airplay_video));
|
||||||
set_next_media_uri_id(conn->raop->airplay_video, ++uri_num);
|
set_next_media_uri_id(conn->raop->airplay_video, ++uri_num);
|
||||||
} else {
|
} else {
|
||||||
char * uri_local_prefix = get_uri_local_prefix(conn->raop->airplay_video);
|
char * uri_local_prefix = get_uri_local_prefix(conn->raop->airplay_video);
|
||||||
conn->raop->callbacks.on_video_play(conn->raop->callbacks.cls,
|
conn->raop->callbacks.on_video_play(conn->raop->callbacks.cls,
|
||||||
@@ -599,7 +596,7 @@ http_handler_action(raop_conn_t *conn, http_request_t *request, http_response_t
|
|||||||
http_response_init(response, "HTTP/1.1", 400, "Bad Request");
|
http_response_init(response, "HTTP/1.1", 400, "Bad Request");
|
||||||
|
|
||||||
if (req_root_node) {
|
if (req_root_node) {
|
||||||
plist_free(req_root_node);
|
plist_free(req_root_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -643,23 +640,23 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
|
|||||||
char *header_str = NULL;
|
char *header_str = NULL;
|
||||||
http_request_get_header_string(request, &header_str);
|
http_request_get_header_string(request, &header_str);
|
||||||
logger_log(conn->raop->logger, LOGGER_DEBUG, "request header:\n%s", header_str);
|
logger_log(conn->raop->logger, LOGGER_DEBUG, "request header:\n%s", header_str);
|
||||||
data_is_binary_plist = (strstr(header_str, "x-apple-binary-plist") != NULL);
|
data_is_binary_plist = (strstr(header_str, "x-apple-binary-plist") != NULL);
|
||||||
data_is_text = (strstr(header_str, "text/parameters") != NULL);
|
data_is_text = (strstr(header_str, "text/parameters") != NULL);
|
||||||
data_is_octet = (strstr(header_str, "octet-stream") != NULL);
|
data_is_octet = (strstr(header_str, "octet-stream") != NULL);
|
||||||
free (header_str);
|
free (header_str);
|
||||||
}
|
}
|
||||||
if (!data_is_text && !data_is_octet && !data_is_binary_plist) {
|
if (!data_is_text && !data_is_octet && !data_is_binary_plist) {
|
||||||
goto play_error;
|
goto play_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_is_text) {
|
if (data_is_text) {
|
||||||
logger_log(conn->raop->logger, LOGGER_ERR, "Play request Content is text (unsupported)");
|
logger_log(conn->raop->logger, LOGGER_ERR, "Play request Content is text (unsupported)");
|
||||||
goto play_error;
|
goto play_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_is_octet) {
|
if (data_is_octet) {
|
||||||
logger_log(conn->raop->logger, LOGGER_ERR, "Play request Content is octet-stream (unsupported)");
|
logger_log(conn->raop->logger, LOGGER_ERR, "Play request Content is octet-stream (unsupported)");
|
||||||
goto play_error;
|
goto play_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_is_binary_plist) {
|
if (data_is_binary_plist) {
|
||||||
@@ -671,9 +668,9 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
|
|||||||
} else {
|
} else {
|
||||||
char* playback_uuid = NULL;
|
char* playback_uuid = NULL;
|
||||||
plist_get_string_val(req_uuid_node, &playback_uuid);
|
plist_get_string_val(req_uuid_node, &playback_uuid);
|
||||||
set_playback_uuid(conn->raop->airplay_video, playback_uuid);
|
set_playback_uuid(conn->raop->airplay_video, playback_uuid);
|
||||||
free (playback_uuid);
|
free (playback_uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
plist_t req_content_location_node = plist_dict_get_item(req_root_node, "Content-Location");
|
plist_t req_content_location_node = plist_dict_get_item(req_root_node, "Content-Location");
|
||||||
if (!req_content_location_node) {
|
if (!req_content_location_node) {
|
||||||
@@ -696,18 +693,18 @@ http_handler_play(raop_conn_t *conn, http_request_t *request, http_response_t *r
|
|||||||
plist_t req_start_position_seconds_node = plist_dict_get_item(req_root_node, "Start-Position-Seconds");
|
plist_t req_start_position_seconds_node = plist_dict_get_item(req_root_node, "Start-Position-Seconds");
|
||||||
if (!req_start_position_seconds_node) {
|
if (!req_start_position_seconds_node) {
|
||||||
logger_log(conn->raop->logger, LOGGER_INFO, "No Start-Position-Seconds in Play request");
|
logger_log(conn->raop->logger, LOGGER_INFO, "No Start-Position-Seconds in Play request");
|
||||||
} else {
|
} else {
|
||||||
double start_position = 0.0;
|
double start_position = 0.0;
|
||||||
plist_get_real_val(req_start_position_seconds_node, &start_position);
|
plist_get_real_val(req_start_position_seconds_node, &start_position);
|
||||||
start_position_seconds = (float) start_position;
|
start_position_seconds = (float) start_position;
|
||||||
}
|
}
|
||||||
set_start_position_seconds(conn->raop->airplay_video, (float) start_position_seconds);
|
set_start_position_seconds(conn->raop->airplay_video, (float) start_position_seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ptr = strstr(playback_location, "/master.m3u8");
|
char *ptr = strstr(playback_location, "/master.m3u8");
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
logger_log(conn->raop->logger, LOGGER_ERR, "Content-Location has unsupported form:\n%s\n", playback_location);
|
logger_log(conn->raop->logger, LOGGER_ERR, "Content-Location has unsupported form:\n%s\n", playback_location);
|
||||||
goto play_error;
|
goto play_error;
|
||||||
}
|
}
|
||||||
int prefix_len = (int) (ptr - playback_location);
|
int prefix_len = (int) (ptr - playback_location);
|
||||||
set_uri_prefix(conn->raop->airplay_video, playback_location, prefix_len);
|
set_uri_prefix(conn->raop->airplay_video, playback_location, prefix_len);
|
||||||
@@ -760,7 +757,7 @@ http_handler_hls(raop_conn_t *conn, http_request_t *request, http_response_t *r
|
|||||||
|
|
||||||
if (!strcmp(url, "/master.m3u8")){
|
if (!strcmp(url, "/master.m3u8")){
|
||||||
char * master_playlist = get_master_playlist(conn->raop->airplay_video);
|
char * master_playlist = get_master_playlist(conn->raop->airplay_video);
|
||||||
if (master_playlist) {
|
if (master_playlist) {
|
||||||
size_t len = strlen(master_playlist);
|
size_t len = strlen(master_playlist);
|
||||||
char * data = (char *) malloc(len + 1);
|
char * data = (char *) malloc(len + 1);
|
||||||
memcpy(data, master_playlist, len);
|
memcpy(data, master_playlist, len);
|
||||||
|
|||||||
@@ -81,11 +81,11 @@ on_header_field(llhttp_t *parser, const char *at, size_t length)
|
|||||||
|
|
||||||
/* Allocate space in the current header string */
|
/* Allocate space in the current header string */
|
||||||
if (request->headers[request->headers_index] == NULL) {
|
if (request->headers[request->headers_index] == NULL) {
|
||||||
request->headers[request->headers_index] = calloc(1, length+1);
|
request->headers[request->headers_index] = calloc(1, length + 1);
|
||||||
} else {
|
} else {
|
||||||
request->headers[request->headers_index] = realloc(
|
request->headers[request->headers_index] = realloc(
|
||||||
request->headers[request->headers_index],
|
request->headers[request->headers_index],
|
||||||
strlen(request->headers[request->headers_index])+length+1
|
strlen(request->headers[request->headers_index]) + length + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
assert(request->headers[request->headers_index]);
|
assert(request->headers[request->headers_index]);
|
||||||
@@ -106,11 +106,11 @@ on_header_value(llhttp_t *parser, const char *at, size_t length)
|
|||||||
|
|
||||||
/* Allocate space in the current header string */
|
/* Allocate space in the current header string */
|
||||||
if (request->headers[request->headers_index] == NULL) {
|
if (request->headers[request->headers_index] == NULL) {
|
||||||
request->headers[request->headers_index] = calloc(1, length+1);
|
request->headers[request->headers_index] = calloc(1, length + 1);
|
||||||
} else {
|
} else {
|
||||||
request->headers[request->headers_index] = realloc(
|
request->headers[request->headers_index] = realloc(
|
||||||
request->headers[request->headers_index],
|
request->headers[request->headers_index],
|
||||||
strlen(request->headers[request->headers_index])+length+1
|
strlen(request->headers[request->headers_index]) + length + 1
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
assert(request->headers[request->headers_index]);
|
assert(request->headers[request->headers_index]);
|
||||||
@@ -124,7 +124,7 @@ on_body(llhttp_t *parser, const char *at, size_t length)
|
|||||||
{
|
{
|
||||||
http_request_t *request = parser->data;
|
http_request_t *request = parser->data;
|
||||||
|
|
||||||
request->data = realloc(request->data, request->datalen+length);
|
request->data = realloc(request->data, request->datalen + length);
|
||||||
assert(request->data);
|
assert(request->data);
|
||||||
|
|
||||||
memcpy(request->data+request->datalen, at, length);
|
memcpy(request->data+request->datalen, at, length);
|
||||||
@@ -172,7 +172,7 @@ http_request_destroy(http_request_t *request)
|
|||||||
|
|
||||||
if (request) {
|
if (request) {
|
||||||
free(request->url);
|
free(request->url);
|
||||||
for (i=0; i<request->headers_size; i++) {
|
for (i = 0; i < request->headers_size; i++) {
|
||||||
free(request->headers[i]);
|
free(request->headers[i]);
|
||||||
}
|
}
|
||||||
free(request->headers);
|
free(request->headers);
|
||||||
@@ -273,7 +273,7 @@ http_request_get_header(http_request_t *request, const char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<request->headers_size; i+=2) {
|
for (i = 0; i < request->headers_size; i += 2) {
|
||||||
if (!strcmp(request->headers[i], name)) {
|
if (!strcmp(request->headers[i], name)) {
|
||||||
return request->headers[i+1];
|
return request->headers[i+1];
|
||||||
}
|
}
|
||||||
@@ -305,7 +305,7 @@ http_request_get_header_string(http_request_t *request, char **header_str)
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
for (int i = 0; i < request->headers_size; i++) {
|
for (int i = 0; i < request->headers_size; i++) {
|
||||||
len += strlen(request->headers[i]);
|
len += strlen(request->headers[i]);
|
||||||
if (i%2 == 0) {
|
if (i % 2 == 0) {
|
||||||
len += 2;
|
len += 2;
|
||||||
} else {
|
} else {
|
||||||
len++;
|
len++;
|
||||||
@@ -321,12 +321,12 @@ http_request_get_header_string(http_request_t *request, char **header_str)
|
|||||||
snprintf(p, n, "%s", request->headers[i]);
|
snprintf(p, n, "%s", request->headers[i]);
|
||||||
n -= hlen;
|
n -= hlen;
|
||||||
p += hlen;
|
p += hlen;
|
||||||
if (i%2 == 0) {
|
if (i % 2 == 0) {
|
||||||
snprintf(p, n, ": ");
|
snprintf(p, n, ": ");
|
||||||
n -= 2;
|
n -= 2;
|
||||||
p += 2;
|
p += 2;
|
||||||
} else {
|
} else {
|
||||||
snprintf(p, n, "\n");
|
snprintf(p, n, "\n");
|
||||||
n--;
|
n--;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|||||||
34
lib/raop.c
34
lib/raop.c
@@ -225,8 +225,8 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
logger_log(conn->raop->logger, LOGGER_INFO, "\"nohold\" feature: switch to new connection request from %s", ipaddr);
|
logger_log(conn->raop->logger, LOGGER_INFO, "\"nohold\" feature: switch to new connection request from %s", ipaddr);
|
||||||
if (conn->raop->callbacks.video_reset) {
|
if (conn->raop->callbacks.video_reset) {
|
||||||
conn->raop->callbacks.video_reset(conn->raop->callbacks.cls);
|
conn->raop->callbacks.video_reset(conn->raop->callbacks.cls);
|
||||||
}
|
}
|
||||||
httpd_remove_known_connections(conn->raop->httpd);
|
httpd_remove_known_connections(conn->raop->httpd);
|
||||||
} else {
|
} else {
|
||||||
logger_log(conn->raop->logger, LOGGER_WARNING, "rejecting new connection request from %s", ipaddr);
|
logger_log(conn->raop->logger, LOGGER_WARNING, "rejecting new connection request from %s", ipaddr);
|
||||||
*response = http_response_create();
|
*response = http_response_create();
|
||||||
@@ -245,7 +245,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
conn->client_session_id = (char *) malloc(len);
|
conn->client_session_id = (char *) malloc(len);
|
||||||
strncpy(conn->client_session_id, client_session_id, len);
|
strncpy(conn->client_session_id, client_session_id, len);
|
||||||
/* airplay video has been requested: shut down any running RAOP udp services */
|
/* airplay video has been requested: shut down any running RAOP udp services */
|
||||||
raop_conn_t *raop_conn = (raop_conn_t *) httpd_get_connection_by_type(conn->raop->httpd, CONNECTION_TYPE_RAOP, 1);
|
raop_conn_t *raop_conn = (raop_conn_t *) httpd_get_connection_by_type(conn->raop->httpd, CONNECTION_TYPE_RAOP, 1);
|
||||||
if (raop_conn) {
|
if (raop_conn) {
|
||||||
raop_rtp_mirror_t *raop_rtp_mirror = raop_conn->raop_rtp_mirror;
|
raop_rtp_mirror_t *raop_rtp_mirror = raop_conn->raop_rtp_mirror;
|
||||||
if (raop_rtp_mirror) {
|
if (raop_rtp_mirror) {
|
||||||
@@ -273,7 +273,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
httpd_set_connection_type(conn->raop->httpd, ptr, CONNECTION_TYPE_HLS);
|
httpd_set_connection_type(conn->raop->httpd, ptr, CONNECTION_TYPE_HLS);
|
||||||
conn->connection_type = CONNECTION_TYPE_HLS;
|
conn->connection_type = CONNECTION_TYPE_HLS;
|
||||||
} else {
|
} else {
|
||||||
logger_log(conn->raop->logger, LOGGER_WARNING, "connection from unknown connection type");
|
logger_log(conn->raop->logger, LOGGER_WARNING, "connection from unknown connection type");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,9 +310,9 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
if (request_data && logger_debug) {
|
if (request_data && logger_debug) {
|
||||||
if (request_datalen > 0) {
|
if (request_datalen > 0) {
|
||||||
/* logger has a buffer limit of 4096 */
|
/* logger has a buffer limit of 4096 */
|
||||||
if (data_is_plist) {
|
if (data_is_plist) {
|
||||||
plist_t req_root_node = NULL;
|
plist_t req_root_node = NULL;
|
||||||
plist_from_bin(request_data, request_datalen, &req_root_node);
|
plist_from_bin(request_data, request_datalen, &req_root_node);
|
||||||
char * plist_xml = NULL;
|
char * plist_xml = NULL;
|
||||||
char * stripped_xml = NULL;
|
char * stripped_xml = NULL;
|
||||||
uint32_t plist_len;
|
uint32_t plist_len;
|
||||||
@@ -353,7 +353,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
if (!strcmp(method, "POST")) {
|
if (!strcmp(method, "POST")) {
|
||||||
if (!strcmp(url, "/feedback")) {
|
if (!strcmp(url, "/feedback")) {
|
||||||
handler = &raop_handler_feedback;
|
handler = &raop_handler_feedback;
|
||||||
} else if (!strcmp(url, "/pair-pin-start")) {
|
} else if (!strcmp(url, "/pair-pin-start")) {
|
||||||
handler = &raop_handler_pairpinstart;
|
handler = &raop_handler_pairpinstart;
|
||||||
} else if (!strcmp(url, "/pair-setup-pin")) {
|
} else if (!strcmp(url, "/pair-setup-pin")) {
|
||||||
handler = &raop_handler_pairsetup_pin;
|
handler = &raop_handler_pairsetup_pin;
|
||||||
@@ -388,7 +388,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
handler = &raop_handler_teardown;
|
handler = &raop_handler_teardown;
|
||||||
} else {
|
} else {
|
||||||
http_response_init(*response, protocol, 501, "Not Implemented");
|
http_response_init(*response, protocol, 501, "Not Implemented");
|
||||||
}
|
}
|
||||||
} else if (!hls_request && !strcmp(protocol, "HTTP/1.1")) {
|
} else if (!hls_request && !strcmp(protocol, "HTTP/1.1")) {
|
||||||
if (!strcmp(method, "POST")) {
|
if (!strcmp(method, "POST")) {
|
||||||
if (!strcmp(url, "/reverse")) {
|
if (!strcmp(url, "/reverse")) {
|
||||||
@@ -415,9 +415,9 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
handler = &http_handler_playback_info;
|
handler = &http_handler_playback_info;
|
||||||
}
|
}
|
||||||
} else if (!strcmp(method, "PUT")) {
|
} else if (!strcmp(method, "PUT")) {
|
||||||
if (!strncmp (url, "/setProperty?", strlen("/setProperty?"))) {
|
if (!strncmp (url, "/setProperty?", strlen("/setProperty?"))) {
|
||||||
handler = &http_handler_set_property;
|
handler = &http_handler_set_property;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (hls_request) {
|
} else if (hls_request) {
|
||||||
handler = &http_handler_hls;
|
handler = &http_handler_hls;
|
||||||
@@ -426,8 +426,8 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
if (handler != NULL) {
|
if (handler != NULL) {
|
||||||
handler(conn, request, *response, &response_data, &response_datalen);
|
handler(conn, request, *response, &response_data, &response_datalen);
|
||||||
} else {
|
} else {
|
||||||
logger_log(conn->raop->logger, LOGGER_INFO,
|
logger_log(conn->raop->logger, LOGGER_INFO,
|
||||||
"Unhandled Client Request: %s %s %s", method, url, protocol);
|
"Unhandled Client Request: %s %s %s", method, url, protocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
finish:;
|
finish:;
|
||||||
@@ -435,7 +435,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
http_response_add_header(*response, "Server", "AirTunes/"GLOBAL_VERSION);
|
http_response_add_header(*response, "Server", "AirTunes/"GLOBAL_VERSION);
|
||||||
if (cseq) {
|
if (cseq) {
|
||||||
http_response_add_header(*response, "CSeq", cseq);
|
http_response_add_header(*response, "CSeq", cseq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
http_response_finish(*response, response_data, response_datalen);
|
http_response_finish(*response, response_data, response_datalen);
|
||||||
|
|
||||||
@@ -488,7 +488,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) {
|
|||||||
}
|
}
|
||||||
if (response_data) {
|
if (response_data) {
|
||||||
free(response_data);
|
free(response_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -646,10 +646,10 @@ raop_destroy(raop_t *raop) {
|
|||||||
pairing_destroy(raop->pairing);
|
pairing_destroy(raop->pairing);
|
||||||
httpd_destroy(raop->httpd);
|
httpd_destroy(raop->httpd);
|
||||||
logger_destroy(raop->logger);
|
logger_destroy(raop->logger);
|
||||||
if (raop->nonce) {
|
if (raop->nonce) {
|
||||||
free(raop->nonce);
|
free(raop->nonce);
|
||||||
}
|
}
|
||||||
if (raop->random_pw) {
|
if (raop->random_pw) {
|
||||||
free(raop->random_pw);
|
free(raop->random_pw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
10
lib/utils.c
10
lib/utils.c
@@ -312,20 +312,20 @@ char *utils_strip_data_from_plist_xml(char *plist_xml) {
|
|||||||
nchars = eol + 1 - ptr1;
|
nchars = eol + 1 - ptr1;
|
||||||
memcpy(ptr2, ptr1, nchars);
|
memcpy(ptr2, ptr1, nchars);
|
||||||
ptr2 += nchars;
|
ptr2 += nchars;
|
||||||
ptr1 += nchars;
|
ptr1 += nchars;
|
||||||
end = strstr(ptr1, "</data>");
|
end = strstr(ptr1, "</data>");
|
||||||
assert(end);
|
assert(end);
|
||||||
count = 0;
|
count = 0;
|
||||||
do {
|
do {
|
||||||
eol_data = eol;
|
eol_data = eol;
|
||||||
eol = strchr(eol + 1, '\n');
|
eol = strchr(eol + 1, '\n');
|
||||||
count++;
|
count++;
|
||||||
} while (eol < end);
|
} while (eol < end);
|
||||||
count--; // last '\n' counted ends the first non-data line (contains "</data>")
|
count--; // last '\n' counted ends the first non-data line (contains "</data>")
|
||||||
if (count > 1) {
|
if (count > 1) {
|
||||||
snprintf(line, sizeof(line), " (%d lines data omitted, 64 chars/line)\n", count);
|
snprintf(line, sizeof(line), " (%d lines data omitted, 64 chars/line)\n", count);
|
||||||
nchars = strlen(line);
|
nchars = strlen(line);
|
||||||
memcpy(ptr2, line, nchars);
|
memcpy(ptr2, line, nchars);
|
||||||
ptr2 += nchars;
|
ptr2 += nchars;
|
||||||
ptr1 = eol_data + 1;
|
ptr1 = eol_data + 1;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user