[tepl] MetadataManager and co: implement merge_into()



commit bdd4172ec25c57a095634dcd99399ddc104e4539
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sat Apr 18 15:29:41 2020 +0200

    MetadataManager and co: implement merge_into()

 tepl/tepl-metadata-attic.c   | 34 ++++++++++++++++++++++++++++++++++
 tepl/tepl-metadata-attic.h   |  4 ++++
 tepl/tepl-metadata-manager.c | 15 ++++++++++++---
 tepl/tepl-metadata.c         | 10 ++++++++++
 tepl/tepl-metadata.h         |  5 +++++
 5 files changed, 65 insertions(+), 3 deletions(-)
---
diff --git a/tepl/tepl-metadata-attic.c b/tepl/tepl-metadata-attic.c
index deb43ca..7fddf9a 100644
--- a/tepl/tepl-metadata-attic.c
+++ b/tepl/tepl-metadata-attic.c
@@ -210,3 +210,37 @@ _tepl_metadata_attic_copy_into (TeplMetadataAttic *from_metadata_attic,
 
        set_current_atime (from_metadata_attic);
 }
+
+static void
+merge_into__from_metadata_foreach_cb (gpointer key_p,
+                                     gpointer value_p,
+                                     gpointer user_data)
+{
+       const gchar *key = key_p;
+       const gchar *value = value_p; /* Can be NULL. */
+       TeplMetadataAttic *into_metadata_attic = TEPL_METADATA_ATTIC (user_data);
+
+       if (value != NULL)
+       {
+               _tepl_metadata_attic_insert_entry (into_metadata_attic, key, value);
+       }
+       else
+       {
+               /* Unset. */
+               g_hash_table_remove (into_metadata_attic->priv->hash_table, key);
+       }
+}
+
+void
+_tepl_metadata_attic_merge_into (TeplMetadataAttic *into_metadata_attic,
+                                TeplMetadata      *from_metadata)
+{
+       g_return_if_fail (TEPL_IS_METADATA_ATTIC (into_metadata_attic));
+       g_return_if_fail (TEPL_IS_METADATA (from_metadata));
+
+       _tepl_metadata_foreach (from_metadata,
+                               merge_into__from_metadata_foreach_cb,
+                               into_metadata_attic);
+
+       set_current_atime (into_metadata_attic);
+}
diff --git a/tepl/tepl-metadata-attic.h b/tepl/tepl-metadata-attic.h
index 73615ca..6310c56 100644
--- a/tepl/tepl-metadata-attic.h
+++ b/tepl/tepl-metadata-attic.h
@@ -76,6 +76,10 @@ G_GNUC_INTERNAL
 void                   _tepl_metadata_attic_copy_into                  (TeplMetadataAttic 
*from_metadata_attic,
                                                                         TeplMetadata      *to_metadata);
 
+G_GNUC_INTERNAL
+void                   _tepl_metadata_attic_merge_into                 (TeplMetadataAttic 
*into_metadata_attic,
+                                                                        TeplMetadata      *from_metadata);
+
 G_END_DECLS
 
 #endif /* TEPL_METADATA_ATTIC_H */
diff --git a/tepl/tepl-metadata-manager.c b/tepl/tepl-metadata-manager.c
index b93b8d9..74767f4 100644
--- a/tepl/tepl-metadata-manager.c
+++ b/tepl/tepl-metadata-manager.c
@@ -353,15 +353,24 @@ tepl_metadata_manager_merge_into (TeplMetadataManager *into_manager,
                                  GFile               *for_location,
                                  TeplMetadata        *from_metadata)
 {
-       TeplMetadataAttic *metadata_attic;
+       TeplMetadataAttic *into_metadata_attic;
 
        g_return_if_fail (TEPL_IS_METADATA_MANAGER (into_manager));
        g_return_if_fail (G_IS_FILE (for_location));
        g_return_if_fail (TEPL_IS_METADATA (from_metadata));
 
-       metadata_attic = g_hash_table_lookup (into_manager->priv->hash_table, for_location);
+       into_metadata_attic = g_hash_table_lookup (into_manager->priv->hash_table, for_location);
 
-       /* TODO */
+       if (into_metadata_attic == NULL)
+       {
+               into_metadata_attic = _tepl_metadata_attic_new ();
+
+               g_hash_table_replace (into_manager->priv->hash_table,
+                                     g_object_ref (for_location),
+                                     into_metadata_attic);
+       }
+
+       _tepl_metadata_attic_merge_into (into_metadata_attic, from_metadata);
 
        into_manager->priv->modified = TRUE;
 }
diff --git a/tepl/tepl-metadata.c b/tepl/tepl-metadata.c
index 3d3cc9b..2b61b01 100644
--- a/tepl/tepl-metadata.c
+++ b/tepl/tepl-metadata.c
@@ -89,6 +89,16 @@ tepl_metadata_set (TeplMetadata *metadata,
                              g_strdup (value));
 }
 
+void
+_tepl_metadata_foreach (TeplMetadata *metadata,
+                       GHFunc        func,
+                       gpointer      user_data)
+{
+       g_return_if_fail (TEPL_IS_METADATA (metadata));
+
+       g_hash_table_foreach (metadata->priv->hash_table, func, user_data);
+}
+
 static gboolean
 key_char_is_valid (gchar ch)
 {
diff --git a/tepl/tepl-metadata.h b/tepl/tepl-metadata.h
index 30404be..12ef2f4 100644
--- a/tepl/tepl-metadata.h
+++ b/tepl/tepl-metadata.h
@@ -64,6 +64,11 @@ void         tepl_metadata_set               (TeplMetadata *metadata,
                                                 const gchar  *key,
                                                 const gchar  *value);
 
+G_GNUC_INTERNAL
+void           _tepl_metadata_foreach          (TeplMetadata *metadata,
+                                                GHFunc        func,
+                                                gpointer      user_data);
+
 G_GNUC_INTERNAL
 gboolean       _tepl_metadata_key_is_valid     (const gchar *key);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]