Do not set the timestamp value using time(), as it will be overwritten
authorEmmanuele Bassi <ebassi@gnome.org>
Mon, 21 Jul 2008 13:05:24 +0000 (13:05 +0000)
committerEmmanuele Bassi <ebassi@src.gnome.org>
Mon, 21 Jul 2008 13:05:24 +0000 (13:05 +0000)
2008-07-21  Emmanuele Bassi  <ebassi@gnome.org>

* glib/gbookmarkfile.c:
(bookmark_app_info_new): Do not set the timestamp value
using time(), as it will be overwritten anyway. (#535223,
Michael Meeks)

(parse_application_element),
(bookmark_app_info_dump): Support the "modified" attribute,
which takes an ISO-formatted string instead of a Unix time
stamp, to keep the number of g_strdup_printf() calls to a
minimum.

* glib/gtimer.c:
(g_time_val_to_iso8601): Do not use strftime(): we know
the format and contents of the ISO 8601 date format we
use.

* tests/bookmarks/valid-03.xbel: Add a test file for the
modified attribute.

svn path=/trunk/; revision=7231

ChangeLog
glib/gbookmarkfile.c
glib/gtimer.c
tests/bookmarks/valid-03.xbel [new file with mode: 0644]

index 8f89af8..b256e5d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2008-07-21  Emmanuele Bassi  <ebassi@gnome.org>
+
+       * glib/gbookmarkfile.c:
+       (bookmark_app_info_new): Do not set the timestamp value
+       using time(), as it will be overwritten anyway. (#535223,
+       Michael Meeks)
+
+       (parse_application_element),
+       (bookmark_app_info_dump): Support the "modified" attribute,
+       which takes an ISO-formatted string instead of a Unix time
+       stamp, to keep the number of g_strdup_printf() calls to a
+       minimum.
+
+       * glib/gtimer.c:
+       (g_time_val_to_iso8601): Do not use strftime(): we know
+       the format and contents of the ISO 8601 date format we
+       use.
+
+       * tests/bookmarks/valid-03.xbel: Add a test file for the
+       modified attribute.
+
 2008-07-19  Matthias Clasen  <mclasen@redhat.com>
 
        * glib/tests/Makefile.am:
index cd5fce8..85aa404 100644 (file)
 #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 +228,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 +249,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 +258,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;
 }
@@ -757,8 +762,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 +783,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 +792,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,6 +803,8 @@ parse_application_element (GMarkupParseContext  *context,
         count = attribute_values[i];
       else if (IS_ATTRIBUTE (attr, BOOKMARK_TIMESTAMP_ATTRIBUTE))
         stamp = attribute_values[i];
+      else if (IS_ATTRIBUTE (attr, BOOKMARK_MODIFIED_ATTRIBUTE))
+        modified = attribute_values[i];
       else
         {
           g_set_error (error, G_MARKUP_ERROR,
@@ -850,11 +857,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
@@ -1512,7 +1527,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 +1542,7 @@ g_bookmark_file_dump (GBookmarkFile  *bookmark,
       
       retval = g_string_append (retval, item_dump);
       
-      g_free (item_dump);      
+      g_free (item_dump);
     }
 
 out:
@@ -1577,7 +1593,7 @@ timestamp_from_iso8601 (const gchar *iso_date)
 GQuark
 g_bookmark_file_error_quark (void)
 {
-  return g_quark_from_static_string ("egg-bookmark-file-error-quark");
+  return g_quark_from_static_string ("g-bookmark-file-error-quark");
 }
 
 
@@ -2102,7 +2118,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;
@@ -3615,10 +3632,11 @@ g_bookmark_file_move_item (GBookmarkFile  *bookmark,
  * @href: 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
  */
index b75730a..8a1f7f2 100644 (file)
@@ -430,20 +430,30 @@ g_time_val_to_iso8601 (GTimeVal *time_)
 
   if (time_->tv_usec != 0)
     {
-#define ISO_8601_FRAC_LEN    28
-#define ISO_8601_FRAC_FORMAT "%%Y-%%m-%%dT%%H:%%M:%%S.%06ldZ"
-      gchar *format = g_strdup_printf (ISO_8601_FRAC_FORMAT, time_->tv_usec);
-
-      retval = g_new0 (gchar, ISO_8601_FRAC_LEN + 1);
-      strftime (retval, ISO_8601_FRAC_LEN, format, tm);
-      g_free (format);
+      /* ISO 8601 date and time format, with fractionary seconds:
+       *   YYYY-MM-DDTHH:MM:SS.MMMMMMZ
+       */
+      retval = g_strdup_printf ("%d-%d-%dT%d:%d:%d.%06ldZ",
+                                tm->tm_year + 1900,
+                                tm->tm_mon + 1,
+                                tm->tm_mday,
+                                tm->tm_hour,
+                                tm->tm_min,
+                                tm->tm_sec,
+                                time_->tv_usec);
     }
   else
     {
-#define ISO_8601_LEN    21
-#define ISO_8601_FORMAT "%Y-%m-%dT%H:%M:%SZ"
-      retval = g_new0 (gchar, ISO_8601_LEN + 1);
-      strftime (retval, ISO_8601_LEN, ISO_8601_FORMAT, tm);
+      /* ISO 8601 date and time format:
+       *   YYYY-MM-DDTHH:MM:SSZ
+       */
+      retval = g_strdup_printf ("%d-%d-%dT%d:%d:%dZ",
+                                tm->tm_year + 1900,
+                                tm->tm_mon + 1,
+                                tm->tm_mday,
+                                tm->tm_hour,
+                                tm->tm_min,
+                                tm->tm_sec);
     }
   
   return retval;
diff --git a/tests/bookmarks/valid-03.xbel b/tests/bookmarks/valid-03.xbel
new file mode 100644 (file)
index 0000000..32f431d
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE xbel
+  PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+         "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+      xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
+      xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+>
+  <title>Singleton</title>
+  <desc>A file containing a single bookmark element</desc>
+  <bookmark href="file:///home/zefram/Documents/milan-stuttgart.ps" added="20050930T23:05:28Z" modified="20050930T23:05:28Z" visited="20050930T23:05:28Z">
+    <info>
+      <metadata owner="http://freedesktop.org">
+        <mime:mime-type type="application/postscript"/>
+        <bookmark:applications>
+          <bookmark:application name="populate-recent" exec="populate-recent --info %u" modified="2005-09-30T23:05:28Z" count="1"/>
+        </bookmark:applications>
+      </metadata>
+    </info>
+  </bookmark>
+</xbel>