/* 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; }