/*
* camel-local-settings.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 "camel-local-settings.h"
#include
#define CAMEL_LOCAL_SETTINGS_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
((obj), CAMEL_TYPE_LOCAL_SETTINGS, CamelLocalSettingsPrivate))
struct _CamelLocalSettingsPrivate {
GMutex property_lock;
gchar *path;
};
enum {
PROP_0,
PROP_PATH
};
G_DEFINE_TYPE (
CamelLocalSettings,
camel_local_settings,
CAMEL_TYPE_STORE_SETTINGS)
static void
local_settings_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_PATH:
camel_local_settings_set_path (
CAMEL_LOCAL_SETTINGS (object),
g_value_get_string (value));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
local_settings_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
switch (property_id) {
case PROP_PATH:
g_value_take_string (
value,
camel_local_settings_dup_path (
CAMEL_LOCAL_SETTINGS (object)));
return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
local_settings_finalize (GObject *object)
{
CamelLocalSettingsPrivate *priv;
priv = CAMEL_LOCAL_SETTINGS_GET_PRIVATE (object);
g_mutex_clear (&priv->property_lock);
g_free (priv->path);
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (camel_local_settings_parent_class)->finalize (object);
}
static void
camel_local_settings_class_init (CamelLocalSettingsClass *class)
{
GObjectClass *object_class;
g_type_class_add_private (class, sizeof (CamelLocalSettingsPrivate));
object_class = G_OBJECT_CLASS (class);
object_class->set_property = local_settings_set_property;
object_class->get_property = local_settings_get_property;
object_class->finalize = local_settings_finalize;
g_object_class_install_property (
object_class,
PROP_PATH,
g_param_spec_string (
"path",
"Path",
"File path to the local store",
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
}
static void
camel_local_settings_init (CamelLocalSettings *settings)
{
settings->priv = CAMEL_LOCAL_SETTINGS_GET_PRIVATE (settings);
g_mutex_init (&settings->priv->property_lock);
}
/**
* camel_local_settings_get_path:
* @settings: a #CamelLocalSettings
*
* Returns the file path to the root of the local mail store.
*
* Returns: the file path to the local store
*
* Since: 3.4
**/
const gchar *
camel_local_settings_get_path (CamelLocalSettings *settings)
{
g_return_val_if_fail (CAMEL_IS_LOCAL_SETTINGS (settings), NULL);
return settings->priv->path;
}
/**
* camel_local_settings_dup_path:
* @settings: a #CamelLocalSettings
*
* Thread-safe variation of camel_local_settings_get_path().
* Use this function when accessing @settings from multiple threads.
*
* The returned string should be freed with g_free() when no longer needed.
*
* Returns: a newly-allocated copy of #CamelLocalSettings:path
*
* Since: 3.4
**/
gchar *
camel_local_settings_dup_path (CamelLocalSettings *settings)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (CAMEL_IS_LOCAL_SETTINGS (settings), NULL);
g_mutex_lock (&settings->priv->property_lock);
protected = camel_local_settings_get_path (settings);
duplicate = g_strdup (protected);
g_mutex_unlock (&settings->priv->property_lock);
return duplicate;
}
/**
* camel_local_settings_set_path:
* @settings: a #CamelLocalSettings
* @path: the file path to the local store
*
* Sets the file path to the root of the local mail store. Any
* trailing directory separator characters will be stripped off
* of the #CamelLocalSettings:path property.
*
* Since: 3.4
**/
void
camel_local_settings_set_path (CamelLocalSettings *settings,
const gchar *path)
{
gsize length = 0;
gchar *new_path;
g_return_if_fail (CAMEL_IS_LOCAL_SETTINGS (settings));
/* Exclude trailing directory separators. */
if (path != NULL) {
length = strlen (path);
while (length > 0) {
if (G_IS_DIR_SEPARATOR (path[length - 1]))
length--;
else
break;
}
}
g_mutex_lock (&settings->priv->property_lock);
new_path = g_strndup (path, length);
if (g_strcmp0 (settings->priv->path, new_path) == 0) {
g_mutex_unlock (&settings->priv->property_lock);
g_free (new_path);
return;
}
g_free (settings->priv->path);
settings->priv->path = new_path;
g_mutex_unlock (&settings->priv->property_lock);
g_object_notify (G_OBJECT (settings), "path");
}