/* * e-source-collection.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 . * */ /** * SECTION: e-source-collection * @include: libedataserver/libedataserver.h * @short_description: #ESource extension for grouping related resources * * The #ESourceCollection extension identifies the #ESource as the root * of a data source collection. * * Access the extension as follows: * * |[ * #include * * ESourceCollection *extension; * * extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION); * ]| **/ #include "evolution-data-server-config.h" #include /* Private D-Bus classes. */ #include "e-dbus-source.h" #include #include "e-source-collection.h" struct _ESourceCollectionPrivate { gchar *identity; gboolean calendar_enabled; gboolean contacts_enabled; gboolean mail_enabled; gboolean allow_sources_rename; gchar *calendar_url; gchar *contacts_url; }; enum { PROP_0, PROP_CALENDAR_ENABLED, PROP_CONTACTS_ENABLED, PROP_IDENTITY, PROP_MAIL_ENABLED, PROP_ALLOW_SOURCES_RENAME, PROP_CALENDAR_URL, PROP_CONTACTS_URL }; G_DEFINE_TYPE_WITH_PRIVATE ( ESourceCollection, e_source_collection, E_TYPE_SOURCE_BACKEND) static void source_collection_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_CALENDAR_ENABLED: e_source_collection_set_calendar_enabled ( E_SOURCE_COLLECTION (object), g_value_get_boolean (value)); return; case PROP_CONTACTS_ENABLED: e_source_collection_set_contacts_enabled ( E_SOURCE_COLLECTION (object), g_value_get_boolean (value)); return; case PROP_IDENTITY: e_source_collection_set_identity ( E_SOURCE_COLLECTION (object), g_value_get_string (value)); return; case PROP_MAIL_ENABLED: e_source_collection_set_mail_enabled ( E_SOURCE_COLLECTION (object), g_value_get_boolean (value)); return; case PROP_ALLOW_SOURCES_RENAME: e_source_collection_set_allow_sources_rename ( E_SOURCE_COLLECTION (object), g_value_get_boolean (value)); return; case PROP_CALENDAR_URL: e_source_collection_set_calendar_url ( E_SOURCE_COLLECTION (object), g_value_get_string (value)); return; case PROP_CONTACTS_URL: e_source_collection_set_contacts_url ( E_SOURCE_COLLECTION (object), g_value_get_string (value)); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_collection_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_CALENDAR_ENABLED: g_value_set_boolean ( value, e_source_collection_get_calendar_enabled ( E_SOURCE_COLLECTION (object))); return; case PROP_CONTACTS_ENABLED: g_value_set_boolean ( value, e_source_collection_get_contacts_enabled ( E_SOURCE_COLLECTION (object))); return; case PROP_IDENTITY: g_value_take_string ( value, e_source_collection_dup_identity ( E_SOURCE_COLLECTION (object))); return; case PROP_MAIL_ENABLED: g_value_set_boolean ( value, e_source_collection_get_mail_enabled ( E_SOURCE_COLLECTION (object))); return; case PROP_ALLOW_SOURCES_RENAME: g_value_set_boolean ( value, e_source_collection_get_allow_sources_rename ( E_SOURCE_COLLECTION (object))); return; case PROP_CALENDAR_URL: g_value_take_string ( value, e_source_collection_dup_calendar_url ( E_SOURCE_COLLECTION (object))); return; case PROP_CONTACTS_URL: g_value_take_string ( value, e_source_collection_dup_contacts_url ( E_SOURCE_COLLECTION (object))); return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void source_collection_finalize (GObject *object) { ESourceCollectionPrivate *priv; priv = E_SOURCE_COLLECTION (object)->priv; g_free (priv->identity); g_free (priv->calendar_url); g_free (priv->contacts_url); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_source_collection_parent_class)->finalize (object); } static void e_source_collection_class_init (ESourceCollectionClass *class) { GObjectClass *object_class; ESourceExtensionClass *extension_class; object_class = G_OBJECT_CLASS (class); object_class->set_property = source_collection_set_property; object_class->get_property = source_collection_get_property; object_class->finalize = source_collection_finalize; extension_class = E_SOURCE_EXTENSION_CLASS (class); extension_class->name = E_SOURCE_EXTENSION_COLLECTION; g_object_class_install_property ( object_class, PROP_CALENDAR_ENABLED, g_param_spec_boolean ( "calendar-enabled", "Calendar Enabled", "Whether calendar resources are enabled", TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_CONTACTS_ENABLED, g_param_spec_boolean ( "contacts-enabled", "Contacts Enabled", "Whether contact resources are enabled", TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_IDENTITY, g_param_spec_string ( "identity", "Identity", "Uniquely identifies the account " "at the service provider", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_MAIL_ENABLED, g_param_spec_boolean ( "mail-enabled", "Mail Enabled", "Whether mail resources are enabled", TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_ALLOW_SOURCES_RENAME, g_param_spec_boolean ( "allow-sources-rename", "Allow Sources Rename", "Set to TRUE when the collection source allows user rename the child sources", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_CALENDAR_URL, g_param_spec_string ( "calendar-url", "Calendar URL", "Calendar top URL", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); g_object_class_install_property ( object_class, PROP_CONTACTS_URL, g_param_spec_string ( "contacts-url", "Contacts URL", "Contacts top URL", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS | E_SOURCE_PARAM_SETTING)); } static void e_source_collection_init (ESourceCollection *extension) { extension->priv = e_source_collection_get_instance_private (extension); } /** * e_source_collection_get_identity: * @extension: an #ESourceCollection * * Returns the string used to uniquely identify the user account at * the service provider. Often this is an email address or user name. * * Returns: (nullable): the collection identity * * Since: 3.6 **/ const gchar * e_source_collection_get_identity (ESourceCollection *extension) { g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), NULL); return extension->priv->identity; } /** * e_source_collection_dup_identity: * @extension: an #ESourceCollection * * Thread-safe variation of e_source_collection_get_identity(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceCollection:identity * * Since: 3.6 **/ gchar * e_source_collection_dup_identity (ESourceCollection *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_collection_get_identity (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_collection_set_identity: * @extension: an #ESourceCollection * @identity: (nullable): the collection identity, or %NULL * * Sets the string used to uniquely identify the user account at the * service provider. Often this is an email address or user name. * * The internal copy of @identity is automatically stripped of leading * and trailing whitespace. If the resulting string is empty, %NULL is * set instead. * * Since: 3.6 **/ void e_source_collection_set_identity (ESourceCollection *extension, const gchar *identity) { g_return_if_fail (E_IS_SOURCE_COLLECTION (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->identity, identity) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->identity); extension->priv->identity = e_util_strdup_strip (identity); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "identity"); } /** * e_source_collection_get_calendar_enabled: * @extension: an #ESourceCollection * * Returns whether calendar sources within the collection should be * enabled. * * An #ECollectionBackend running within the registry D-Bus service will * automatically synchronize any calendar sources it maintains with the * #ESourceCollection:calendar-enabled property. * * Returns: whether calendar sources should be enabled * * Since: 3.6 **/ gboolean e_source_collection_get_calendar_enabled (ESourceCollection *extension) { g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), FALSE); return extension->priv->calendar_enabled; } /** * e_source_collection_set_calendar_enabled: * @extension: an #ESourceCollection * @calendar_enabled: whether calendar sources should be enabled * * Sets whether calendar sources within the collection should be enabled. * * An #ECollectionBackend running within the registry D-Bus service will * automatically synchronize any calendar sources it maintains with the * #ESourceCollection:calendar-enabled property. * * Calling this function from a registry service client has no effect until * the change is submitted to the registry service through e_source_write(), * but there should rarely be any need for clients to call this. * * Since: 3.6 **/ void e_source_collection_set_calendar_enabled (ESourceCollection *extension, gboolean calendar_enabled) { g_return_if_fail (E_IS_SOURCE_COLLECTION (extension)); if (extension->priv->calendar_enabled == calendar_enabled) return; extension->priv->calendar_enabled = calendar_enabled; g_object_notify (G_OBJECT (extension), "calendar-enabled"); } /** * e_source_collection_get_contacts_enabled: * @extension: an #ESourceCollection * * Returns whether address book sources within the collection should be * enabled. * * An #ECollectionBackend running within the registry D-Bus service will * automatically synchronize any address book sources it maintains with * the #ESourceCollection:contacts-enabled property. * * Returns: whether address book sources should be enabled * * Since: 3.6 **/ gboolean e_source_collection_get_contacts_enabled (ESourceCollection *extension) { g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), FALSE); return extension->priv->contacts_enabled; } /** * e_source_collection_set_contacts_enabled: * @extension: an #ESourceCollection * @contacts_enabled: whether address book sources should be enabled * * Sets whether address book sources within the collection should be enabled. * * An #ECollectionBackend running within the registry D-Bus service will * automatically synchronize any address book sources it maintains with * the #ESourceCollection:contacts-enabled property. * * Calling this function from a registry service client has no effect until * the change is submitted to the registry service through e_source_write(), * but there should rarely be any need for clients to call this. * * Since: 3.6 **/ void e_source_collection_set_contacts_enabled (ESourceCollection *extension, gboolean contacts_enabled) { g_return_if_fail (E_IS_SOURCE_COLLECTION (extension)); if (extension->priv->contacts_enabled == contacts_enabled) return; extension->priv->contacts_enabled = contacts_enabled; g_object_notify (G_OBJECT (extension), "contacts-enabled"); } /** * e_source_collection_get_mail_enabled: * @extension: an #ESourceCollection * * Returns whether mail sources within the collection should be enabled. * * An #ECollectionBackend running within the registry D-Bus service will * automatically synchronize any mail sources it maintains with the * #ESourceCollection:mail-enabled property. * * Returns: whether mail sources should be enabled * * Since: 3.6 **/ gboolean e_source_collection_get_mail_enabled (ESourceCollection *extension) { g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), FALSE); return extension->priv->mail_enabled; } /** * e_source_collection_set_mail_enabled: * @extension: an #ESourceCollection * @mail_enabled: whether mail sources should be enabled * * Sets whether mail sources within the collection should be enabled. * * An #ECollectionBackend running within the registry D-Bus service will * automatically synchronize any mail sources it maintains with the * #ESourceCollection:mail-enabled property. * * Calling this function from a registry service client has no effect until * the changes is submitted to the registry service through e_source_write(), * but there should rarely be any need for clients to call this. * * Since: 3.6 **/ void e_source_collection_set_mail_enabled (ESourceCollection *extension, gboolean mail_enabled) { g_return_if_fail (E_IS_SOURCE_COLLECTION (extension)); if (extension->priv->mail_enabled == mail_enabled) return; extension->priv->mail_enabled = mail_enabled; g_object_notify (G_OBJECT (extension), "mail-enabled"); } /** * e_source_collection_get_calendar_url: * @extension: an #ESourceCollection * * Returns the calendar top URL string, that is, where to search for calendar sources. * * Returns: (nullable): the calendar top URL, or %NULL * * Since: 3.26 **/ const gchar * e_source_collection_get_calendar_url (ESourceCollection *extension) { g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), NULL); return extension->priv->calendar_url; } /** * e_source_collection_dup_calendar_url: * @extension: an #ESourceCollection * * Thread-safe variation of e_source_collection_get_calendar_url(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceCollection:calendar-url * * Since: 3.26 **/ gchar * e_source_collection_dup_calendar_url (ESourceCollection *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_collection_get_calendar_url (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_collection_set_calendar_url: * @extension: an #ESourceCollection * @calendar_url: (nullable): calendar top URL, or %NULL * * Sets the calendar top URL, that is, where to search for calendar sources. * * The internal copy of @calendar_url is automatically stripped of leading * and trailing whitespace. If the resulting string is empty, %NULL is set * instead. * * Since: 3.26 **/ void e_source_collection_set_calendar_url (ESourceCollection *extension, const gchar *calendar_url) { g_return_if_fail (E_IS_SOURCE_COLLECTION (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->calendar_url, calendar_url) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->calendar_url); extension->priv->calendar_url = e_util_strdup_strip (calendar_url); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "calendar-url"); } /** * e_source_collection_get_contacts_url: * @extension: an #ESourceCollection * * Returns the contacts top URL string, that is, where to search for contact sources. * * Returns: (nullable): the contacts top URL, or %NULL * * Since: 3.26 **/ const gchar * e_source_collection_get_contacts_url (ESourceCollection *extension) { g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), NULL); return extension->priv->contacts_url; } /** * e_source_collection_dup_contacts_url: * @extension: an #ESourceCollection * * Thread-safe variation of e_source_collection_get_contacts_url(). * Use this function when accessing @extension from multiple threads. * * The returned string should be freed with g_free() when no longer needed. * * Returns: (nullable): a newly-allocated copy of #ESourceCollection:contacts-url * * Since: 3.26 **/ gchar * e_source_collection_dup_contacts_url (ESourceCollection *extension) { const gchar *protected; gchar *duplicate; g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), NULL); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); protected = e_source_collection_get_contacts_url (extension); duplicate = g_strdup (protected); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return duplicate; } /** * e_source_collection_set_contacts_url: * @extension: an #ESourceCollection * @contacts_url: (nullable): contacts top URL, or %NULL * * Sets the contacts top URL, that is, where to search for contact sources. * * The internal copy of @contacts_url is automatically stripped of leading * and trailing whitespace. If the resulting string is empty, %NULL is set * instead. * * Since: 3.26 **/ void e_source_collection_set_contacts_url (ESourceCollection *extension, const gchar *contacts_url) { g_return_if_fail (E_IS_SOURCE_COLLECTION (extension)); e_source_extension_property_lock (E_SOURCE_EXTENSION (extension)); if (e_util_strcmp0 (extension->priv->contacts_url, contacts_url) == 0) { e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); return; } g_free (extension->priv->contacts_url); extension->priv->contacts_url = e_util_strdup_strip (contacts_url); e_source_extension_property_unlock (E_SOURCE_EXTENSION (extension)); g_object_notify (G_OBJECT (extension), "contacts-url"); } /** * e_source_collection_get_allow_sources_rename: * @extension: an #ESourceCollection * * Returns whether the collection backend allows a user to rename child * sources. It is meant mainly for GUI. The default is %FALSE. * * Returns: whether the collection backend allows a user to rename child sources * * Since: 3.36 **/ gboolean e_source_collection_get_allow_sources_rename (ESourceCollection *extension) { g_return_val_if_fail (E_IS_SOURCE_COLLECTION (extension), FALSE); return extension->priv->allow_sources_rename; } /** * e_source_collection_set_allow_sources_rename: * @extension: an #ESourceCollection * @allow_sources_rename: whether mail sources should be enabled * * Sets whether the collection backend allows a user to rename child * sources. It is meant mainly for GUI. The default is %FALSE. * * Since: 3.36 **/ void e_source_collection_set_allow_sources_rename (ESourceCollection *extension, gboolean allow_sources_rename) { g_return_if_fail (E_IS_SOURCE_COLLECTION (extension)); if (extension->priv->allow_sources_rename == allow_sources_rename) return; extension->priv->allow_sources_rename = allow_sources_rename; g_object_notify (G_OBJECT (extension), "allow-sources-rename"); }