/* * e-source-autoconfig.c * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . * */ #include "evolution-data-server-config.h" /** * SECTION: e-source-autoconfig * @include: libedataserver/libedataserver.h * @short_description: #ESource extension for autoconfig settings * * The #ESourceAutoconfig extension keeps a mapping between user-specific * sources and system-wide ones. * * Access the extension as follows: * * |[ * #include * * ESourceAutoconfig *extension; * * extension = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTOCONFIG); * ]| **/ #include "e-data-server-util.h" #include "e-source-autoconfig.h" struct _ESourceAutoconfigPrivate { gchar *revision; }; enum { PROP_0, PROP_REVISION }; G_DEFINE_TYPE_WITH_PRIVATE ( ESourceAutoconfig, e_source_autoconfig, E_TYPE_SOURCE_EXTENSION) static void source_autoconfig_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_REVISION: g_value_take_string ( value, e_source_autoconfig_dup_revision ( E_SOURCE_AUTOCONFIG (object))); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_autoconfig_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_REVISION: e_source_autoconfig_set_revision ( E_SOURCE_AUTOCONFIG (object), g_value_get_string (value)); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_autoconfig_finalize (GObject *object) { ESourceAutoconfigPrivate *priv; priv = E_SOURCE_AUTOCONFIG (object)->priv; g_free (priv->revision); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_source_autoconfig_parent_class)->finalize (object); } static void e_source_autoconfig_class_init (ESourceAutoconfigClass *class) { GObjectClass *object_class; ESourceExtensionClass *extension_class; object_class = G_OBJECT_CLASS (class); object_class->set_property = source_autoconfig_set_property; object_class->get_property = source_autoconfig_get_property; object_class->finalize = source_autoconfig_finalize; extension_class = E_SOURCE_EXTENSION_CLASS (class); extension_class->name = E_SOURCE_EXTENSION_AUTOCONFIG; g_object_class_install_property ( object_class, PROP_REVISION, g_param_spec_string ( "revision", "Revision", "Identifier to map a particular version of a system-wide source to a user-specific source", "", G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); } static void e_source_autoconfig_init (ESourceAutoconfig *extension) { extension->priv = e_source_autoconfig_get_instance_private (extension); } /** * e_source_autoconfig_get_revision: * @extension: an #ESourceAutoconfig * * Returns the revision of a data source. This maps a particular version of a * system-wide source to a user-specific source. * * If doesn't match, the system-wide source will be copied to the user-specific * evolution config directory, preserving the already present fields that are * not defined by the system-wide source. * * If it matches, no copying is done. * * Returns: revision of the data source * * Since: 3.24 **/ const gchar * e_source_autoconfig_get_revision (ESourceAutoconfig *extension) { g_return_val_if_fail (E_IS_SOURCE_AUTOCONFIG (extension), NULL); return extension->priv->revision; } /** * e_source_autoconfig_dup_revision: * @extension: an #ESourceAutoconfig * * Thread-safe variation of e_source_autoconfig_get_revision(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (transfer full): a newly-allocated copy of #ESourceAutoconfig:revision * * Since: 3.24 **/ gchar * e_source_autoconfig_dup_revision (ESourceAutoconfig *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_AUTOCONFIG (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_autoconfig_get_revision (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_autoconfig_set_revision: * @extension: an #ESourceAutoconfig * @revision: a revision * * Sets the revision used to map a particular version of a system-wide source * to a user-specific source. * * If doesn't match, the system-wide source will be copied to the user-specific * evolution config directory, preserving the already present fields that are * not defined by the system-wide source. * * If it matches, no copying is done. * * The internal copy of @revision is automatically stripped of leading and * trailing whitespace. * * Since: 3.24 **/ void e_source_autoconfig_set_revision (ESourceAutoconfig *extension, const gchar *revision) { g_return_if_fail (E_IS_SOURCE_AUTOCONFIG (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->revision, revision) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->revision); extension->priv->revision = e_util_strdup_strip (revision); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "revision"); }