static gboolean gst_preset_default_set_meta (GstPreset * preset, const gchar * name, const gchar * tag, const gchar * value) { GKeyFile *presets; gchar *key; /* get the presets from the type */ if (!(presets = preset_get_keyfile (preset))) goto no_presets; key = g_strdup_printf ("_meta/%s", tag); if (value && *value) { g_key_file_set_value (presets, name, key, value); } else { g_key_file_remove_key (presets, name, key, NULL); } g_free (key); /* save updated keyfile */ return gst_preset_default_save_presets_file (preset); /* ERRORS */ no_presets: { GST_WARNING_OBJECT (preset, "no presets"); return FALSE; } }
/* delete a group from the keyfile */ static gboolean gst_preset_default_delete_preset (GstPreset * preset, const gchar * name) { GKeyFile *presets; /* get the presets from the type */ if (!(presets = preset_get_keyfile (preset))) goto no_presets; /* get the group */ if (!g_key_file_has_group (presets, name)) goto no_group; /* remove the group */ g_key_file_remove_group (presets, name, NULL); /* save updated version */ return gst_preset_default_save_presets_file (preset); /* ERRORS */ no_presets: { GST_WARNING_OBJECT (preset, "no presets"); return FALSE; } no_group: { GST_WARNING_OBJECT (preset, "no preset named %s", name); return FALSE; } }
/* copies all keys and comments from one group to another, deleting the old * group. */ static gboolean gst_preset_default_rename_preset (GstPreset * preset, const gchar * old_name, const gchar * new_name) { GKeyFile *presets; gchar *str; gchar **keys; gsize i, num_keys; /* get the presets from the type */ if (!(presets = preset_get_keyfile (preset))) goto no_presets; if (!g_key_file_has_group (presets, old_name)) goto no_group; /* copy group comment if there is any */ if ((str = g_key_file_get_comment (presets, old_name, NULL, NULL))) { g_key_file_set_comment (presets, new_name, NULL, str, NULL); g_free (str); } /* get all keys from the old group and copy them in the new group */ keys = g_key_file_get_keys (presets, old_name, &num_keys, NULL); for (i = 0; i < num_keys; i++) { /* copy key comment if there is any */ if ((str = g_key_file_get_comment (presets, old_name, keys[i], NULL))) { g_key_file_set_comment (presets, new_name, keys[i], str, NULL); g_free (str); } /* copy key value */ str = g_key_file_get_value (presets, old_name, keys[i], NULL); g_key_file_set_value (presets, new_name, keys[i], str); g_free (str); } g_strfreev (keys); /* remove old group */ g_key_file_remove_group (presets, old_name, NULL); /* save updated version */ return gst_preset_default_save_presets_file (preset); /* ERRORS */ no_presets: { GST_WARNING_OBJECT (preset, "no presets"); return FALSE; } no_group: { GST_WARNING_OBJECT (preset, "no preset named %s", old_name); return FALSE; } }
/* save the preset with the given name */ static gboolean gst_preset_default_save_preset (GstPreset * preset, const gchar * name) { GKeyFile *presets; gchar **props; guint i; GObjectClass *gclass; gboolean is_child_proxy; GST_INFO_OBJECT (preset, "saving new preset: %s", name); /* get the presets from the type */ if (!(presets = preset_get_keyfile (preset))) goto no_presets; /* take copies of current gobject properties from preset */ if (!(props = gst_preset_get_property_names (preset))) goto no_properties; gclass = G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS (preset)); is_child_proxy = GST_IS_CHILD_PROXY (preset); /* loop over the object properties and store the property value in the * keyfile */ for (i = 0; props[i]; i++) { GValue gvalue = { 0, }; gchar *str; GParamSpec *property = NULL; if (is_child_proxy) { gst_child_proxy_lookup ((GstChildProxy *) preset, props[i], NULL, &property); } else { property = g_object_class_find_property (gclass, props[i]); } if (!property) { /* the element said it supported the property but then it does not have * that property. This should not happen. */ GST_WARNING_OBJECT (preset, "property '%s' not in object", props[i]); continue; } g_value_init (&gvalue, property->value_type); if (is_child_proxy) { gst_child_proxy_get_property ((GstChildProxy *) preset, props[i], &gvalue); } else { g_object_get_property ((GObject *) preset, props[i], &gvalue); } if ((str = gst_value_serialize (&gvalue))) { g_key_file_set_string (presets, name, props[i], (gpointer) str); g_free (str); } else { GST_WARNING_OBJECT (preset, "serialization for property '%s' failed", props[i]); } g_value_unset (&gvalue); } GST_INFO_OBJECT (preset, " saved"); g_strfreev (props); /* save updated version */ return gst_preset_default_save_presets_file (preset); /* ERRORS */ no_presets: { GST_WARNING_OBJECT (preset, "no presets"); return FALSE; } no_properties: { GST_INFO_OBJECT (preset, "no properties"); return FALSE; } }
/* reads the user and system presets files and merges them together. This * function caches the GKeyFile on the element type. If there is no existing * preset file, a new in-memory GKeyFile will be created. */ static GKeyFile * preset_get_keyfile (GstPreset * preset) { GKeyFile *presets; GType type = G_TYPE_FROM_INSTANCE (preset); /* first see if the have a cached version for the type */ if (!(presets = g_type_get_qdata (type, preset_quark))) { const gchar *preset_user_path, *preset_app_path, *preset_system_path; guint64 version_system = G_GUINT64_CONSTANT (0); guint64 version_app = G_GUINT64_CONSTANT (0); guint64 version_user = G_GUINT64_CONSTANT (0); guint64 version = G_GUINT64_CONSTANT (0); gboolean merged = FALSE; GKeyFile *in_user, *in_app = NULL, *in_system; preset_get_paths (preset, &preset_user_path, &preset_app_path, &preset_system_path); /* try to load the user, app and system presets, we do this to get the * versions of all files. */ in_user = preset_open_and_parse_header (preset, preset_user_path, &version_user); if (preset_app_path) { in_app = preset_open_and_parse_header (preset, preset_app_path, &version_app); } in_system = preset_open_and_parse_header (preset, preset_system_path, &version_system); /* compare version to check for merge */ if (in_system) { presets = in_system; version = version_system; } if (in_app) { /* if system version is higher, merge */ if (version > version_app) { preset_merge (presets, in_app); g_key_file_free (in_app); } else { if (presets) g_key_file_free (presets); presets = in_app; version = version_system; } } if (in_user) { /* if system or app version is higher, merge */ if (version > version_user) { preset_merge (presets, in_user); g_key_file_free (in_user); merged = TRUE; } else { if (presets) g_key_file_free (presets); presets = in_user; } } if (!presets) { /* we did not load a user, app or system presets file, create a new one */ presets = g_key_file_new (); g_key_file_set_string (presets, PRESET_HEADER, PRESET_HEADER_ELEMENT_NAME, G_OBJECT_TYPE_NAME (preset)); } /* attach the preset to the type */ g_type_set_qdata (type, preset_quark, (gpointer) presets); if (merged) { gst_preset_default_save_presets_file (preset); } } return presets; }
/* reads the user and system presets files and merges them together. This * function caches the GKeyFile on the element type. If there is no existing * preset file, a new in-memory GKeyFile will be created. */ static GKeyFile * preset_get_keyfile (GstPreset * preset) { GKeyFile *presets; GType type = G_TYPE_FROM_INSTANCE (preset); /* first see if the have a cached version for the type */ if (!(presets = g_type_get_qdata (type, preset_quark))) { const gchar *preset_user_path, *preset_system_path; gchar *str_version_user = NULL, *str_version_system = NULL; gboolean updated_from_system = FALSE; GKeyFile *in_user, *in_system; preset_get_paths (preset, &preset_user_path, &preset_system_path); /* try to load the user and system presets, we do this to get the versions * of both files. */ in_user = preset_open_and_parse_header (preset, preset_user_path, &str_version_user); in_system = preset_open_and_parse_header (preset, preset_system_path, &str_version_system); /* compare version to check for merge */ if (in_system) { /* keep system presets if there is no user preset or when the system * version is higher than the user version. */ if (!in_user) { presets = in_system; } else if (preset_parse_version (str_version_system) > preset_parse_version (str_version_user)) { presets = in_system; updated_from_system = TRUE; } } if (in_user) { if (updated_from_system) { /* merge user on top of system presets */ preset_merge (presets, in_user); g_key_file_free (in_user); } else { /* keep user presets */ presets = in_user; } } if (!in_user && !in_system) { /* we did not load a user or system presets file, create a new one */ presets = g_key_file_new (); g_key_file_set_string (presets, PRESET_HEADER, PRESET_HEADER_ELEMENT_NAME, G_OBJECT_TYPE_NAME (preset)); } g_free (str_version_user); g_free (str_version_system); /* attach the preset to the type */ g_type_set_qdata (type, preset_quark, (gpointer) presets); if (updated_from_system) { gst_preset_default_save_presets_file (preset); } } return presets; }