]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-metadata-manager.c
Add Belarusian translation
[evince.git] / shell / ev-metadata-manager.c
index 053ef9477508e5648d510c2ca043dd1ca543f88f..b6638c95b862b6089bfc03d1ebd666f080d9c5f9 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 */
@@ -291,19 +286,111 @@ 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;
+}
+                                
 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,39 +399,32 @@ 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);
 }
 
 void
@@ -354,11 +434,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 +449,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 +482,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);
@@ -516,7 +602,7 @@ resize_items ()
        }
 }
 
-static void
+static gboolean
 ev_metadata_manager_save (gpointer data)
 {      
        xmlDocPtr  doc;
@@ -524,7 +610,7 @@ ev_metadata_manager_save (gpointer data)
        gchar *file_name;
 
        if (!ev_metadata_manager->modified)
-               return;
+               return TRUE;
 
        resize_items ();
                
@@ -532,7 +618,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 +635,8 @@ ev_metadata_manager_save (gpointer data)
        xmlFreeDoc (doc); 
 
        ev_metadata_manager->modified = FALSE;
+
+       return TRUE;
 }
 
 void
@@ -561,7 +649,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 +662,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 +675,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 +688,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);
 }