[tepl] MetadataManager and co: implement merge_into()
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] MetadataManager and co: implement merge_into()
- Date: Sat, 18 Apr 2020 17:21:13 +0000 (UTC)
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]