const gchar *extension_name;
this_extension = E_SOURCE_EXTENSION (object);
- source = e_source_extension_get_source (this_extension);
+ source = e_source_extension_ref_source (this_extension);
extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
other_extension = e_source_get_extension (source, extension_name);
source_ldap_transform_enum_nick_to_value,
source_ldap_transform_enum_value_to_nick,
NULL, (GDestroyNotify) NULL);
+
+ g_object_unref (source);
}
static void
G_OBJECT_CLASS (e_source_contacts_parent_class)->constructed (object);
extension = E_SOURCE_EXTENSION (object);
- source = e_source_extension_get_source (extension);
+ source = e_source_extension_ref_source (extension);
extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK;
backend_extension = e_source_get_extension (source, extension_name);
contacts_extension = E_SOURCE_CONTACTS (extension);
e_source_contacts_set_include_me (contacts_extension, include_me);
+
+ g_object_unref (source);
}
static void
<TITLE>ESourceExtension</TITLE>
ESourceExtension
E_SOURCE_PARAM_SETTING
+e_source_extension_ref_source
e_source_extension_get_source
<SUBSECTION Standard>
E_SOURCE_EXTENSION
class = E_SOURCE_CAMEL_GET_CLASS (object);
priv = E_SOURCE_CAMEL_GET_PRIVATE (object);
- source = e_source_extension_get_source (E_SOURCE_EXTENSION (object));
+ source = e_source_extension_ref_source (E_SOURCE_EXTENSION (object));
priv->settings = g_object_new (class->settings_type, NULL);
g_array_set_size (priv->value_array, array_index);
g_free (properties);
+
+ g_object_unref (source);
}
static void
((obj), E_TYPE_SOURCE_EXTENSION, ESourceExtensionPrivate))
struct _ESourceExtensionPrivate {
- gpointer source; /* weak pointer */
+ GWeakRef source;
};
enum {
ESource *source)
{
g_return_if_fail (E_IS_SOURCE (source));
- g_return_if_fail (extension->priv->source == NULL);
- extension->priv->source = source;
-
- g_object_add_weak_pointer (
- G_OBJECT (source), &extension->priv->source);
+ g_weak_ref_set (&extension->priv->source, source);
}
static void
{
switch (property_id) {
case PROP_SOURCE:
- g_value_set_object (
- value, e_source_extension_get_source (
+ g_value_take_object (
+ value, e_source_extension_ref_source (
E_SOURCE_EXTENSION (object)));
return;
}
priv = E_SOURCE_EXTENSION_GET_PRIVATE (object);
- if (priv->source != NULL) {
- g_object_remove_weak_pointer (
- G_OBJECT (priv->source), &priv->source);
- priv->source = NULL;
- }
+ g_weak_ref_set (&priv->source, NULL);
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (e_source_extension_parent_class)->dispose (object);
ESourceExtension *extension;
extension = E_SOURCE_EXTENSION (object);
- source = e_source_extension_get_source (extension);
+ source = e_source_extension_ref_source (extension);
g_return_if_fail (source != NULL);
if ((pspec->flags & E_SOURCE_PARAM_SETTING) != 0)
e_source_changed (source);
+
+ g_object_unref (source);
}
static void
}
/**
+ * e_source_extension_ref_source:
+ * @extension: an #ESourceExtension
+ *
+ * Returns the #ESource instance to which the @extension belongs.
+ *
+ * The returned #ESource is referenced for thread-safety. Unreference
+ * the #ESource with g_object_unref() when finished with it.
+ *
+ * Returns: the #ESource instance
+ *
+ * Since: 3.8
+ **/
+ESource *
+e_source_extension_ref_source (ESourceExtension *extension)
+{
+ g_return_val_if_fail (E_IS_SOURCE_EXTENSION (extension), NULL);
+
+ return g_weak_ref_get (&extension->priv->source);
+}
+
+/**
* e_source_extension_get_source:
* @extension: an #ESourceExtension
*
* Returns the #ESource instance to which @extension belongs.
*
+ * Note this function is not thread-safe. The returned #ESource could
+ * be finalized by another thread while the caller is still using it.
+ *
* Returns: (transfer none): the #ESource instance
*
* Since: 3.6
+ *
+ * Deprecated: 3.8: Use e_source_extension_ref_source() instead.
**/
ESource *
e_source_extension_get_source (ESourceExtension *extension)
{
+ ESource *source;
+
g_return_val_if_fail (E_IS_SOURCE_EXTENSION (extension), NULL);
- /* If the ESource was finalized and our weak pointer set this
- * to NULL, then the type cast macro will fail and we'll get a
- * runtime warning about it, which is what we want. */
- return E_SOURCE (extension->priv->source);
+ source = e_source_extension_ref_source (extension);
+
+ /* XXX Drop the ESource reference for backward-compatibility.
+ * This is risky. Without a reference, the ESource could
+ * be finalized while the caller is still using it. */
+ if (source != NULL)
+ g_object_unref (source);
+
+ return source;
}
};
GType e_source_extension_get_type (void) G_GNUC_CONST;
+ESource * e_source_extension_ref_source (ESourceExtension *extension);
+
+#ifndef EDS_DISABLE_DEPRECATED
ESource * e_source_extension_get_source (ESourceExtension *extension);
+#endif /* EDS_DISABLE_DEPRECATED */
G_END_DECLS
constructed (object);
extension = E_SOURCE_EXTENSION (object);
- source = e_source_extension_get_source (extension);
+ source = e_source_extension_ref_source (extension);
uid = e_source_get_uid (source);
config_dir = e_get_user_config_dir ();
g_mkdir_with_parents (base_dir, 0700);
g_free (base_dir);
g_free (path);
+
+ g_object_unref (source);
}
static void
ESource *source;
extension = E_SOURCE_EXTENSION (node->extension);
- source = e_source_extension_get_source (extension);
- g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
+ source = e_source_extension_ref_source (extension);
+ g_return_val_if_fail (source != NULL, FALSE);
/* We allow timeouts to be scheduled for disabled data sources
* but we don't invoke the callback. Keeps the logic simple. */
if (e_source_get_enabled (source))
node->callback (source, node->user_data);
+ g_object_unref (source);
+
return TRUE;
}
G_OBJECT_CLASS (e_source_refresh_parent_class)->constructed (object);
extension = E_SOURCE_EXTENSION (object);
- source = e_source_extension_get_source (extension);
+ source = e_source_extension_ref_source (extension);
/* There should be no lifecycle issues here
* since we get finalized with our ESource. */
source, "notify::enabled",
G_CALLBACK (source_refresh_notify_enabled_cb),
extension);
+
+ g_object_unref (source);
}
static void
g_mutex_unlock (webdav_extension->priv->property_lock);
extension = E_SOURCE_EXTENSION (webdav_extension);
- source = e_source_extension_get_source (extension);
+ source = e_source_extension_ref_source (extension);
g_object_set (
extension,
"secure", (soup_uri->scheme == SOUP_URI_SCHEME_HTTPS),
NULL);
+ g_object_unref (source);
+
soup_uri_free (soup_uri);
}
gboolean secure;
extension = E_SOURCE_EXTENSION (webdav_extension);
- source = e_source_extension_get_source (extension);
+ source = e_source_extension_ref_source (extension);
g_object_get (
extension,
"secure", &secure,
NULL);
+ g_object_unref (source);
+
g_mutex_lock (webdav_extension->priv->property_lock);
soup_uri = webdav_extension->priv->soup_uri;
* how it's supposed to work if everyone follows the rules. */
extension = E_SOURCE_EXTENSION (object);
- source = e_source_extension_get_source (extension);
+ source = e_source_extension_ref_source (extension);
g_signal_connect (
extension, "notify::resource-path",
g_signal_connect (
extension, "notify::secure",
G_CALLBACK (source_webdav_notify_cb), object);
+
+ g_object_unref (source);
}
static void