diff options
author | Lori Anderson <lori@rkymtnhi.com> | 2013-10-29 18:49:09 -0600 |
---|---|---|
committer | Lori Anderson <lori@rkymtnhi.com> | 2013-10-29 18:49:09 -0600 |
commit | 17bf13aec3297676d9a92c08ab43cc8949b7c563 (patch) | |
tree | 0027030aa565c9b6c2006cd67486a31b3ba3437a | |
parent | 42fa72e645bfbfab2a0db12d0664423caa751c94 (diff) |
Add logic to parse the DLNA.ORG_CI sub field in protocol info, store value and print it out.
-rw-r--r-- | src/gstdlnasrc.c | 65 | ||||
-rw-r--r-- | src/gstdlnasrc.h | 3 |
2 files changed, 68 insertions, 0 deletions
diff --git a/src/gstdlnasrc.c b/src/gstdlnasrc.c index 667a798..23cedc9 100644 --- a/src/gstdlnasrc.c +++ b/src/gstdlnasrc.c @@ -123,12 +123,14 @@ static const gchar *CONTENT_FEATURES_HEADERS[] = { "DLNA.ORG_OP", // 1 "DLNA.ORG_PS", // 2 "DLNA.ORG_FLAGS", // 3 + "DLNA.ORG_CI", // 4 }; #define HEADER_INDEX_PN 0 #define HEADER_INDEX_OP 1 #define HEADER_INDEX_PS 2 #define HEADER_INDEX_FLAGS 3 +#define HEADER_INDEX_CI 4 // Subfield headers with CONTENT-TYPE static const gchar *CONTENT_TYPE_HEADERS[] = { @@ -282,6 +284,10 @@ static gboolean dlna_src_head_response_parse_playspeeds (GstDlnaSrc * static gboolean dlna_src_head_response_parse_flags (GstDlnaSrc * dlna_src, GstDlnaSrcHeadResponse * head_response, gint idx, const gchar * field_str); +static gboolean +dlna_src_head_response_parse_conversion_indicator (GstDlnaSrc * dlna_src, + GstDlnaSrcHeadResponse * head_response, gint idx, const gchar * field_str); + static gboolean dlna_src_head_response_parse_content_type (GstDlnaSrc * dlna_src, GstDlnaSrcHeadResponse * head_response, gint idx, const gchar * field_str); @@ -2351,6 +2357,11 @@ dlna_src_head_response_init_struct (GstDlnaSrc * dlna_src, head_response->content_features->flag_full_clear_text_set = FALSE; head_response->content_features->flag_limited_clear_text_set = FALSE; + // {"DLNA.ORG_PN", STRING_TYPE} + head_response->content_features->conversion_idx = HEADER_INDEX_CI; + head_response->content_features->is_converted = FALSE; + + *head_response_ptr = head_response; return TRUE; } @@ -2809,10 +2820,12 @@ dlna_src_head_response_parse_content_features (GstDlnaSrc * dlna_src, //"DLNA.ORG_OP" //"DLNA.ORG_PS" //"DLNA.ORG_FLAGS" + //"DLNA.ORG_CI" gchar *pn_str = NULL; gchar *op_str = NULL; gchar *ps_str = NULL; gchar *flags_str = NULL; + gchar *ci_str = NULL; gchar **tokens = NULL; gchar *tmp_str = NULL; @@ -2853,6 +2866,14 @@ dlna_src_head_response_parse_content_features (GstDlnaSrc * dlna_src, GST_LOG_OBJECT (dlna_src, "Found field: %s", CONTENT_FEATURES_HEADERS[HEADER_INDEX_FLAGS]); flags_str = *ptr; + } + // "DLNA.ORG_CI" + else if ((tmp_str = + strstr (g_ascii_strup (*ptr, strlen (*ptr)), + CONTENT_FEATURES_HEADERS[HEADER_INDEX_CI])) != NULL) { + GST_LOG_OBJECT (dlna_src, "Found field: %s", + CONTENT_FEATURES_HEADERS[HEADER_INDEX_CI]); + ci_str = *ptr; } else { GST_WARNING_OBJECT (dlna_src, "Unrecognized sub field:%s", *ptr); } @@ -2887,6 +2908,13 @@ dlna_src_head_response_parse_content_features (GstDlnaSrc * dlna_src, flags_str); } } + if (ci_str != NULL) { + if (!dlna_src_head_response_parse_conversion_indicator (dlna_src, + head_response, idx, ci_str)) { + GST_WARNING_OBJECT (dlna_src, + "Problems parsing conversion indicator sub field: %s", ci_str); + } + } g_strfreev (tokens); return TRUE; } @@ -3128,6 +3156,40 @@ dlna_src_head_response_parse_flags (GstDlnaSrc * dlna_src, } /** + * Parse DLNA conversion indicator sub field identified by DLNA.ORG_CI header. + * + * @param dlna_src this element + * @param idx index into array of header strings + * @param field_str sub field string containing DLNA.ORG_CI field + * + * @return TRUE + */ +static gboolean +dlna_src_head_response_parse_conversion_indicator (GstDlnaSrc * dlna_src, + GstDlnaSrcHeadResponse * head_response, gint idx, const gchar * field_str) +{ + GST_LOG_OBJECT (dlna_src, "Found CI Field: %s", field_str); + gint ret_code = 0; + + gchar tmp1[256] = { 0 }; + gchar tmp2[256] = { 0 }; + + if ((ret_code = sscanf (field_str, "%255[^=]=%s", tmp1, tmp2)) != 2) { + GST_WARNING_OBJECT (dlna_src, + "Problems parsing DLNA.ORG_CI from HEAD response field header %s, value: %s, retcode: %d, tmp: %s, %s", + HEAD_RESPONSE_HEADERS[idx], field_str, ret_code, tmp1, tmp2); + } else { + if (tmp2[0] == '1') { + head_response->content_features->is_converted = TRUE; + } else { + head_response->content_features->is_converted = FALSE; + } + } + + return TRUE; +} + +/** * Parse content type identified by CONTENT-TYPE header. Includes additional * subfields when content is DTCP encrypted. * @@ -3422,6 +3484,9 @@ dlna_src_head_response_struct_to_str (GstDlnaSrc * dlna_src, struct_str = g_string_append (struct_str, "\n"); dlna_src_struct_append_header_value_bool (struct_str, + "Conversion Indicator?: ", head_response->content_features->is_converted); + + dlna_src_struct_append_header_value_bool (struct_str, "Time Seek Supported Flag?: ", head_response->content_features->op_time_seek_supported); diff --git a/src/gstdlnasrc.h b/src/gstdlnasrc.h index 26748dc..c9134c0 100644 --- a/src/gstdlnasrc.h +++ b/src/gstdlnasrc.h @@ -223,6 +223,9 @@ struct _GstDlnaSrcHeadResponseContentFeatures gboolean flag_link_protected_set; gboolean flag_full_clear_text_set; gboolean flag_limited_clear_text_set; + + gint conversion_idx; + gboolean is_converted; }; struct _GstDlnaSrcClass |