From f267827d67d3fd11478fbf94da9cd6095400a49c Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 2 Jul 2013 09:22:18 -0400 Subject: ETableSpecification: Implement GInitable. e_table_specification_new() now takes a table specification filename and a GError and parses the file as part of instance creation. If a file or parse error occurs, e_table_specification_new() returns NULL. This replaces e_table_specification_load_from_file(). New functions: e_table_specification_get_filename() Removed functions: e_table_specification_load_from_file() --- e-util/e-table-specification.c | 207 +++++++++++++++++++++++++++++------------ e-util/e-table-specification.h | 8 +- 2 files changed, 154 insertions(+), 61 deletions(-) (limited to 'e-util') diff --git a/e-util/e-table-specification.c b/e-util/e-table-specification.c index 348912acc5..bacb5ece75 100644 --- a/e-util/e-table-specification.c +++ b/e-util/e-table-specification.c @@ -31,12 +31,25 @@ struct _ETableSpecificationPrivate { GPtrArray *columns; + gchar *filename; }; -G_DEFINE_TYPE ( +enum { + PROP_0, + PROP_FILENAME +}; + +/* Forward Declarations */ +static void e_table_specification_initable_init + (GInitableIface *interface); + +G_DEFINE_TYPE_WITH_CODE ( ETableSpecification, e_table_specification, - G_TYPE_OBJECT) + G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE ( + G_TYPE_INITABLE, + e_table_specification_initable_init)) static void table_specification_start_specification (GMarkupParseContext *context, @@ -400,6 +413,51 @@ static const GMarkupParser table_specification_parser = { NULL }; +static void +table_specification_set_filename (ETableSpecification *specification, + const gchar *filename) +{ + g_return_if_fail (filename != NULL); + g_return_if_fail (specification->priv->filename == NULL); + + specification->priv->filename = g_strdup (filename); +} + +static void +table_specification_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_FILENAME: + table_specification_set_filename ( + E_TABLE_SPECIFICATION (object), + g_value_get_string (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +table_specification_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_FILENAME: + g_value_set_string ( + value, + e_table_specification_get_filename ( + E_TABLE_SPECIFICATION (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + static void table_specification_dispose (GObject *object) { @@ -426,11 +484,55 @@ table_specification_finalize (GObject *object) g_free (specification->domain); g_ptr_array_unref (specification->priv->columns); + g_free (specification->priv->filename); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_table_specification_parent_class)->finalize (object); } +static gboolean +table_specification_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + ETableSpecification *specification; + GMarkupParseContext *context; + const gchar *filename; + gchar *contents = NULL; + gboolean success = FALSE; + + specification = E_TABLE_SPECIFICATION (initable); + filename = e_table_specification_get_filename (specification); + g_return_val_if_fail (filename != NULL, FALSE); + + if (!g_file_get_contents (filename, &contents, NULL, error)) { + g_warn_if_fail (contents == NULL); + return FALSE; + } + + context = g_markup_parse_context_new ( + &table_specification_parser, + 0, /* no flags */ + g_object_ref (specification), + (GDestroyNotify) g_object_unref); + + if (g_markup_parse_context_parse (context, contents, -1, error)) + success = g_markup_parse_context_end_parse (context, error); + + g_markup_parse_context_free (context); + + if (specification->state == NULL) + specification->state = e_table_state_vanilla (specification); + + e_table_sort_info_set_can_group ( + specification->state->sort_info, + specification->allow_grouping); + + g_free (contents); + + return success; +} + static void e_table_specification_class_init (ETableSpecificationClass *class) { @@ -439,8 +541,28 @@ e_table_specification_class_init (ETableSpecificationClass *class) g_type_class_add_private (class, sizeof (ETableSpecificationPrivate)); object_class = G_OBJECT_CLASS (class); + object_class->set_property = table_specification_set_property; + object_class->get_property = table_specification_get_property; object_class->dispose = table_specification_dispose; object_class->finalize = table_specification_finalize; + + g_object_class_install_property ( + object_class, + PROP_FILENAME, + g_param_spec_string ( + "filename", + "Filename", + "Name of the table specification file", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +e_table_specification_initable_init (GInitableIface *interface) +{ + interface->init = table_specification_initable_init; } static void @@ -469,16 +591,37 @@ e_table_specification_init (ETableSpecification *specification) /** * e_table_specification_new: + * @filename: a table specification file + * @error: return location for a #GError, or %NULL * - * Creates a new #ETableSpecification. This holds the rendering information - * for an #ETable. + * Creates a new #ETableSpecification from @filename. If a file or parse + * error occurs, the function sets @error and returns %NULL. * - * Returns: an #ETableSpecification + * Returns: an #ETableSpecification, or %NULL */ ETableSpecification * -e_table_specification_new (void) +e_table_specification_new (const gchar *filename, + GError **error) { - return g_object_new (E_TYPE_TABLE_SPECIFICATION, NULL); + return g_initable_new ( + E_TYPE_TABLE_SPECIFICATION, NULL, error, + "filename", filename, NULL); +} + +/** + * e_table_specification_get_filename: + * @specification: an #ETableSpecification + * + * Returns the filename from which @specification was loaded. + * + * Returns: the table specification filename + **/ +const gchar * +e_table_specification_get_filename (ETableSpecification *specification) +{ + g_return_val_if_fail (E_IS_TABLE_SPECIFICATION (specification), NULL); + + return specification->priv->filename; } /** @@ -541,53 +684,3 @@ e_table_specification_get_column_index (ETableSpecification *specification, return column_index; } -/** - * e_table_specification_load_from_file: - * @specification: an #ETableSpecification - * @filename: the name of a file containing an #ETable specification - * - * Parses the contents of @filename and configures @specification. - * - * Returns: TRUE on success, FALSE on failure. - */ -gboolean -e_table_specification_load_from_file (ETableSpecification *specification, - const gchar *filename) -{ - GMarkupParseContext *context; - gchar *contents = NULL; - gboolean success = FALSE; - - g_return_val_if_fail (E_IS_TABLE_SPECIFICATION (specification), FALSE); - g_return_val_if_fail (filename != NULL, FALSE); - - if (!g_file_get_contents (filename, &contents, NULL, NULL)) { - g_warn_if_fail (contents == NULL); - return FALSE; - } - - g_ptr_array_set_size (specification->priv->columns, 0); - g_clear_object (&specification->state); - - context = g_markup_parse_context_new ( - &table_specification_parser, 0, - g_object_ref (specification), - (GDestroyNotify) g_object_unref); - - if (g_markup_parse_context_parse (context, contents, -1, NULL)) - success = g_markup_parse_context_end_parse (context, NULL); - - g_markup_parse_context_free (context); - - if (specification->state == NULL) - specification->state = e_table_state_vanilla (specification); - - e_table_sort_info_set_can_group ( - specification->state->sort_info, - specification->allow_grouping); - - g_free (contents); - - return success; -} - diff --git a/e-util/e-table-specification.h b/e-util/e-table-specification.h index ff8ad062da..d5aa40a324 100644 --- a/e-util/e-table-specification.h +++ b/e-util/e-table-specification.h @@ -82,15 +82,15 @@ struct _ETableSpecificationClass { GType e_table_specification_get_type (void) G_GNUC_CONST; ETableSpecification * - e_table_specification_new (void); + e_table_specification_new (const gchar *filename, + GError **error); +const gchar * e_table_specification_get_filename + (ETableSpecification *specification); GPtrArray * e_table_specification_ref_columns (ETableSpecification *specification); gint e_table_specification_get_column_index (ETableSpecification *specification, ETableColumnSpecification *column_spec); -gboolean e_table_specification_load_from_file - (ETableSpecification *specification, - const gchar *filename); G_END_DECLS -- cgit v1.2.3