cssprovider: Handle errors completely via new error functions

This commit is contained in:
Benjamin Otte
2011-04-07 14:03:08 +02:00
parent 582aa955c2
commit 06d4dab48c

View File

@ -838,8 +838,7 @@ static void scanner_apply_scope (GScanner *scanner,
static void css_provider_reset_parser (GtkCssProvider *css_provider); static void css_provider_reset_parser (GtkCssProvider *css_provider);
static gboolean css_provider_parse_value (GtkCssProvider *css_provider, static gboolean css_provider_parse_value (GtkCssProvider *css_provider,
const gchar *value_str, const gchar *value_str,
GValue *value, GValue *value);
GError **error);
static gboolean gtk_css_provider_load_from_path_internal (GtkCssProvider *css_provider, static gboolean gtk_css_provider_load_from_path_internal (GtkCssProvider *css_provider,
const gchar *path, const gchar *path,
gboolean reset, gboolean reset,
@ -1437,7 +1436,7 @@ gtk_css_provider_get_style_property (GtkStyleProvider *provider,
val_str = g_value_get_string (val); val_str = g_value_get_string (val);
found = TRUE; found = TRUE;
css_provider_parse_value (GTK_CSS_PROVIDER (provider), val_str, value, NULL); css_provider_parse_value (GTK_CSS_PROVIDER (provider), val_str, value);
break; break;
} }
} }
@ -1550,6 +1549,14 @@ gtk_css_provider_error (GtkCssProvider *provider,
g_free (message); g_free (message);
} }
static void
gtk_css_provider_take_error (GtkCssProvider *provider,
GError *error)
{
gtk_css_provider_error_literal (provider, error->domain, error->code, error->message);
g_error_free (error);
}
static void static void
gtk_css_provider_invalid_token (GtkCssProvider *provider, gtk_css_provider_invalid_token (GtkCssProvider *provider,
const char *expected) const char *expected)
@ -2277,8 +2284,7 @@ symbolic_color_parse_str (const gchar *string,
} }
static GtkSymbolicColor * static GtkSymbolicColor *
symbolic_color_parse (const gchar *str, symbolic_color_parse (const gchar *str)
GError **error)
{ {
GtkSymbolicColor *color; GtkSymbolicColor *color;
gchar *end; gchar *end;
@ -2287,11 +2293,6 @@ symbolic_color_parse (const gchar *str,
if (*end != '\0') if (*end != '\0')
{ {
g_set_error_literal (error,
GTK_CSS_PROVIDER_ERROR,
GTK_CSS_PROVIDER_ERROR_FAILED,
"Could not parse symbolic color");
if (color) if (color)
{ {
gtk_symbolic_color_unref (color); gtk_symbolic_color_unref (color);
@ -2555,8 +2556,7 @@ gradient_parse_str (const gchar *str,
static gchar * static gchar *
path_parse_str (GtkCssProvider *css_provider, path_parse_str (GtkCssProvider *css_provider,
const gchar *str, const gchar *str,
gchar **end_ptr, gchar **end_ptr)
GError **error)
{ {
gchar *path, *chr; gchar *path, *chr;
const gchar *start, *end; const gchar *start, *end;
@ -2640,8 +2640,8 @@ path_parse_str (GtkCssProvider *css_provider,
if (!g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) if (!g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
{ {
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_EXIST, gtk_css_provider_error (css_provider, G_FILE_ERROR, G_FILE_ERROR_EXIST,
"File doesn't exist: %s", path); "File doesn't exist: %s", path);
g_free (path); g_free (path);
path = NULL; path = NULL;
*end_ptr = (gchar *)start; *end_ptr = (gchar *)start;
@ -2652,23 +2652,22 @@ path_parse_str (GtkCssProvider *css_provider,
static gchar * static gchar *
path_parse (GtkCssProvider *css_provider, path_parse (GtkCssProvider *css_provider,
const gchar *str, const gchar *str)
GError **error)
{ {
gchar *path; gchar *path;
gchar *end; gchar *end;
path = path_parse_str (css_provider, str, &end, error); path = path_parse_str (css_provider, str, &end);
if (!path) if (!path)
return NULL; return NULL;
if (*end != '\0') if (*end != '\0')
{ {
g_set_error_literal (error, gtk_css_provider_error (css_provider,
GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR,
GTK_CSS_PROVIDER_ERROR_FAILED, GTK_CSS_PROVIDER_ERROR_FAILED,
"Error parsing path"); "Error parsing path");
g_free (path); g_free (path);
path = NULL; path = NULL;
} }
@ -2679,8 +2678,7 @@ path_parse (GtkCssProvider *css_provider,
static Gtk9Slice * static Gtk9Slice *
slice_parse_str (GtkCssProvider *css_provider, slice_parse_str (GtkCssProvider *css_provider,
const gchar *str, const gchar *str,
gchar **end_ptr, gchar **end_ptr)
GError **error)
{ {
gdouble distance_top, distance_bottom; gdouble distance_top, distance_bottom;
gdouble distance_left, distance_right; gdouble distance_left, distance_right;
@ -2689,11 +2687,12 @@ slice_parse_str (GtkCssProvider *css_provider,
Gtk9Slice *slice; Gtk9Slice *slice;
gchar *path; gchar *path;
gint i = 0; gint i = 0;
GError *error = NULL;
SKIP_SPACES (str); SKIP_SPACES (str);
/* Parse image url */ /* Parse image url */
path = path_parse_str (css_provider, str, end_ptr, error); path = path_parse_str (css_provider, str, end_ptr);
if (!path) if (!path)
return NULL; return NULL;
@ -2759,11 +2758,12 @@ slice_parse_str (GtkCssProvider *css_provider,
mods[1] = mods[0]; mods[1] = mods[0];
} }
pixbuf = gdk_pixbuf_new_from_file (path, error); pixbuf = gdk_pixbuf_new_from_file (path, &error);
g_free (path); g_free (path);
if (!pixbuf) if (!pixbuf)
{ {
gtk_css_provider_take_error (css_provider, error);
*end_ptr = (gchar *) str; *end_ptr = (gchar *) str;
return NULL; return NULL;
} }
@ -2898,8 +2898,7 @@ resolve_binding_sets (const gchar *value_str,
static gboolean static gboolean
css_provider_parse_value (GtkCssProvider *css_provider, css_provider_parse_value (GtkCssProvider *css_provider,
const gchar *value_str, const gchar *value_str,
GValue *value, GValue *value)
GError **error)
{ {
GtkCssProviderPrivate *priv; GtkCssProviderPrivate *priv;
GType type; GType type;
@ -3005,8 +3004,7 @@ css_provider_parse_value (GtkCssProvider *css_provider,
gchar *path; gchar *path;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
g_clear_error (error); path = path_parse_str (css_provider, value_str, &end);
path = path_parse_str (css_provider, value_str, &end, error);
if (path) if (path)
{ {
@ -3056,11 +3054,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
if (!enum_value) if (!enum_value)
{ {
g_set_error (error, gtk_css_provider_error (css_provider,
GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR,
GTK_CSS_PROVIDER_ERROR_FAILED, GTK_CSS_PROVIDER_ERROR_FAILED,
"Unknown value '%s' for enum type '%s'", "Unknown value '%s' for enum type '%s'",
value_str, g_type_name (type)); value_str, g_type_name (type));
parsed = FALSE; parsed = FALSE;
} }
else else
@ -3093,11 +3091,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
if (!flag_value) if (!flag_value)
{ {
g_set_error (error, gtk_css_provider_error (css_provider,
GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR,
GTK_CSS_PROVIDER_ERROR_FAILED, GTK_CSS_PROVIDER_ERROR_FAILED,
"Unknown flag '%s' for type '%s'", "Unknown flag '%s' for type '%s'",
value_str, g_type_name (type)); value_str, g_type_name (type));
parsed = FALSE; parsed = FALSE;
} }
else else
@ -3112,11 +3110,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
if (!flag_value) if (!flag_value)
{ {
g_set_error (error, gtk_css_provider_error (css_provider,
GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR,
GTK_CSS_PROVIDER_ERROR_FAILED, GTK_CSS_PROVIDER_ERROR_FAILED,
"Unknown flag '%s' for type '%s'", "Unknown flag '%s' for type '%s'",
value_str, g_type_name (type)); value_str, g_type_name (type));
parsed = FALSE; parsed = FALSE;
} }
else else
@ -3131,7 +3129,7 @@ css_provider_parse_value (GtkCssProvider *css_provider,
{ {
Gtk9Slice *slice; Gtk9Slice *slice;
slice = slice_parse_str (css_provider, value_str, &end, error); slice = slice_parse_str (css_provider, value_str, &end);
if (slice) if (slice)
g_value_take_boxed (value, slice); g_value_take_boxed (value, slice);
@ -3140,11 +3138,11 @@ css_provider_parse_value (GtkCssProvider *css_provider,
} }
else else
{ {
g_set_error (error, gtk_css_provider_error (css_provider,
GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR,
GTK_CSS_PROVIDER_ERROR_FAILED, GTK_CSS_PROVIDER_ERROR_FAILED,
"Cannot parse string '%s' for type %s", "Cannot parse string '%s' for type %s",
value_str, g_type_name (type)); value_str, g_type_name (type));
parsed = FALSE; parsed = FALSE;
} }
@ -3159,11 +3157,10 @@ css_provider_parse_value (GtkCssProvider *css_provider,
priv->value_pos += (end - value_str); priv->value_pos += (end - value_str);
parsed = FALSE; parsed = FALSE;
if (error && !*error) gtk_css_provider_error_literal (css_provider,
g_set_error_literal (error, GTK_CSS_PROVIDER_ERROR,
GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_FAILED,
GTK_CSS_PROVIDER_ERROR_FAILED, "Failed to parse value");
"Failed to parse value");
} }
return parsed; return parsed;
@ -3247,8 +3244,7 @@ scanner_report_warning (GtkCssProvider *css_provider,
static GTokenType static GTokenType
parse_rule (GtkCssProvider *css_provider, parse_rule (GtkCssProvider *css_provider,
GScanner *scanner, GScanner *scanner)
GError **error)
{ {
GtkCssProviderPrivate *priv; GtkCssProviderPrivate *priv;
GTokenType expected_token; GTokenType expected_token;
@ -3291,7 +3287,7 @@ parse_rule (GtkCssProvider *css_provider,
} }
color_str = g_strstrip (scanner->value.v_identifier); color_str = g_strstrip (scanner->value.v_identifier);
color = symbolic_color_parse (color_str, error); color = symbolic_color_parse (color_str);
if (!color) if (!color)
{ {
@ -3322,12 +3318,10 @@ parse_rule (GtkCssProvider *css_provider,
if (scanner->token == G_TOKEN_IDENTIFIER && if (scanner->token == G_TOKEN_IDENTIFIER &&
g_str_has_prefix (scanner->value.v_identifier, "url")) g_str_has_prefix (scanner->value.v_identifier, "url"))
path = path_parse (css_provider, path = path_parse (css_provider,
g_strstrip (scanner->value.v_identifier), g_strstrip (scanner->value.v_identifier));
error);
else if (scanner->token == G_TOKEN_STRING) else if (scanner->token == G_TOKEN_STRING)
path = path_parse (css_provider, path = path_parse (css_provider,
g_strstrip (scanner->value.v_string), g_strstrip (scanner->value.v_string));
error);
if (path == NULL) if (path == NULL)
{ {
@ -3353,7 +3347,7 @@ parse_rule (GtkCssProvider *css_provider,
/* FIXME: Avoid recursive importing */ /* FIXME: Avoid recursive importing */
loaded = gtk_css_provider_load_from_path_internal (css_provider, path, loaded = gtk_css_provider_load_from_path_internal (css_provider, path,
FALSE, error); FALSE, NULL);
/* Restore previous state */ /* Restore previous state */
css_provider_reset_parser (css_provider); css_provider_reset_parser (css_provider);
@ -3534,9 +3528,19 @@ parse_rule (GtkCssProvider *css_provider,
g_value_set_string (val, value_str); g_value_set_string (val, value_str);
g_hash_table_insert (priv->cur_properties, prop, val); g_hash_table_insert (priv->cur_properties, prop, val);
} }
else if ((parse_func && (parse_func) (value_str, val, error)) || else if (!parse_func && css_provider_parse_value (css_provider, value_str, val))
(!parse_func && css_provider_parse_value (css_provider, value_str, val, error))) {
g_hash_table_insert (priv->cur_properties, prop, val); g_hash_table_insert (priv->cur_properties, prop, val);
}
else if (parse_func)
{
GError *error = NULL;
if ((*parse_func) (value_str, val, &error))
g_hash_table_insert (priv->cur_properties, prop, val);
else
gtk_css_provider_take_error (css_provider, error);
}
else else
{ {
g_value_unset (val); g_value_unset (val);
@ -3595,7 +3599,7 @@ parse_stylesheet (GtkCssProvider *css_provider,
GTokenType expected_token; GTokenType expected_token;
css_provider_reset_parser (css_provider); css_provider_reset_parser (css_provider);
expected_token = parse_rule (css_provider, priv->scanner, &priv->error); expected_token = parse_rule (css_provider, priv->scanner);
if (expected_token != G_TOKEN_NONE) if (expected_token != G_TOKEN_NONE)
{ {