]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-metadata-manager.c
Updated Serbian translation
[evince.git] / shell / ev-metadata-manager.c
index 053ef9477508e5648d510c2ca043dd1ca543f88f..4103a3516eeb5db96a44789b530c769813a948af 100644 (file)
@@ -43,7 +43,7 @@
 
 #define MAX_ITEMS      50
 
-typedef struct _GeditMetadataManager GeditMetadataManager;
+typedef struct _EvMetadataManager EvMetadataManager;
 
 typedef struct _Item Item;
 
@@ -54,7 +54,7 @@ struct _Item
        GHashTable      *values;
 };
        
-struct _GeditMetadataManager
+struct _EvMetadataManager
 {
        gboolean         values_loaded; /* It is true if the file 
                                           has been read */
@@ -67,10 +67,10 @@ struct _GeditMetadataManager
        GHashTable      *items;
 };
 
-static void ev_metadata_manager_save (gpointer data);
+static gboolean ev_metadata_manager_save (gpointer data);
 
 
-static GeditMetadataManager *ev_metadata_manager = NULL;
+static EvMetadataManager *ev_metadata_manager = NULL;
 
 static void
 item_free (gpointer data)
@@ -87,13 +87,10 @@ item_free (gpointer data)
        g_free (item);
 }
 
-static gboolean
+void
 ev_metadata_manager_init (void)
 {
-       if (ev_metadata_manager != NULL)
-               return TRUE;
-
-       ev_metadata_manager = g_new0 (GeditMetadataManager, 1);
+       ev_metadata_manager = g_new0 (EvMetadataManager, 1);
 
        ev_metadata_manager->values_loaded = FALSE;
        ev_metadata_manager->modified = FALSE;
@@ -110,8 +107,6 @@ ev_metadata_manager_init (void)
                                    (GSourceFunc)ev_metadata_manager_save,
                                    NULL,
                                    NULL);
-       
-       return TRUE;
 }
 
 /* This function must be called before exiting ev */
@@ -147,13 +142,13 @@ parse_value (xmlChar *value, xmlChar *type)
                        g_value_set_string (ret, (char *)value);
                        break;
                case G_TYPE_INT:
-                       g_value_set_int (ret, atoi ((char *)value));
+                       g_value_set_int (ret, g_ascii_strtoull ((char *)value, NULL, 0));
                        break;
                case G_TYPE_DOUBLE:
-                       g_value_set_double (ret, atof ((char *)value));
+                       g_value_set_double (ret, g_ascii_strtod ((char *)value, NULL));
                        break;
                case G_TYPE_BOOLEAN:
-                       g_value_set_boolean (ret, atoi ((char *)value));
+                       g_value_set_boolean (ret, g_ascii_strtoull ((char *)value, NULL, 0));
                        break;
        }
 
@@ -184,7 +179,7 @@ parseItem (xmlDocPtr doc, xmlNodePtr cur)
 
        item = g_new0 (Item, 1);
 
-       item->atime = atol ((char *)atime);
+       item->atime = g_ascii_strtoull((char*)atime, NULL, 0);
        
        item->values = g_hash_table_new_full (g_str_hash, 
                                              g_str_equal, 
@@ -291,19 +286,122 @@ load_values ()
        return TRUE;
 }
 
