gboolean values_loaded; /* It is true if the file
has been read */
- gboolean modified; /* It is true if the file
- has top be written */
-
guint timeout_id;
GHashTable *items;
static EvMetadataManager *ev_metadata_manager = NULL;
+/**
+ * item_free:
+ * @data: a pointer to a #Item data
+ *
+ * It does free the values on the #GHashTable where data points.
+ */
static void
item_free (gpointer data)
{
g_free (item);
}
+/**
+ * ev_metadata_arm_timeout
+ *
+ * Setup a timeout for saving the metadata to disk.
+ */
+static void
+ev_metadata_arm_timeout(void)
+{
+ if (ev_metadata_manager->timeout_id)
+ return;
+#if GLIB_CHECK_VERSION (2, 13, 5)
+ ev_metadata_manager->timeout_id =
+ g_timeout_add_seconds_full (G_PRIORITY_DEFAULT_IDLE,
+ 2,
+ (GSourceFunc)ev_metadata_manager_save,
+ NULL,
+ NULL);
+#else
+ ev_metadata_manager->timeout_id =
+ g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE,
+ 2000, /* 2 sec */
+ (GSourceFunc)ev_metadata_manager_save,
+ NULL,
+ NULL);
+#endif
+}
+
+/**
+ * ev_metadata_manager_init:
+ *
+ * Creates an EvMetadataManager with default values.
+ *
+ * values_loaded -> %FALSE.
+ * timeout_id -> the id of the event source.
+ * items -> a new full empty #GHashTable.
+ */
void
ev_metadata_manager_init (void)
{
ev_metadata_manager = g_new0 (EvMetadataManager, 1);
ev_metadata_manager->values_loaded = FALSE;
- ev_metadata_manager->modified = FALSE;
ev_metadata_manager->items =
g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
item_free);
-
- ev_metadata_manager->timeout_id =
- g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE,
- 2000, /* 2 sec */
- (GSourceFunc)ev_metadata_manager_save,
- NULL,
- NULL);
}
/* This function must be called before exiting ev */
if (ev_metadata_manager == NULL)
return;
- g_source_remove (ev_metadata_manager->timeout_id);
-
- ev_metadata_manager_save (NULL);
+ if (ev_metadata_manager->timeout_id) {
+ g_source_remove (ev_metadata_manager->timeout_id);
+ ev_metadata_manager->timeout_id = 0;
+ ev_metadata_manager_save (NULL);
+ }
if (ev_metadata_manager->items != NULL)
g_hash_table_destroy (ev_metadata_manager->items);
}
item->atime = time (NULL);
- ev_metadata_manager->modified = TRUE;
+ ev_metadata_arm_timeout ();
return;
}
/**
- * ev_metadata_manager_set:
+ * ev_metadata_manager_get:
* @uri: Uri to set data for, if @NULL, we return default value
* @key: Key to set uri
* @value: GValue struct filled up with value
item->atime = time (NULL);
- ev_metadata_manager->modified = TRUE;
+ ev_metadata_arm_timeout ();
}
static void
string_value = g_strdup_printf ("%d", g_value_get_int (value));
break;
case G_TYPE_DOUBLE:
- string_value = g_strdup_printf ("%f", g_value_get_double (value));
- break;
+ {
+ gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, g_value_get_double (value));
+ string_value = g_strdup_printf ("%s", buf);
+ }
+ break;
case G_TYPE_BOOLEAN:
string_value = g_strdup_printf ("%d", g_value_get_boolean (value));
break;
xmlNodePtr root;
gchar *file_name;
- if (!ev_metadata_manager->modified)
- return TRUE;
+ ev_metadata_manager->timeout_id = 0;
resize_items ();
xmlFreeDoc (doc);
- ev_metadata_manager->modified = FALSE;
-
- return TRUE;
+ return FALSE;
}
void