[gtk+] GtkRecentFilter: Use the new helpers



commit 19f3188763adb37e51ff9b6806bbe9c85318d095
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Apr 25 19:36:09 2015 -0400

    GtkRecentFilter: Use the new helpers
    
    Instead of issuing g_warning, fill the provided GError.
    This lets us test this error handling, and is the right
    thing to do. Use the new GtkBuilder helpers and
    g_markup_collect_attributes to do so.

 gtk/gtkrecentfilter.c |  126 +++++++++++++++++++++++++++++--------------------
 1 files changed, 75 insertions(+), 51 deletions(-)
---
diff --git a/gtk/gtkrecentfilter.c b/gtk/gtkrecentfilter.c
index a346e80..b50daaf 100644
--- a/gtk/gtkrecentfilter.c
+++ b/gtk/gtkrecentfilter.c
@@ -76,6 +76,7 @@
 
 #include "gtkrecentfilter.h"
 #include "gtkbuildable.h"
+#include "gtkbuilderprivate.h"
 #include "gtkintl.h"
 #include "gtkprivate.h"
 
@@ -236,6 +237,7 @@ typedef enum {
 
 typedef struct {
   GtkRecentFilter *filter;
+  GtkBuilder      *builder;
   ParserType       type;
   GString         *string;
   gboolean         parsing;
@@ -249,31 +251,50 @@ parser_start_element (GMarkupParseContext *context,
                      gpointer             user_data,
                      GError             **error)
 {
-  SubParserData *parser_data = (SubParserData*)user_data;
+  SubParserData *data = (SubParserData*)user_data;
 
-  if (strcmp (element_name, "mime-types") == 0)
-    return;
-  else if (strcmp (element_name, "mime-type") == 0)
+  if (!g_markup_collect_attributes (element_name, names, values, error,
+                                    G_MARKUP_COLLECT_INVALID, NULL, NULL,
+                                    G_MARKUP_COLLECT_INVALID))
     {
-      parser_data->parsing = TRUE;
+      _gtk_builder_prefix_error (data->builder, context, error);
       return;
     }
-  else if (strcmp (element_name, "patterns") == 0)
-    return;
+
+  if (strcmp (element_name, "mime-types") == 0 ||
+      strcmp (element_name, "patterns") == 0 ||
+      strcmp (element_name, "applications") == 0)
+    {
+      if (!_gtk_builder_check_parent (data->builder, context, "object", error))
+        return;
+    }
+  else if (strcmp (element_name, "mime-type") == 0)
+    {
+      if (!_gtk_builder_check_parent (data->builder, context, "mime-types", error))
+        return;
+
+      data->parsing = TRUE;
+    }
   else if (strcmp (element_name, "pattern") == 0)
     {
-      parser_data->parsing = TRUE;
-      return;
+      if (!_gtk_builder_check_parent (data->builder, context, "patterns", error))
+        return;
+
+      data->parsing = TRUE;
     }
-  else if (strcmp (element_name, "applications") == 0)
-    return;
   else if (strcmp (element_name, "application") == 0)
     {
-      parser_data->parsing = TRUE;
-      return;
+      if (!_gtk_builder_check_parent (data->builder, context, "applications", error))
+        return;
+
+      data->parsing = TRUE;
     }
   else
-    g_warning ("Unsupported tag for GtkRecentFilter: %s\n", element_name);
+    {
+      _gtk_builder_error_unhandled_tag (data->builder, context,
+                                        "GtkRecentFilter", element_name,
+                                        error);
+    }
 }
 
 static void
@@ -283,10 +304,10 @@ parser_text_element (GMarkupParseContext *context,
                     gpointer             user_data,
                     GError             **error)
 {
-  SubParserData *parser_data = (SubParserData*)user_data;
+  SubParserData *data = (SubParserData*)user_data;
 
-  if (parser_data->parsing)
-    g_string_append_len (parser_data->string, text, text_len);
+  if (data->parsing)
+    g_string_append_len (data->string, text, text_len);
 }
 
 static void
@@ -295,28 +316,28 @@ parser_end_element (GMarkupParseContext *context,
                    gpointer             user_data,
                    GError             **error)
 {
-  SubParserData *parser_data = (SubParserData*)user_data;
+  SubParserData *data = (SubParserData*)user_data;
 
-  if (parser_data->string)
+  if (data->string)
     {
-      switch (parser_data->type)
+      switch (data->type)
        {
        case PARSE_MIME_TYPES:
-         gtk_recent_filter_add_mime_type (parser_data->filter, parser_data->string->str);
+         gtk_recent_filter_add_mime_type (data->filter, data->string->str);
          break;
        case PARSE_PATTERNS:
-         gtk_recent_filter_add_pattern (parser_data->filter, parser_data->string->str);
+         gtk_recent_filter_add_pattern (data->filter, data->string->str);
          break;
        case PARSE_APPLICATIONS:
-         gtk_recent_filter_add_application (parser_data->filter, parser_data->string->str);
+         gtk_recent_filter_add_application (data->filter, data->string->str);
          break;
        default:
          break;
        }
     }
 
-  g_string_set_size (parser_data->string, 0);
-  parser_data->parsing = FALSE;
+  g_string_set_size (data->string, 0);
+  data->parsing = FALSE;
 }
 
 static const GMarkupParser sub_parser =
@@ -328,46 +349,49 @@ static const GMarkupParser sub_parser =
 
 static gboolean
 gtk_recent_filter_buildable_custom_tag_start (GtkBuildable  *buildable,
-                                             GtkBuilder    *builder,
-                                             GObject       *child,
-                                             const gchar   *tagname,
-                                             GMarkupParser *parser,
-                                             gpointer      *data)
+                                              GtkBuilder    *builder,
+                                              GObject       *child,
+                                              const gchar   *tagname,
+                                              GMarkupParser *parser,
+                                              gpointer      *parser_data)
 {
-  SubParserData *parser_data = NULL;
+  SubParserData *data = NULL;
 
   if (strcmp (tagname, "mime-types") == 0)
     {
-      parser_data         = g_slice_new0 (SubParserData);
-      parser_data->string = g_string_new ("");
-      parser_data->type   = PARSE_MIME_TYPES;
-      parser_data->filter = GTK_RECENT_FILTER (buildable);
+      data = g_slice_new0 (SubParserData);
+      data->string = g_string_new ("");
+      data->type = PARSE_MIME_TYPES;
+      data->filter = GTK_RECENT_FILTER (buildable);
+      data->builder = builder;
 
       *parser = sub_parser;
-      *data = parser_data;
+      *parser_data = data;
     }
   else if (strcmp (tagname, "patterns") == 0)
     {
-      parser_data         = g_slice_new0 (SubParserData);
-      parser_data->string = g_string_new ("");
-      parser_data->type   = PARSE_PATTERNS;
-      parser_data->filter = GTK_RECENT_FILTER (buildable);
+      data = g_slice_new0 (SubParserData);
+      data->string = g_string_new ("");
+      data->type = PARSE_PATTERNS;
+      data->filter = GTK_RECENT_FILTER (buildable);
+      data->builder = builder;
 
       *parser = sub_parser;
-      *data = parser_data;
+      *parser_data = data;
     }
   else if (strcmp (tagname, "applications") == 0)
     {
-      parser_data         = g_slice_new0 (SubParserData);
-      parser_data->string = g_string_new ("");
-      parser_data->type   = PARSE_APPLICATIONS;
-      parser_data->filter = GTK_RECENT_FILTER (buildable);
+      data = g_slice_new0 (SubParserData);
+      data->string = g_string_new ("");
+      data->type = PARSE_APPLICATIONS;
+      data->filter = GTK_RECENT_FILTER (buildable);
+      data->builder = builder;
 
       *parser = sub_parser;
-      *data = parser_data;
+      *parser_data = data;
     }
 
-  return parser_data != NULL;
+  return data != NULL;
 }
 
 static void
@@ -375,16 +399,16 @@ gtk_recent_filter_buildable_custom_tag_end (GtkBuildable *buildable,
                                            GtkBuilder   *builder,
                                            GObject      *child,
                                            const gchar  *tagname,
-                                           gpointer     *data)
+                                           gpointer     *parser_data)
 {
   if (strcmp (tagname, "mime-types") == 0 ||
       strcmp (tagname, "patterns") == 0 ||
       strcmp (tagname, "applications") == 0)
     {
-      SubParserData *parser_data = (SubParserData*)data;
+      SubParserData *data = (SubParserData*)parser_data;
 
-      g_string_free (parser_data->string, TRUE);
-      g_slice_free (SubParserData, parser_data);
+      g_string_free (data->string, TRUE);
+      g_slice_free (SubParserData, data);
     }
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]