X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fgbookmarkfile.c;h=3123669cb7dca00c026868a13a7c1954aaa80f18;hb=ecf1359191b2f796a7d63288652dd1a93525417d;hp=70ce6ee531e68bcd06ba7b9dda817cdcc032bea4;hpb=05b1004080a458b13390571ea2834b4a33a436a5;p=platform%2Fupstream%2Fglib.git diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c index 70ce6ee..3123669 100644 --- a/glib/gbookmarkfile.c +++ b/glib/gbookmarkfile.c @@ -29,11 +29,6 @@ #include #include #include -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif #include "gconvert.h" #include "gdataset.h" @@ -42,7 +37,6 @@ #include "ghash.h" #include "glibintl.h" #include "glist.h" -#include "gslist.h" #include "gmain.h" #include "gmarkup.h" #include "gmem.h" @@ -55,7 +49,51 @@ #include "gtimer.h" #include "gutils.h" -#include "galias.h" + +/** + * SECTION:bookmarkfile + * @title: Bookmark file parser + * @short_description: parses files containing bookmarks + * + * GBookmarkFile lets you parse, edit or create files containing bookmarks + * to URI, along with some meta-data about the resource pointed by the URI + * like its MIME type, the application that is registering the bookmark and + * the icon that should be used to represent the bookmark. The data is stored + * using the + * [Desktop Bookmark Specification](http://www.gnome.org/~ebassi/bookmark-spec). + * + * The syntax of the bookmark files is described in detail inside the + * Desktop Bookmark Specification, here is a quick summary: bookmark + * files use a sub-class of the XML Bookmark Exchange Language + * specification, consisting of valid UTF-8 encoded XML, under the + * root element; each bookmark is stored inside a + * element, using its URI: no relative paths can + * be used inside a bookmark file. The bookmark may have a user defined + * title and description, to be used instead of the URI. Under the + * element, with its owner attribute set to + * `http://freedesktop.org`, is stored the meta-data about a resource + * pointed by its URI. The meta-data consists of the resource's MIME + * type; the applications that have registered a bookmark; the groups + * to which a bookmark belongs to; a visibility flag, used to set the + * bookmark as "private" to the applications and groups that has it + * registered; the URI and MIME type of an icon, to be used when + * displaying the bookmark inside a GUI. + * + * Here is an example of a bookmark file: + * [bookmarks.xbel](https://git.gnome.org/browse/glib/tree/glib/tests/bookmarks.xbel) + * + * A bookmark file might contain more than one bookmark; each bookmark + * is accessed through its URI. + * + * The important caveat of bookmark files is that when you add a new + * bookmark you must also add the application that is registering it, using + * g_bookmark_file_add_application() or g_bookmark_file_set_app_info(). + * If a bookmark has no applications then it won't be dumped when creating + * the on disk representation, using g_bookmark_file_to_data() or + * g_bookmark_file_to_file(). + * + * The #GBookmarkFile parser was added in GLib 2.12. + */ /* XBEL 1.0 standard entities */ #define XBEL_VERSION "1.0" @@ -104,7 +142,8 @@ #define BOOKMARK_NAME_ATTRIBUTE "name" #define BOOKMARK_EXEC_ATTRIBUTE "exec" #define BOOKMARK_COUNT_ATTRIBUTE "count" -#define BOOKMARK_TIMESTAMP_ATTRIBUTE "timestamp" +#define BOOKMARK_TIMESTAMP_ATTRIBUTE "timestamp" /* deprecated by "modified" */ +#define BOOKMARK_MODIFIED_ATTRIBUTE "modified" #define BOOKMARK_HREF_ATTRIBUTE "href" #define BOOKMARK_TYPE_ATTRIBUTE "type" @@ -227,7 +266,7 @@ bookmark_app_info_new (const gchar *name) retval->name = g_strdup (name); retval->exec = NULL; retval->count = 0; - retval->stamp = time (NULL); + retval->stamp = 0; return retval; } @@ -248,7 +287,7 @@ static gchar * bookmark_app_info_dump (BookmarkAppInfo *app_info) { gchar *retval; - gchar *name, *exec; + gchar *name, *exec, *modified, *count; g_warn_if_fail (app_info != NULL); @@ -257,17 +296,21 @@ bookmark_app_info_dump (BookmarkAppInfo *app_info) name = g_markup_escape_text (app_info->name, -1); exec = g_markup_escape_text (app_info->exec, -1); - - retval = g_strdup_printf (" <%s:%s %s=\"%s\" %s=\"%s\" %s=\"%ld\" %s=\"%u\"/>\n", - BOOKMARK_NAMESPACE_NAME, - BOOKMARK_APPLICATION_ELEMENT, - BOOKMARK_NAME_ATTRIBUTE, name, - BOOKMARK_EXEC_ATTRIBUTE, exec, - BOOKMARK_TIMESTAMP_ATTRIBUTE, (time_t) app_info->stamp, - BOOKMARK_COUNT_ATTRIBUTE, app_info->count); + modified = timestamp_to_iso8601 (app_info->stamp); + count = g_strdup_printf ("%u", app_info->count); + + retval = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_APPLICATION_ELEMENT + " " BOOKMARK_NAME_ATTRIBUTE "=\"", name, "\"" + " " BOOKMARK_EXEC_ATTRIBUTE "=\"", exec, "\"" + " " BOOKMARK_MODIFIED_ATTRIBUTE "=\"", modified, "\"" + " " BOOKMARK_COUNT_ATTRIBUTE "=\"", count, "\"/>\n", + NULL); g_free (name); g_free (exec); + g_free (modified); + g_free (count); return retval; } @@ -311,24 +354,11 @@ bookmark_metadata_free (BookmarkMetadata *metadata) g_free (metadata->mime_type); - if (metadata->groups) - { - g_list_foreach (metadata->groups, - (GFunc) g_free, - NULL); - g_list_free (metadata->groups); - } - - if (metadata->applications) - { - g_list_foreach (metadata->applications, - (GFunc) bookmark_app_info_free, - NULL); - g_list_free (metadata->applications); - - g_hash_table_destroy (metadata->apps_by_name); - } - + g_list_free_full (metadata->groups, g_free); + g_list_free_full (metadata->applications, (GDestroyNotify) bookmark_app_info_free); + + g_hash_table_destroy (metadata->apps_by_name); + g_free (metadata->icon_href); g_free (metadata->icon_mime); @@ -639,15 +669,8 @@ g_bookmark_file_clear (GBookmarkFile *bookmark) g_free (bookmark->title); g_free (bookmark->description); - if (bookmark->items) - { - g_list_foreach (bookmark->items, - (GFunc) bookmark_item_free, - NULL); - g_list_free (bookmark->items); - - bookmark->items = NULL; - } + g_list_free_full (bookmark->items, (GDestroyNotify) bookmark_item_free); + bookmark->items = NULL; if (bookmark->items_by_uri) { @@ -723,6 +746,10 @@ parse_bookmark_element (GMarkupParseContext *context, visited = attribute_values[i]; else { + /* bookmark is defined by the XBEL spec, so we need + * to error out if the element has different or + * missing attributes + */ g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, _("Unexpected attribute '%s' for element '%s'"), @@ -757,8 +784,8 @@ parse_bookmark_element (GMarkupParseContext *context, add_error = NULL; g_bookmark_file_add_item (parse_data->bookmark_file, - item, - &add_error); + item, + &add_error); if (add_error) { bookmark_item_free (item); @@ -778,7 +805,7 @@ parse_application_element (GMarkupParseContext *context, const gchar **attribute_values, GError **error) { - const gchar *name, *exec, *count, *stamp; + const gchar *name, *exec, *count, *stamp, *modified; const gchar *attr; gint i; BookmarkItem *item; @@ -787,7 +814,7 @@ parse_application_element (GMarkupParseContext *context, g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_APPLICATION)); i = 0; - name = exec = count = stamp = NULL; + name = exec = count = stamp = modified = NULL; for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) { if (IS_ATTRIBUTE (attr, BOOKMARK_NAME_ATTRIBUTE)) @@ -798,17 +825,11 @@ parse_application_element (GMarkupParseContext *context, count = attribute_values[i]; else if (IS_ATTRIBUTE (attr, BOOKMARK_TIMESTAMP_ATTRIBUTE)) stamp = attribute_values[i]; - else - { - g_set_error (error, G_MARKUP_ERROR, - G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, - _("Unexpected attribute '%s' for element '%s'"), - attr, - BOOKMARK_APPLICATION_ELEMENT); - return; - } + else if (IS_ATTRIBUTE (attr, BOOKMARK_MODIFIED_ATTRIBUTE)) + modified = attribute_values[i]; } + /* the "name" and "exec" attributes are mandatory */ if (!name) { g_set_error (error, G_MARKUP_ERROR, @@ -850,11 +871,19 @@ parse_application_element (GMarkupParseContext *context, ai->count = atoi (count); else ai->count = 1; - - if (stamp) - ai->stamp = (time_t) atol (stamp); + + if (modified) + ai->stamp = timestamp_from_iso8601 (modified); else - ai->stamp = time (NULL); + { + /* the timestamp attribute has been deprecated but we still parse + * it for backward compatibility + */ + if (stamp) + ai->stamp = (time_t) atol (stamp); + else + ai->stamp = time (NULL); + } } static void @@ -877,15 +906,6 @@ parse_mime_type_element (GMarkupParseContext *context, { if (IS_ATTRIBUTE (attr, MIME_TYPE_ATTRIBUTE)) type = attribute_values[i]; - else - { - g_set_error (error, G_MARKUP_ERROR, - G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, - _("Unexpected attribute '%s' for element '%s'"), - attr, - MIME_TYPE_ELEMENT); - return; - } } if (!type) @@ -924,17 +944,9 @@ parse_icon_element (GMarkupParseContext *context, href = attribute_values[i]; else if (IS_ATTRIBUTE (attr, BOOKMARK_TYPE_ATTRIBUTE)) type = attribute_values[i]; - else - { - g_set_error (error, G_MARKUP_ERROR, - G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, - _("Unexpected attribute '%s' for element '%s'"), - attr, - BOOKMARK_ICON_ELEMENT); - return; - } } + /* the "href" attribute is mandatory */ if (!href) { g_set_error (error, G_MARKUP_ERROR, @@ -1252,26 +1264,6 @@ start_element_raw_cb (GMarkupParseContext *context, element_name, BOOKMARK_GROUP_ELEMENT); break; - case STATE_ICON: - if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) - { - GError *inner_error = NULL; - - parse_icon_element (context, - parse_data, - attribute_names, - attribute_values, - &inner_error); - if (inner_error) - g_propagate_error (error, inner_error); - } - else - g_set_error (error, G_MARKUP_ERROR, - G_MARKUP_ERROR_UNKNOWN_ELEMENT, - _("Unexpected tag '%s' inside '%s'"), - element_name, - XBEL_METADATA_ELEMENT); - break; default: g_warn_if_reached (); break; @@ -1401,9 +1393,9 @@ static const GMarkupParser markup_parser = static gboolean g_bookmark_file_parse (GBookmarkFile *bookmark, - const gchar *buffer, - gsize length, - GError **error) + const gchar *buffer, + gsize length, + GError **error) { GMarkupParseContext *context; ParseData *parse_data; @@ -1414,8 +1406,11 @@ g_bookmark_file_parse (GBookmarkFile *bookmark, if (!buffer) return FALSE; + + parse_error = NULL; + end_error = NULL; - if (length == -1) + if (length == (gsize) -1) length = strlen (buffer); parse_data = parse_data_new (); @@ -1426,30 +1421,22 @@ g_bookmark_file_parse (GBookmarkFile *bookmark, parse_data, (GDestroyNotify) parse_data_free); - parse_error = NULL; retval = g_markup_parse_context_parse (context, buffer, length, &parse_error); if (!retval) - { - g_propagate_error (error, parse_error); - - return FALSE; - } - - end_error = NULL; - retval = g_markup_parse_context_end_parse (context, &end_error); - if (!retval) - { - g_propagate_error (error, end_error); - - return FALSE; - } - + g_propagate_error (error, parse_error); + else + { + retval = g_markup_parse_context_end_parse (context, &end_error); + if (!retval) + g_propagate_error (error, end_error); + } + g_markup_parse_context_free (context); - - return TRUE; + + return retval; } static gchar * @@ -1512,7 +1499,8 @@ g_bookmark_file_dump (GBookmarkFile *bookmark, goto out; else retval = g_string_append (retval, "\n"); - + + /* the items are stored in reverse order */ for (l = g_list_last (bookmark->items); l != NULL; l = l->prev) @@ -1526,7 +1514,7 @@ g_bookmark_file_dump (GBookmarkFile *bookmark, retval = g_string_append (retval, item_dump); - g_free (item_dump); + g_free (item_dump); } out: @@ -1572,15 +1560,7 @@ timestamp_from_iso8601 (const gchar *iso_date) return (time_t) stamp.tv_sec; } - - -GQuark -g_bookmark_file_error_quark (void) -{ - return g_quark_from_static_string ("egg-bookmark-file-error-quark"); -} - - +G_DEFINE_QUARK (g-bookmark-file-error-quark, g_bookmark_file_error) /******************** * Public API * @@ -1595,7 +1575,7 @@ g_bookmark_file_error_quark (void) * or g_bookmark_file_load_from_data_dirs() to read an existing bookmark * file. * - * Return value: an empty #GBookmarkFile + * Returns: an empty #GBookmarkFile * * Since: 2.12 */ @@ -1641,7 +1621,7 @@ g_bookmark_file_free (GBookmarkFile *bookmark) * structure. If the object cannot be created then @error is set to a * #GBookmarkFileError. * - * Return value: %TRUE if a desktop bookmark could be loaded. + * Returns: %TRUE if a desktop bookmark could be loaded. * * Since: 2.12 */ @@ -1655,9 +1635,7 @@ g_bookmark_file_load_from_data (GBookmarkFile *bookmark, gboolean retval; g_return_val_if_fail (bookmark != NULL, FALSE); - g_return_val_if_fail (data != NULL, FALSE); - g_return_val_if_fail (length != 0, FALSE); - + if (length == (gsize) -1) length = strlen (data); @@ -1666,17 +1644,14 @@ g_bookmark_file_load_from_data (GBookmarkFile *bookmark, g_bookmark_file_clear (bookmark); g_bookmark_file_init (bookmark); } - + parse_error = NULL; retval = g_bookmark_file_parse (bookmark, data, length, &parse_error); + if (!retval) - { - g_propagate_error (error, parse_error); - - return FALSE; - } - - return TRUE; + g_propagate_error (error, parse_error); + + return retval; } /** @@ -1689,7 +1664,7 @@ g_bookmark_file_load_from_data (GBookmarkFile *bookmark, * If the file could not be loaded then @error is set to either a #GFileError * or #GBookmarkFileError. * - * Return value: %TRUE if a desktop bookmark file could be loaded + * Returns: %TRUE if a desktop bookmark file could be loaded * * Since: 2.12 */ @@ -1698,40 +1673,23 @@ g_bookmark_file_load_from_file (GBookmarkFile *bookmark, const gchar *filename, GError **error) { - gchar *buffer; + gboolean ret = FALSE; + gchar *buffer = NULL; gsize len; - GError *read_error; - gboolean retval; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (filename != NULL, FALSE); - read_error = NULL; - g_file_get_contents (filename, &buffer, &len, &read_error); - if (read_error) - { - g_propagate_error (error, read_error); - - return FALSE; - } + if (!g_file_get_contents (filename, &buffer, &len, error)) + goto out; - read_error = NULL; - retval = g_bookmark_file_load_from_data (bookmark, - buffer, - len, - &read_error); - if (read_error) - { - g_propagate_error (error, read_error); - - g_free (buffer); - - return FALSE; - } + if (!g_bookmark_file_load_from_data (bookmark, buffer, len, error)) + goto out; + ret = TRUE; + out: g_free (buffer); - - return retval; + return ret; } @@ -1793,9 +1751,9 @@ find_file_in_data_dirs (const gchar *file, if (!path) { - g_set_error (error, G_BOOKMARK_FILE_ERROR, - G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND, - _("No valid bookmark file found in data dirs")); + g_set_error_literal (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND, + _("No valid bookmark file found in data dirs")); return NULL; } @@ -1808,7 +1766,7 @@ find_file_in_data_dirs (const gchar *file, * g_bookmark_file_load_from_data_dirs: * @bookmark: a #GBookmarkFile * @file: a relative path to a filename to open and parse - * @full_path: return location for a string containing the full path + * @full_path: (allow-none): return location for a string containing the full path * of the file, or %NULL * @error: return location for a #GError, or %NULL * @@ -1818,7 +1776,7 @@ find_file_in_data_dirs (const gchar *file, * @full_path. If the file could not be loaded then an %error is * set to either a #GFileError or #GBookmarkFileError. * - * Return value: %TRUE if a key file could be loaded, %FALSE othewise + * Returns: %TRUE if a key file could be loaded, %FALSE otherwise * * Since: 2.12 */ @@ -1889,12 +1847,12 @@ g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark, /** * g_bookmark_file_to_data: * @bookmark: a #GBookmarkFile - * @length: return location for the length of the returned string, or %NULL + * @length: (allow-none) (out): return location for the length of the returned string, or %NULL * @error: return location for a #GError, or %NULL * * This function outputs @bookmark as a string. * - * Return value: a newly allocated string holding + * Returns: a newly allocated string holding * the contents of the #GBookmarkFile * * Since: 2.12 @@ -1929,7 +1887,7 @@ g_bookmark_file_to_data (GBookmarkFile *bookmark, * This function outputs @bookmark into a file. The write process is * guaranteed to be atomic by using g_file_set_contents() internally. * - * Return value: %TRUE if the file was successfully written. + * Returns: %TRUE if the file was successfully written. * * Since: 2.12 */ @@ -2022,7 +1980,7 @@ g_bookmark_file_add_item (GBookmarkFile *bookmark, * * Removes the bookmark for @uri from the bookmark file @bookmark. * - * Return value: %TRUE if the bookmark was removed successfully. + * Returns: %TRUE if the bookmark was removed successfully. * * Since: 2.12 */ @@ -2062,7 +2020,7 @@ g_bookmark_file_remove_item (GBookmarkFile *bookmark, * * Looks whether the desktop bookmark has an item with its URI set to @uri. * - * Return value: %TRUE if @uri is inside @bookmark, %FALSE otherwise + * Returns: %TRUE if @uri is inside @bookmark, %FALSE otherwise * * Since: 2.12 */ @@ -2079,13 +2037,13 @@ g_bookmark_file_has_item (GBookmarkFile *bookmark, /** * g_bookmark_file_get_uris: * @bookmark: a #GBookmarkFile - * @length: return location for the number of returned URIs, or %NULL + * @length: (allow-none) (out): return location for the number of returned URIs, or %NULL * * Returns all URIs of the bookmarks in the bookmark file @bookmark. * The array of returned URIs will be %NULL-terminated, so @length may * optionally be %NULL. * - * Return value: a newly allocated %NULL-terminated array of strings. + * Returns: (array length=length) (transfer full): a newly allocated %NULL-terminated array of strings. * Use g_strfreev() to free it. * * Since: 2.12 @@ -2102,7 +2060,8 @@ g_bookmark_file_get_uris (GBookmarkFile *bookmark, n_items = g_list_length (bookmark->items); uris = g_new0 (gchar *, n_items + 1); - + + /* the items are stored in reverse order, so we walk the list backward */ for (l = g_list_last (bookmark->items), i = 0; l != NULL; l = l->prev) { BookmarkItem *item = (BookmarkItem *) l->data; @@ -2122,7 +2081,7 @@ g_bookmark_file_get_uris (GBookmarkFile *bookmark, /** * g_bookmark_file_set_title: * @bookmark: a #GBookmarkFile - * @uri: a valid URI or %NULL + * @uri: (allow-none): a valid URI or %NULL * @title: a UTF-8 encoded string * * Sets @title as the title of the bookmark for @uri inside the @@ -2167,7 +2126,7 @@ g_bookmark_file_set_title (GBookmarkFile *bookmark, /** * g_bookmark_file_get_title: * @bookmark: a #GBookmarkFile - * @uri: a valid URI or %NULL + * @uri: (allow-none): a valid URI or %NULL * @error: return location for a #GError, or %NULL * * Returns the title of the bookmark for @uri. @@ -2177,7 +2136,7 @@ g_bookmark_file_set_title (GBookmarkFile *bookmark, * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: a newly allocated string or %NULL if the specified + * Returns: a newly allocated string or %NULL if the specified * URI cannot be found. * * Since: 2.12 @@ -2210,7 +2169,7 @@ g_bookmark_file_get_title (GBookmarkFile *bookmark, /** * g_bookmark_file_set_description: * @bookmark: a #GBookmarkFile - * @uri: a valid URI or %NULL + * @uri: (allow-none): a valid URI or %NULL * @description: a string * * Sets @description as the description of the bookmark for @uri. @@ -2262,7 +2221,7 @@ g_bookmark_file_set_description (GBookmarkFile *bookmark, * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: a newly allocated string or %NULL if the specified + * Returns: a newly allocated string or %NULL if the specified * URI cannot be found. * * Since: 2.12 @@ -2344,7 +2303,7 @@ g_bookmark_file_set_mime_type (GBookmarkFile *bookmark, * event that the MIME type cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. * - * Return value: a newly allocated string or %NULL if the specified + * Returns: a newly allocated string or %NULL if the specified * URI cannot be found. * * Since: 2.12 @@ -2430,7 +2389,7 @@ g_bookmark_file_set_is_private (GBookmarkFile *bookmark, * event that the private flag cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. * - * Return value: %TRUE if the private flag is set, %FALSE otherwise. + * Returns: %TRUE if the private flag is set, %FALSE otherwise. * * Since: 2.12 */ @@ -2513,7 +2472,7 @@ g_bookmark_file_set_added (GBookmarkFile *bookmark, * In the event the URI cannot be found, -1 is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: a timestamp + * Returns: a timestamp * * Since: 2.12 */ @@ -2591,7 +2550,7 @@ g_bookmark_file_set_modified (GBookmarkFile *bookmark, * In the event the URI cannot be found, -1 is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: a timestamp + * Returns: a timestamp * * Since: 2.12 */ @@ -2670,7 +2629,7 @@ g_bookmark_file_set_visited (GBookmarkFile *bookmark, * In the event the URI cannot be found, -1 is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: a timestamp. + * Returns: a timestamp. * * Since: 2.12 */ @@ -2710,7 +2669,7 @@ g_bookmark_file_get_visited (GBookmarkFile *bookmark, * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: %TRUE if @group was found. + * Returns: %TRUE if @group was found. * * Since: 2.12 */ @@ -2807,7 +2766,7 @@ g_bookmark_file_add_group (GBookmarkFile *bookmark, * In the event no group was defined, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. * - * Return value: %TRUE if @group was successfully removed. + * Returns: %TRUE if @group was successfully removed. * * Since: 2.12 */ @@ -2863,7 +2822,7 @@ g_bookmark_file_remove_group (GBookmarkFile *bookmark, * g_bookmark_file_set_groups: * @bookmark: a #GBookmarkFile * @uri: an item's URI - * @groups: an array of group names, or %NULL to remove all groups + * @groups: (allow-none): an array of group names, or %NULL to remove all groups * @length: number of group name values in @groups * * Sets a list of group names for the item with URI @uri. Each previously @@ -2896,14 +2855,8 @@ g_bookmark_file_set_groups (GBookmarkFile *bookmark, if (!item->metadata) item->metadata = bookmark_metadata_new (); - if (item->metadata->groups != NULL) - { - g_list_foreach (item->metadata->groups, - (GFunc) g_free, - NULL); - g_list_free (item->metadata->groups); - item->metadata->groups = NULL; - } + g_list_free_full (item->metadata->groups, g_free); + item->metadata->groups = NULL; if (groups) { @@ -2919,7 +2872,7 @@ g_bookmark_file_set_groups (GBookmarkFile *bookmark, * g_bookmark_file_get_groups: * @bookmark: a #GBookmarkFile * @uri: a valid URI - * @length: return location for the length of the returned string, or %NULL + * @length: (allow-none) (out): return location for the length of the returned string, or %NULL * @error: return location for a #GError, or %NULL * * Retrieves the list of group names of the bookmark for @uri. @@ -2930,7 +2883,7 @@ g_bookmark_file_set_groups (GBookmarkFile *bookmark, * The returned array is %NULL terminated, so @length may optionally * be %NULL. * - * Return value: a newly allocated %NULL-terminated array of group names. + * Returns: (array length=length) (transfer full): a newly allocated %NULL-terminated array of group names. * Use g_strfreev() to free it. * * Since: 2.12 @@ -2991,9 +2944,9 @@ g_bookmark_file_get_groups (GBookmarkFile *bookmark, * g_bookmark_file_add_application: * @bookmark: a #GBookmarkFile * @uri: a valid URI - * @name: the name of the application registering the bookmark + * @name: (allow-none): the name of the application registering the bookmark * or %NULL - * @exec: command line to be used to launch the bookmark or %NULL + * @exec: (allow-none): command line to be used to launch the bookmark or %NULL * * Adds the application with @name and @exec to the list of * applications that have registered a bookmark for @uri into @@ -3006,9 +2959,9 @@ g_bookmark_file_get_groups (GBookmarkFile *bookmark, * time the application registered this bookmark. * * If @name is %NULL, the name of the application will be the - * same returned by g_get_application(); if @exec is %NULL, the + * same returned by g_get_application_name(); if @exec is %NULL, the * command line will be a composition of the program name as - * returned by g_get_prgname() and the "%u" modifier, which will be + * returned by g_get_prgname() and the "\%u" modifier, which will be * expanded to the bookmark's URI. * * This function will automatically take care of updating the @@ -3076,7 +3029,7 @@ g_bookmark_file_add_application (GBookmarkFile *bookmark, * a bookmark for @uri, %FALSE is returned and error is set to * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. * - * Return value: %TRUE if the application was successfully removed. + * Returns: %TRUE if the application was successfully removed. * * Since: 2.12 */ @@ -3123,7 +3076,7 @@ g_bookmark_file_remove_application (GBookmarkFile *bookmark, * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: %TRUE if the application @name was found + * Returns: %TRUE if the application @name was found * * Since: 2.12 */ @@ -3171,9 +3124,9 @@ g_bookmark_file_has_application (GBookmarkFile *bookmark, * * @name can be any UTF-8 encoded string used to identify an * application. - * @exec can have one of these two modifiers: "%f", which will + * @exec can have one of these two modifiers: "\%f", which will * be expanded as the local file name retrieved from the bookmark's - * URI; "%u", which will be expanded as the bookmark's URI. + * URI; "\%u", which will be expanded as the bookmark's URI. * The expansion is done automatically when retrieving the stored * command line using the g_bookmark_file_get_app_info() function. * @count is the number of times the application has registered the @@ -3191,7 +3144,7 @@ g_bookmark_file_has_application (GBookmarkFile *bookmark, * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. Otherwise, if no bookmark * for @uri is found, one is created. * - * Return value: %TRUE if the application's meta-data was successfully + * Returns: %TRUE if the application's meta-data was successfully * changed. * * Since: 2.12 @@ -3231,6 +3184,9 @@ g_bookmark_file_set_app_info (GBookmarkFile *bookmark, } } + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + ai = bookmark_item_lookup_app_info (item, name); if (!ai) { @@ -3341,9 +3297,9 @@ expand_exec_line (const gchar *exec_fmt, * @bookmark: a #GBookmarkFile * @uri: a valid URI * @name: an application's name - * @exec: location for the command line of the application, or %NULL - * @count: return location for the registration count, or %NULL - * @stamp: return location for the last registration time, or %NULL + * @exec: (allow-none) (out): return location for the command line of the application, or %NULL + * @count: (allow-none) (out): return location for the registration count, or %NULL + * @stamp: (allow-none) (out): return location for the last registration time, or %NULL * @error: return location for a #GError, or %NULL * * Gets the registration informations of @app_name for the bookmark for @@ -3360,7 +3316,7 @@ expand_exec_line (const gchar *exec_fmt, * the command line fails, an error of the #G_SHELL_ERROR domain is * set and %FALSE is returned. * - * Return value: %TRUE on success. + * Returns: %TRUE on success. * * Since: 2.12 */ @@ -3441,7 +3397,7 @@ g_bookmark_file_get_app_info (GBookmarkFile *bookmark, * g_bookmark_file_get_applications: * @bookmark: a #GBookmarkFile * @uri: a valid URI - * @length: return location of the length of the returned list, or %NULL + * @length: (allow-none) (out): return location of the length of the returned list, or %NULL * @error: return location for a #GError, or %NULL * * Retrieves the names of the applications that have registered the @@ -3450,7 +3406,7 @@ g_bookmark_file_get_app_info (GBookmarkFile *bookmark, * In the event the URI cannot be found, %NULL is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: a newly allocated %NULL-terminated array of strings. + * Returns: (array length=length) (transfer full): a newly allocated %NULL-terminated array of strings. * Use g_strfreev() to free it. * * Since: 2.12 @@ -3517,7 +3473,7 @@ g_bookmark_file_get_applications (GBookmarkFile *bookmark, * * Gets the number of bookmarks inside @bookmark. * - * Return value: the number of bookmarks + * Returns: the number of bookmarks * * Since: 2.12 */ @@ -3533,7 +3489,7 @@ g_bookmark_file_get_size (GBookmarkFile *bookmark) * g_bookmark_file_move_item: * @bookmark: a #GBookmarkFile * @old_uri: a valid URI - * @new_uri: a valid URI, or %NULL + * @new_uri: (allow-none): a valid URI, or %NULL * @error: return location for a #GError or %NULL * * Changes the URI of a bookmark item from @old_uri to @new_uri. Any @@ -3543,7 +3499,7 @@ g_bookmark_file_get_size (GBookmarkFile *bookmark) * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: %TRUE if the URI was successfully changed + * Returns: %TRUE if the URI was successfully changed * * Since: 2.12 */ @@ -3554,7 +3510,6 @@ g_bookmark_file_move_item (GBookmarkFile *bookmark, GError **error) { BookmarkItem *item; - GError *remove_error; g_return_val_if_fail (bookmark != NULL, FALSE); g_return_val_if_fail (old_uri != NULL, FALSE); @@ -3573,14 +3528,8 @@ g_bookmark_file_move_item (GBookmarkFile *bookmark, { if (g_bookmark_file_has_item (bookmark, new_uri)) { - remove_error = NULL; - g_bookmark_file_remove_item (bookmark, new_uri, &remove_error); - if (remove_error) - { - g_propagate_error (error, remove_error); - - return FALSE; - } + if (!g_bookmark_file_remove_item (bookmark, new_uri, error)) + return FALSE; } g_hash_table_steal (bookmark->items_by_uri, item->uri); @@ -3595,14 +3544,8 @@ g_bookmark_file_move_item (GBookmarkFile *bookmark, } else { - remove_error = NULL; - g_bookmark_file_remove_item (bookmark, old_uri, &remove_error); - if (remove_error) - { - g_propagate_error (error, remove_error); - - return FALSE; - } + if (!g_bookmark_file_remove_item (bookmark, old_uri, error)) + return FALSE; return TRUE; } @@ -3612,13 +3555,14 @@ g_bookmark_file_move_item (GBookmarkFile *bookmark, * g_bookmark_file_set_icon: * @bookmark: a #GBookmarkFile * @uri: a valid URI - * @href: the URI of the icon for the bookmark, or %NULL + * @href: (allow-none): the URI of the icon for the bookmark, or %NULL * @mime_type: the MIME type of the icon for the bookmark * - * Sets the icon for the bookmark for @uri. If @href is %NULL, unsets - * the currently set icon. + * Sets the icon for the bookmark for @uri. If @href is %NULL, unsets + * the currently set icon. @href can either be a full URL for the icon + * file or the icon name following the Icon Naming specification. * - * If no bookmark for @uri is found it is created. + * If no bookmark for @uri is found one is created. * * Since: 2.12 */ @@ -3660,8 +3604,8 @@ g_bookmark_file_set_icon (GBookmarkFile *bookmark, * g_bookmark_file_get_icon: * @bookmark: a #GBookmarkFile * @uri: a valid URI - * @href: return location for the icon's location or %NULL - * @mime_type: return location for the icon's MIME type or %NULL + * @href: (allow-none) (out): return location for the icon's location or %NULL + * @mime_type: (allow-none) (out): return location for the icon's MIME type or %NULL * @error: return location for a #GError or %NULL * * Gets the icon of the bookmark for @uri. @@ -3669,7 +3613,7 @@ g_bookmark_file_set_icon (GBookmarkFile *bookmark, * In the event the URI cannot be found, %FALSE is returned and * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. * - * Return value: %TRUE if the icon for the bookmark for the URI was found. + * Returns: %TRUE if the icon for the bookmark for the URI was found. * You should free the returned strings. * * Since: 2.12 @@ -3707,6 +3651,3 @@ g_bookmark_file_get_icon (GBookmarkFile *bookmark, return TRUE; } - -#define __G_BOOKMARK_FILE_C__ -#include "galiasdef.c"