summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorEdward Hervey <edward.hervey@collabora.co.uk>2012-06-19 10:22:50 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-06-19 10:54:51 +0100
commit068598e2373ce898249cdbe42a2f6fed4a4a849d (patch)
tree2412408a621773c1be661c708cd958359f2e0f5e /sys
parent1ee6a359492ee5665a2488ebb9f4b5f4d4d5e954 (diff)
downloadgstreamer-plugins-bad-068598e2373ce898249cdbe42a2f6fed4a4a849d.tar.gz
dvbbasebin: Emit an error when we fail reading the channels file
Conflicts: sys/dvb/dvbbasebin.c
Diffstat (limited to 'sys')
-rw-r--r--sys/dvb/dvbbasebin.c2
-rw-r--r--sys/dvb/parsechannels.c166
-rw-r--r--sys/dvb/parsechannels.h3
3 files changed, 90 insertions, 81 deletions
diff --git a/sys/dvb/dvbbasebin.c b/sys/dvb/dvbbasebin.c
index 415e3d632..c8e66499c 100644
--- a/sys/dvb/dvbbasebin.c
+++ b/sys/dvb/dvbbasebin.c
@@ -987,7 +987,7 @@ dvb_base_bin_uri_set_uri (GstURIHandler * handler, const gchar * uri,
if (location == NULL)
goto no_location;
- if (!set_properties_for_channel (G_OBJECT (dvbbasebin), location))
+ if (!set_properties_for_channel (GST_ELEMENT (dvbbasebin), location))
goto set_properties_failed;
/* FIXME: here is where we parse channels.conf */
diff --git a/sys/dvb/parsechannels.c b/sys/dvb/parsechannels.c
index d0f338ccc..3ab5df27c 100644
--- a/sys/dvb/parsechannels.c
+++ b/sys/dvb/parsechannels.c
@@ -30,8 +30,8 @@
#include "parsechannels.h"
/* this will do zap style channels.conf only for the moment*/
-GHashTable *
-parse_channels_conf_from_file (const gchar * filename)
+static GHashTable *
+parse_channels_conf_from_file (GstElement * dvbbasebin, const gchar * filename)
{
gchar *contents;
gchar **lines;
@@ -48,85 +48,95 @@ parse_channels_conf_from_file (const gchar * filename)
"modulation"
};
int i;
- GHashTable *res = NULL;
-
- if (g_file_get_contents (filename, &contents, NULL, NULL)) {
- lines = g_strsplit (contents, "\n", 0);
- res = g_hash_table_new (g_str_hash, g_str_equal);
-
- i = 0;
- line = lines[0];
- while (line != NULL) {
- if (line[0] != '#') {
- int numfields;
- gboolean parsed = FALSE;
- GHashTable *params = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_free);
-
- fields = g_strsplit (line, ":", 0);
- numfields = g_strv_length (fields);
- if (numfields == 8) {
- /* satellite */
- int j;
-
- g_hash_table_insert (params, g_strdup ("type"),
- g_strdup ("satellite"));
- for (j = 2; j <= 4; j++) {
- g_hash_table_insert (params, g_strdup (satellite[j - 2]),
- g_strdup (fields[j]));
- }
- g_hash_table_insert (params, g_strdup ("frequency"),
- g_strdup_printf ("%d", atoi (fields[1]) * 1000));
- parsed = TRUE;
- } else if (numfields == 13) {
- /* terrestrial */
- int j;
-
- g_hash_table_insert (params, g_strdup ("type"),
- g_strdup ("terrestrial"));
- for (j = 2; j <= 9; j++) {
- g_hash_table_insert (params, g_strdup (terrestrial[j - 2]),
- g_strdup (fields[j]));
- }
- g_hash_table_insert (params, g_strdup ("frequency"),
- g_strdup (fields[1]));
- parsed = TRUE;
- } else if (numfields == 9) {
- /* cable */
- int j;
-
- g_hash_table_insert (params, g_strdup ("type"), g_strdup ("cable"));
- for (j = 2; j <= 5; j++) {
- g_hash_table_insert (params, g_strdup (cable[j - 2]),
- g_strdup (fields[j]));
- }
- g_hash_table_insert (params, g_strdup ("frequency"),
- g_strdup (fields[1]));
- parsed = TRUE;
- } else if (numfields == 6) {
- /* atsc (vsb/qam) */
- g_hash_table_insert (params, g_strdup ("type"), g_strdup ("atsc"));
- g_hash_table_insert (params, g_strdup ("modulation"),
- g_strdup (fields[2]));
-
- g_hash_table_insert (params, g_strdup ("frequency"),
- g_strdup (fields[1]));
- parsed = TRUE;
+ GHashTable *res;
+ GError *err = NULL;
+
+ if (!g_file_get_contents (filename, &contents, NULL, &err))
+ goto open_fail;
+
+ lines = g_strsplit (contents, "\n", 0);
+ res = g_hash_table_new (g_str_hash, g_str_equal);
+
+ i = 0;
+ line = lines[0];
+ while (line != NULL) {
+ if (line[0] != '#') {
+ int numfields;
+ gboolean parsed = FALSE;
+ GHashTable *params = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_free);
+
+ fields = g_strsplit (line, ":", 0);
+ numfields = g_strv_length (fields);
+ if (numfields == 8) {
+ /* satellite */
+ int j;
+
+ g_hash_table_insert (params, g_strdup ("type"), g_strdup ("satellite"));
+ for (j = 2; j <= 4; j++) {
+ g_hash_table_insert (params, g_strdup (satellite[j - 2]),
+ g_strdup (fields[j]));
}
- if (parsed) {
- g_hash_table_insert (params, g_strdup ("sid"),
- g_strdup (fields[numfields - 1]));
- g_hash_table_insert (res, g_strdup (fields[0]), params);
+ g_hash_table_insert (params, g_strdup ("frequency"),
+ g_strdup_printf ("%d", atoi (fields[1]) * 1000));
+ parsed = TRUE;
+ } else if (numfields == 13) {
+ /* terrestrial */
+ int j;
+
+ g_hash_table_insert (params, g_strdup ("type"),
+ g_strdup ("terrestrial"));
+ for (j = 2; j <= 9; j++) {
+ g_hash_table_insert (params, g_strdup (terrestrial[j - 2]),
+ g_strdup (fields[j]));
}
- g_strfreev (fields);
+ g_hash_table_insert (params, g_strdup ("frequency"),
+ g_strdup (fields[1]));
+ parsed = TRUE;
+ } else if (numfields == 9) {
+ /* cable */
+ int j;
+
+ g_hash_table_insert (params, g_strdup ("type"), g_strdup ("cable"));
+ for (j = 2; j <= 5; j++) {
+ g_hash_table_insert (params, g_strdup (cable[j - 2]),
+ g_strdup (fields[j]));
+ }
+ g_hash_table_insert (params, g_strdup ("frequency"),
+ g_strdup (fields[1]));
+ parsed = TRUE;
+ } else if (numfields == 6) {
+ /* atsc (vsb/qam) */
+ g_hash_table_insert (params, g_strdup ("type"), g_strdup ("atsc"));
+ g_hash_table_insert (params, g_strdup ("modulation"),
+ g_strdup (fields[2]));
+
+ g_hash_table_insert (params, g_strdup ("frequency"),
+ g_strdup (fields[1]));
+ parsed = TRUE;
+ }
+ if (parsed) {
+ g_hash_table_insert (params, g_strdup ("sid"),
+ g_strdup (fields[numfields - 1]));
+ g_hash_table_insert (res, g_strdup (fields[0]), params);
}
- line = lines[++i];
+ g_strfreev (fields);
}
- g_strfreev (lines);
- g_free (contents);
- } else
- GST_WARNING ("Couldn't open file");
+ line = lines[++i];
+ }
+ g_strfreev (lines);
+ g_free (contents);
+
return res;
+
+open_fail:
+ {
+ GST_ELEMENT_ERROR (dvbbasebin, RESOURCE, READ, (NULL),
+ ("Opening channels configuration file failed : %s", filename,
+ err->message));
+ g_clear_error (&err);
+ return NULL;
+ }
}
static gboolean
@@ -146,7 +156,7 @@ destroy_channels_hash (GHashTable * channels)
}
gboolean
-set_properties_for_channel (GObject * dvbbasebin, const gchar * channel_name)
+set_properties_for_channel (GstElement * dvbbasebin, const gchar * channel_name)
{
gboolean ret = FALSE;
GHashTable *channels;
@@ -160,7 +170,7 @@ set_properties_for_channel (GObject * dvbbasebin, const gchar * channel_name)
filename = g_strdup_printf ("%s/gstreamer-%d.%d/dvb-channels.conf",
g_get_user_config_dir (), major, minor);
}
- channels = parse_channels_conf_from_file (filename);
+ channels = parse_channels_conf_from_file (dvbbasebin, filename);
g_free (filename);
if (channels) {
diff --git a/sys/dvb/parsechannels.h b/sys/dvb/parsechannels.h
index 727419b15..8dd17fde4 100644
--- a/sys/dvb/parsechannels.h
+++ b/sys/dvb/parsechannels.h
@@ -24,8 +24,7 @@
#ifndef PARSE_CHANNELS_H
#define PARSE_CHANNELS_H
-GHashTable* parse_channels_conf_from_file(const gchar* filename);
-gboolean set_properties_for_channel(GObject *dvbbasebin,
+gboolean set_properties_for_channel(GstElement *dvbbasebin,
const gchar* channel_name);
#endif