summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLori Anderson <lori@rkymtnhi.com>2013-10-29 18:49:09 -0600
committerLori Anderson <lori@rkymtnhi.com>2013-10-29 18:49:09 -0600
commit17bf13aec3297676d9a92c08ab43cc8949b7c563 (patch)
tree0027030aa565c9b6c2006cd67486a31b3ba3437a
parent42fa72e645bfbfab2a0db12d0664423caa751c94 (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.c65
-rw-r--r--src/gstdlnasrc.h3
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