+static void
+value_free (gpointer data)
+{
+       GValue *value = (GValue *)data;
+
+       g_value_unset (value);
+       g_free (value);
+}
+
+
+#define LAST_URI "last-used-value"
+
+static gboolean
+ev_metadata_manager_get_last (const gchar *key,
+                                GValue      *value,
+                                gboolean     ignore)
+{
+       Item *item;
+       GValue *ret;
+
+       g_assert (ev_metadata_manager->values_loaded);
+       
+       if (ignore)
+               return FALSE;
+
+       item = (Item *)g_hash_table_lookup (ev_metadata_manager->items,
+                                           LAST_URI);
+
+       if (item == NULL)
+               return FALSE;
+
+       item->atime = time (NULL);
+       
+       if (item->values == NULL)
+               return FALSE;
+       
+       ret = (GValue *)g_hash_table_lookup (item->values, key);
+
+       if (ret != NULL) {
+               g_value_init (value, G_VALUE_TYPE (ret));
+               g_value_copy (ret, value);
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
+static void
+ev_metadata_manager_set_last (const gchar *key,
+                             const GValue *value)
+{
+       Item *item;
+       
+       g_assert (ev_metadata_manager->values_loaded);
+
+       item = (Item *)g_hash_table_lookup (ev_metadata_manager->items,
+                                           LAST_URI);
+
+       if (item == NULL)
+       {
+               item = g_new0 (Item, 1);
+
+               g_hash_table_insert (ev_metadata_manager->items,
+                                    g_strdup (LAST_URI),
+                                    item);
+       }
+       
+       if (item->values == NULL)
+                item->values = g_hash_table_new_full (g_str_hash, 
+                                                      g_str_equal, 
+                                                      g_free, 
+                                                      value_free);
+       if (value != NULL) {
+               GValue *new;
+
+               new = g_new0 (GValue, 1);
+               g_value_init (new, G_VALUE_TYPE (value));
+               g_value_copy (value, new);
+
+               g_hash_table_insert (item->values,
+                                    g_strdup (key),
+                                    new);
+       } else {
+               g_hash_table_remove (item->values,
+                                    key);
+       }
+
+       item->atime = time (NULL);
+       ev_metadata_manager->modified = TRUE;
+       return;
+}
+                                
+/**
+ * ev_metadata_manager_set:
+ * @uri: Uri to set data for, if @NULL, we return default value
+ * @key: Key to set uri
+ * @value: GValue struct filled up with value
+ * @ignore_last: if @TRUE, default value is ignored
+ * 
+ * Retrieve value for uri in metadata database
+ * 
+ * Returns: @TRUE if value was taken.
+ **/
 gboolean
 ev_metadata_manager_get (const gchar *uri,
                         const gchar *key,
-                        GValue      *value)
+                        GValue      *value, 
+                        gboolean     ignore_last)
 {
        Item *item;
        GValue *ret;
        
-       g_return_val_if_fail (uri != NULL, FALSE);
        g_return_val_if_fail (key != NULL, FALSE);
 
        if (ev_metadata_manager == NULL)
-               ev_metadata_manager_init ();
+               return FALSE;
 
        if (!ev_metadata_manager->values_loaded)
        {
@@ -312,41 +410,42 @@ ev_metadata_manager_get (const gchar *uri,
                res = load_values ();
 
                if (!res)
-                       return FALSE;
+                       return ev_metadata_manager_get_last (key, value, ignore_last);
        }
 
+       if (uri == NULL)
+               return ev_metadata_manager_get_last (key, value, ignore_last);
+
        item = (Item *)g_hash_table_lookup (ev_metadata_manager->items,
                                            uri);
 
        if (item == NULL)
-               return FALSE;
+               return ev_metadata_manager_get_last (key, value, ignore_last);
 
        item->atime = time (NULL);
        
        if (item->values == NULL)
-               return FALSE;
+               return ev_metadata_manager_get_last (key, value, ignore_last);
        
        ret = (GValue *)g_hash_table_lookup (item->values, key);
 
-       if (ret == NULL) {
-               return FALSE;
-       } else {
+       if (ret != NULL) {
                g_value_init (value, G_VALUE_TYPE (ret));
                g_value_copy (ret, value);
-
                return TRUE;
        }
-}
-
-static void
-value_free (gpointer data)
-{
-       GValue *value = (GValue *)data;
 
-       g_value_unset (value);
-       g_free (value);
+       return ev_metadata_manager_get_last (key, value, ignore_last);
 }
 
+/**
+ * ev_metadata_manager_set:
+ * @uri: Uri to set data for, if @NULL, we set default value
+ * @key: Key to set uri
+ * @value: GValue struct containing value
+ * 
+ * Set value for key in metadata database
+ **/
 void
 ev_metadata_manager_set (const gchar  *uri,
                         const gchar  *key,
@@ -354,11 +453,10 @@ ev_metadata_manager_set (const gchar  *uri,
 {
        Item *item;
 
-       g_return_if_fail (uri != NULL);
        g_return_if_fail (key != NULL);
 
        if (ev_metadata_manager == NULL)
-               ev_metadata_manager_init ();
+               return;
 
        if (!ev_metadata_manager->values_loaded)
        {
@@ -370,6 +468,12 @@ ev_metadata_manager_set (const gchar  *uri,
                        return;
        }
 
+       if (uri == NULL)
+       {
+               ev_metadata_manager_set_last (key, value);
+               return;
+       }
+
        item = (Item *)g_hash_table_lookup (ev_metadata_manager->items,
                                            uri);
 
@@ -397,6 +501,7 @@ ev_metadata_manager_set (const gchar  *uri,
                g_hash_table_insert (item->values,
                                     g_strdup (key),
                                     new);
+               ev_metadata_manager_set_last (key, value);
        } else {
                g_hash_table_remove (item->values,
                                     key);
@@ -464,10 +569,8 @@ save_item (const gchar *key, const gpointer *data, xmlNodePtr parent)
        
        xmlSetProp (xml_node, (const xmlChar *)"uri", (const xmlChar *)key);
 
-       /* FIXME: is the cast right? - Paolo */
-       atime = g_strdup_printf ("%d", (int)item->atime);
-       xmlSetProp (xml_node, (const xmlChar *)"atime", (const xmlChar *)atime);        
-
+       atime = g_strdup_printf ("%ld", item->atime);
+       xmlSetProp (xml_node, (const xmlChar *)"atime", (const xmlChar *)atime);
        g_free (atime);
 
        g_hash_table_foreach (item->values,
@@ -516,7 +619,7 @@ resize_items ()
        }
 }
 
-static void
+static gboolean
 ev_metadata_manager_save (gpointer data)
 {      
        xmlDocPtr  doc;
@@ -524,7 +627,7 @@ ev_metadata_manager_save (gpointer data)
        gchar *file_name;
 
        if (!ev_metadata_manager->modified)
-               return;
+               return TRUE;
 
        resize_items ();
                
@@ -532,7 +635,7 @@ ev_metadata_manager_save (gpointer data)
 
        doc = xmlNewDoc ((const xmlChar *)"1.0");
        if (doc == NULL)
-               return;
+               return TRUE;
 
        /* Create metadata root */
        root = xmlNewDocNode (doc, NULL, (const xmlChar *)"metadata", NULL);
@@ -549,6 +652,8 @@ ev_metadata_manager_save (gpointer data)
        xmlFreeDoc (doc); 
 
        ev_metadata_manager->modified = FALSE;
+
+       return TRUE;
 }
 
 void
@@ -561,7 +666,7 @@ ev_metadata_manager_set_int (const gchar *uri, const gchar *key, int value)
 
        ev_metadata_manager_set (uri, key, &val);
 
-       g_value_unset (&value);
+       g_value_unset (&val);
 }
 
 void
@@ -574,7 +679,7 @@ ev_metadata_manager_set_double (const gchar *uri, const gchar *key, double value
 
        ev_metadata_manager_set (uri, key, &val);
 
-       g_value_unset (&value);
+       g_value_unset (&val);
 }
 
 void
@@ -587,7 +692,7 @@ ev_metadata_manager_set_string (const gchar *uri, const gchar *key, const gchar
 
        ev_metadata_manager_set (uri, key, &val);
 
-       g_value_unset (&value);
+       g_value_unset (&val);
 }
 
 void
@@ -600,5 +705,5 @@ ev_metadata_manager_set_boolean (const gchar *uri, const gchar *key, gboolean va
 
        ev_metadata_manager_set (uri, key, &val);
 
-       g_value_unset (&value);
+       g_value_unset (&val);
 }