/*
* camel-network-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-network-settings.h"
#include
#include
#include
#define AUTH_MECHANISM_KEY "CamelNetworkSettings:auth-mechanism"
#define HOST_KEY "CamelNetworkSettings:host"
#define PORT_KEY "CamelNetworkSettings:port"
#define SECURITY_METHOD_KEY "CamelNetworkSettings:security-method"
#define USER_KEY "CamelNetworkSettings:user"
/* XXX Because interfaces have no initialization method, we can't
* allocate a per-instance mutex in a thread-safe manner. So
* we have to use a single static mutex for all instances. */
G_LOCK_DEFINE_STATIC (property_lock);
G_DEFINE_INTERFACE (
CamelNetworkSettings,
camel_network_settings,
CAMEL_TYPE_SETTINGS)
static void
camel_network_settings_default_init (CamelNetworkSettingsInterface *iface)
{
g_object_interface_install_property (
iface,
g_param_spec_string (
"auth-mechanism",
"Auth Mechanism",
"Authentication mechanism name",
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
g_object_interface_install_property (
iface,
g_param_spec_string (
"host",
"Host",
"Host name for the network service",
"",
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
g_object_interface_install_property (
iface,
g_param_spec_uint (
"port",
"Port",
"Port number for the network service",
0, G_MAXUINT16, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
g_object_interface_install_property (
iface,
g_param_spec_enum (
"security-method",
"Security Method",
"Method used to establish a network connection",
CAMEL_TYPE_NETWORK_SECURITY_METHOD,
CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
g_object_interface_install_property (
iface,
g_param_spec_string (
"user",
"User",
"User name for the network account",
g_get_user_name (),
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
}
/**
* camel_network_settings_get_auth_mechanism:
* @settings: a #CamelNetworkSettings
*
* Returns the mechanism name used to authenticate to a network service.
* Often this refers to a SASL mechanism such as "LOGIN" or "GSSAPI".
*
* Returns: the authentication mechanism name
*
* Since: 3.4
**/
const gchar *
camel_network_settings_get_auth_mechanism (CamelNetworkSettings *settings)
{
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
return g_object_get_data (G_OBJECT (settings), AUTH_MECHANISM_KEY);
}
/**
* camel_network_settings_dup_auth_mechanism:
* @settings: a #CamelNetworkSettings
*
* Thread-safe variation of camel_network_settings_get_auth_mechanism().
* 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 #CamelNetworkSettings:auth-mechanism
*
* Since: 3.4
**/
gchar *
camel_network_settings_dup_auth_mechanism (CamelNetworkSettings *settings)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
G_LOCK (property_lock);
protected = camel_network_settings_get_auth_mechanism (settings);
duplicate = g_strdup (protected);
G_UNLOCK (property_lock);
return duplicate;
}
/**
* camel_network_settings_set_auth_mechanism:
* @settings: a #CamelNetworkSettings
* @auth_mechanism: an authentication mechanism name, or %NULL
*
* Sets the mechanism name used to authenticate to a network service.
* Often this refers to a SASL mechanism such as "LOGIN" or "GSSAPI".
* The #CamelNetworkSettings:auth-mechanism property is automatically
* stripped of leading and trailing whitespace.
*
* Since: 3.4
**/
void
camel_network_settings_set_auth_mechanism (CamelNetworkSettings *settings,
const gchar *auth_mechanism)
{
gchar *stripped_auth_mechanism = NULL;
g_return_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings));
/* Strip leading and trailing whitespace. */
if (auth_mechanism != NULL)
stripped_auth_mechanism =
g_strstrip (g_strdup (auth_mechanism));
G_LOCK (property_lock);
g_object_set_data_full (
G_OBJECT (settings),
AUTH_MECHANISM_KEY,
stripped_auth_mechanism,
(GDestroyNotify) g_free);
G_UNLOCK (property_lock);
g_object_notify (G_OBJECT (settings), "auth-mechanism");
}
/**
* camel_network_settings_get_host:
* @settings: a #CamelNetworkSettings
*
* Returns the host name used to authenticate to a network service.
*
* Returns: the host name of a network service
*
* Since: 3.4
**/
const gchar *
camel_network_settings_get_host (CamelNetworkSettings *settings)
{
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
return g_object_get_data (G_OBJECT (settings), HOST_KEY);
}
/**
* camel_network_settings_dup_host:
* @settings: a #CamelNetworkSettings
*
* Thread-safe variation of camel_network_settings_get_host().
* 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 #CamelNetworkSettings:host
*
* Since: 3.4
**/
gchar *
camel_network_settings_dup_host (CamelNetworkSettings *settings)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
G_LOCK (property_lock);
protected = camel_network_settings_get_host (settings);
duplicate = g_strdup (protected);
G_UNLOCK (property_lock);
return duplicate;
}
/**
* camel_network_settings_dup_host_ensure_ascii:
* @settings: a #CamelNetworkSettings
*
* Just like camel_network_settings_dup_host(), only makes sure that
* the returned host name will be converted into its ASCII form in case
* of IDNA value.
*
* Returns: a newly-allocated copy of #CamelNetworkSettings:host with
* only ASCII letters.
*
* Since: 3.16
**/
gchar *
camel_network_settings_dup_host_ensure_ascii (CamelNetworkSettings *settings)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
G_LOCK (property_lock);
protected = camel_network_settings_get_host (settings);
if (protected && *protected)
duplicate = camel_host_idna_to_ascii (protected);
else
duplicate = g_strdup (protected);
G_UNLOCK (property_lock);
return duplicate;
}
/**
* camel_network_settings_set_host:
* @settings: a #CamelNetworkSettings
* @host: a host name, or %NULL
*
* Sets the host name used to authenticate to a network service. The
* #CamelNetworkSettings:host property is automatically stripped of
* leading and trailing whitespace.
*
* Since: 3.4
**/
void
camel_network_settings_set_host (CamelNetworkSettings *settings,
const gchar *host)
{
gchar *stripped_host = NULL;
g_return_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings));
/* Make sure this property is never NULL. */
if (host == NULL)
host = "";
/* Strip leading and trailing whitespace. */
stripped_host = g_strstrip (g_strdup (host));
G_LOCK (property_lock);
g_object_set_data_full (
G_OBJECT (settings),
HOST_KEY, stripped_host,
(GDestroyNotify) g_free);
G_UNLOCK (property_lock);
g_object_notify (G_OBJECT (settings), "host");
}
/**
* camel_network_settings_get_port:
* @settings: a #CamelNetworkSettings
*
* Returns the port number used to authenticate to a network service.
*
* Returns: the port number of a network service
*
* Since: 3.4
**/
guint16
camel_network_settings_get_port (CamelNetworkSettings *settings)
{
gpointer data;
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), 0);
data = g_object_get_data (G_OBJECT (settings), PORT_KEY);
return (guint16) GPOINTER_TO_UINT (data);
}
/**
* camel_network_settings_set_port:
* @settings: a #CamelNetworkSettings
* @port: a port number
*
* Sets the port number used to authenticate to a network service.
*
* Since: 3.4
**/
void
camel_network_settings_set_port (CamelNetworkSettings *settings,
guint16 port)
{
g_return_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings));
g_object_set_data (
G_OBJECT (settings), PORT_KEY,
GUINT_TO_POINTER ((guint) port));
g_object_notify (G_OBJECT (settings), "port");
}
/**
* camel_network_settings_get_security_method:
* @settings: a #CamelNetworkSettings
*
* Returns the method used to establish a secure (or unsecure) network
* connection.
*
* Returns: the security method
*
* Since: 3.2
**/
CamelNetworkSecurityMethod
camel_network_settings_get_security_method (CamelNetworkSettings *settings)
{
gpointer data;
g_return_val_if_fail (
CAMEL_IS_NETWORK_SETTINGS (settings),
CAMEL_NETWORK_SECURITY_METHOD_NONE);
data = g_object_get_data (G_OBJECT (settings), SECURITY_METHOD_KEY);
return (CamelNetworkSecurityMethod) GPOINTER_TO_INT (data);
}
/**
* camel_network_settings_set_security_method:
* @settings: a #CamelNetworkSettings
* @method: the security method
*
* Sets the method used to establish a secure (or unsecure) network
* connection. Note that changing this setting has no effect on an
* already-established network connection.
*
* Since: 3.2
**/
void
camel_network_settings_set_security_method (CamelNetworkSettings *settings,
CamelNetworkSecurityMethod method)
{
g_return_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings));
g_object_set_data (
G_OBJECT (settings),
SECURITY_METHOD_KEY,
GINT_TO_POINTER (method));
g_object_notify (G_OBJECT (settings), "security-method");
}
/**
* camel_network_settings_get_user:
* @settings: a #CamelNetworkSettings
*
* Returns the user name used to authenticate to a network service.
*
* Returns: the user name of a network service
*
* Since: 3.4
**/
const gchar *
camel_network_settings_get_user (CamelNetworkSettings *settings)
{
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
return g_object_get_data (G_OBJECT (settings), USER_KEY);
}
/**
* camel_network_settings_dup_user:
* @settings: a #CamelNetworkSettings
*
* Thread-safe variation of camel_network_settings_get_user().
* 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 #CamelNetworkSettings:user
*
* Since: 3.4
**/
gchar *
camel_network_settings_dup_user (CamelNetworkSettings *settings)
{
const gchar *protected;
gchar *duplicate;
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
G_LOCK (property_lock);
protected = camel_network_settings_get_user (settings);
duplicate = g_strdup (protected);
G_UNLOCK (property_lock);
return duplicate;
}
/**
* camel_network_settings_set_user:
* @settings: a #CamelNetworkSettings
* @user: a user name, or %NULL
*
* Sets the user name used to authenticate to a network service. The
* #CamelNetworkSettings:user property is automatically stripped of
* leading and trailing whitespace.
*
* Since: 3.4
**/
void
camel_network_settings_set_user (CamelNetworkSettings *settings,
const gchar *user)
{
gchar *stripped_user = NULL;
g_return_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings));
/* Make sure this property is never NULL. */
if (user == NULL)
user = "";
/* Strip leading and trailing whitespace. */
stripped_user = g_strstrip (g_strdup (user));
G_LOCK (property_lock);
g_object_set_data_full (
G_OBJECT (settings),
USER_KEY, stripped_user,
(GDestroyNotify) g_free);
G_UNLOCK (property_lock);
g_object_notify (G_OBJECT (settings), "user");
}