|
Packit |
79f644 |
/*
|
|
Packit |
79f644 |
* Copyright (C) 2007-2008 Guillaume Desmottes
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
79f644 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
79f644 |
* License as published by the Free Software Foundation; either
|
|
Packit |
79f644 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
79f644 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
79f644 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
79f644 |
* Lesser General Public License for more details.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
79f644 |
* License along with this library; if not, write to the Free Software
|
|
Packit |
79f644 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Authors: Guillaume Desmottes <gdesmott@gnome.org>
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#include "config.h"
|
|
Packit |
79f644 |
#include "tpaw-irc-network-manager.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#include <sys/stat.h>
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#include "tpaw-utils.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#define DEBUG_FLAG TPAW_DEBUG_IRC
|
|
Packit |
79f644 |
#include "tpaw-debug.h"
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
#define IRC_NETWORKS_DTD_RESOURCENAME "/org/gnome/AccountWidgets/tpaw-irc-networks.dtd"
|
|
Packit |
79f644 |
#define IRC_NETWORKS_FILENAME "irc-networks.xml"
|
|
Packit |
79f644 |
#define SAVE_TIMER 4
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
struct _TpawIrcNetworkManagerPriv {
|
|
Packit |
79f644 |
GHashTable *networks;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
gchar *global_file;
|
|
Packit |
79f644 |
gchar *user_file;
|
|
Packit |
79f644 |
guint last_id;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Do we have to save modifications to the user file ? */
|
|
Packit |
79f644 |
gboolean have_to_save;
|
|
Packit |
79f644 |
/* Are we loading networks from XML files ? */
|
|
Packit |
79f644 |
gboolean loading;
|
|
Packit |
79f644 |
/* source id of the autosave timer */
|
|
Packit |
79f644 |
gint save_timer_id;
|
|
Packit |
79f644 |
};
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* properties */
|
|
Packit |
79f644 |
enum
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
PROP_GLOBAL_FILE = 1,
|
|
Packit |
79f644 |
PROP_USER_FILE,
|
|
Packit |
79f644 |
LAST_PROPERTY
|
|
Packit |
79f644 |
};
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
G_DEFINE_TYPE (TpawIrcNetworkManager, tpaw_irc_network_manager,
|
|
Packit |
79f644 |
G_TYPE_OBJECT);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void irc_network_manager_load_servers (
|
|
Packit |
79f644 |
TpawIrcNetworkManager *manager);
|
|
Packit |
79f644 |
static gboolean irc_network_manager_file_parse (
|
|
Packit |
79f644 |
TpawIrcNetworkManager *manager, const gchar *filename,
|
|
Packit |
79f644 |
gboolean user_defined);
|
|
Packit |
79f644 |
static gboolean irc_network_manager_file_save (
|
|
Packit |
79f644 |
TpawIrcNetworkManager *manager);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_irc_network_manager_get_property (GObject *object,
|
|
Packit |
79f644 |
guint property_id,
|
|
Packit |
79f644 |
GValue *value,
|
|
Packit |
79f644 |
GParamSpec *pspec)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcNetworkManager *self = TPAW_IRC_NETWORK_MANAGER (object);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
switch (property_id)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
case PROP_GLOBAL_FILE:
|
|
Packit |
79f644 |
g_value_set_string (value, self->priv->global_file);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
case PROP_USER_FILE:
|
|
Packit |
79f644 |
g_value_set_string (value, self->priv->user_file);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
default:
|
|
Packit |
79f644 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_irc_network_manager_set_property (GObject *object,
|
|
Packit |
79f644 |
guint property_id,
|
|
Packit |
79f644 |
const GValue *value,
|
|
Packit |
79f644 |
GParamSpec *pspec)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcNetworkManager *self = TPAW_IRC_NETWORK_MANAGER (object);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
switch (property_id)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
case PROP_GLOBAL_FILE:
|
|
Packit |
79f644 |
g_free (self->priv->global_file);
|
|
Packit |
79f644 |
self->priv->global_file = g_value_dup_string (value);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
case PROP_USER_FILE:
|
|
Packit |
79f644 |
g_free (self->priv->user_file);
|
|
Packit |
79f644 |
self->priv->user_file = g_value_dup_string (value);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
default:
|
|
Packit |
79f644 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
79f644 |
break;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static GObject *
|
|
Packit |
79f644 |
tpaw_irc_network_manager_constructor (GType type,
|
|
Packit |
79f644 |
guint n_props,
|
|
Packit |
79f644 |
GObjectConstructParam *props)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GObject *obj;
|
|
Packit |
79f644 |
TpawIrcNetworkManager *self;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Parent constructor chain */
|
|
Packit |
79f644 |
obj = G_OBJECT_CLASS (tpaw_irc_network_manager_parent_class)->
|
|
Packit |
79f644 |
constructor (type, n_props, props);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self = TPAW_IRC_NETWORK_MANAGER (obj);
|
|
Packit |
79f644 |
irc_network_manager_load_servers (self);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return obj;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_irc_network_manager_finalize (GObject *object)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcNetworkManager *self = TPAW_IRC_NETWORK_MANAGER (object);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (self->priv->save_timer_id > 0)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_source_remove (self->priv->save_timer_id);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (self->priv->have_to_save)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
irc_network_manager_file_save (self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_free (self->priv->global_file);
|
|
Packit |
79f644 |
g_free (self->priv->user_file);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_hash_table_unref (self->priv->networks);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
G_OBJECT_CLASS (tpaw_irc_network_manager_parent_class)->finalize (object);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_irc_network_manager_init (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
|
Packit |
79f644 |
TPAW_TYPE_IRC_NETWORK_MANAGER, TpawIrcNetworkManagerPriv);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->networks = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
Packit |
79f644 |
(GDestroyNotify) g_free, (GDestroyNotify) g_object_unref);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->last_id = 0;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->have_to_save = FALSE;
|
|
Packit |
79f644 |
self->priv->loading = FALSE;
|
|
Packit |
79f644 |
self->priv->save_timer_id = 0;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
tpaw_irc_network_manager_class_init (TpawIrcNetworkManagerClass *klass)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
79f644 |
GParamSpec *param_spec;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
object_class->constructor = tpaw_irc_network_manager_constructor;
|
|
Packit |
79f644 |
object_class->get_property = tpaw_irc_network_manager_get_property;
|
|
Packit |
79f644 |
object_class->set_property = tpaw_irc_network_manager_set_property;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_type_class_add_private (object_class, sizeof (TpawIrcNetworkManagerPriv));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
object_class->finalize = tpaw_irc_network_manager_finalize;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
param_spec = g_param_spec_string (
|
|
Packit |
79f644 |
"global-file",
|
|
Packit |
79f644 |
"path of the global networks file",
|
|
Packit |
79f644 |
"The path of the system-wide filename from which we have to load"
|
|
Packit |
79f644 |
" the networks list",
|
|
Packit |
79f644 |
NULL,
|
|
Packit |
79f644 |
G_PARAM_CONSTRUCT_ONLY |
|
|
Packit |
79f644 |
G_PARAM_READWRITE |
|
|
Packit |
79f644 |
G_PARAM_STATIC_NAME |
|
|
Packit |
79f644 |
G_PARAM_STATIC_NICK |
|
|
Packit |
79f644 |
G_PARAM_STATIC_BLURB);
|
|
Packit |
79f644 |
g_object_class_install_property (object_class, PROP_GLOBAL_FILE, param_spec);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
param_spec = g_param_spec_string (
|
|
Packit |
79f644 |
"user-file",
|
|
Packit |
79f644 |
"path of the user networks file",
|
|
Packit |
79f644 |
"The path of user's filename from which we have to load"
|
|
Packit |
79f644 |
" the networks list and to which we'll save his modifications",
|
|
Packit |
79f644 |
NULL,
|
|
Packit |
79f644 |
G_PARAM_CONSTRUCT_ONLY |
|
|
Packit |
79f644 |
G_PARAM_READWRITE |
|
|
Packit |
79f644 |
G_PARAM_STATIC_NAME |
|
|
Packit |
79f644 |
G_PARAM_STATIC_NICK |
|
|
Packit |
79f644 |
G_PARAM_STATIC_BLURB);
|
|
Packit |
79f644 |
g_object_class_install_property (object_class, PROP_USER_FILE, param_spec);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/**
|
|
Packit |
79f644 |
* tpaw_irc_network_manager_new:
|
|
Packit |
79f644 |
* @global_file: the path of the global networks file, or %NULL
|
|
Packit |
79f644 |
* @user_file: the path of the user networks file, or %NULL
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Creates a new #TpawIrcNetworkManager
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Returns: a new #TpawIrcNetworkManager
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
TpawIrcNetworkManager *
|
|
Packit |
79f644 |
tpaw_irc_network_manager_new (const gchar *global_file,
|
|
Packit |
79f644 |
const gchar *user_file)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcNetworkManager *manager;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
manager = g_object_new (TPAW_TYPE_IRC_NETWORK_MANAGER,
|
|
Packit |
79f644 |
"global-file", global_file,
|
|
Packit |
79f644 |
"user-file", user_file,
|
|
Packit |
79f644 |
NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return manager;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static gboolean
|
|
Packit |
79f644 |
save_timeout (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
self->priv->save_timer_id = 0;
|
|
Packit |
79f644 |
irc_network_manager_file_save (self);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return FALSE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
reset_save_timeout (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (self->priv->save_timer_id > 0)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_source_remove (self->priv->save_timer_id);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->save_timer_id = g_timeout_add_seconds (SAVE_TIMER,
|
|
Packit |
79f644 |
(GSourceFunc) save_timeout, self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
network_modified (TpawIrcNetwork *network,
|
|
Packit |
79f644 |
TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
network->user_defined = TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!self->priv->loading)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
self->priv->have_to_save = TRUE;
|
|
Packit |
79f644 |
reset_save_timeout (self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
add_network (TpawIrcNetworkManager *self,
|
|
Packit |
79f644 |
TpawIrcNetwork *network,
|
|
Packit |
79f644 |
const gchar *id)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_hash_table_insert (self->priv->networks, g_strdup (id),
|
|
Packit |
79f644 |
g_object_ref (network));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_signal_connect (network, "modified", G_CALLBACK (network_modified), self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/**
|
|
Packit |
79f644 |
* tpaw_irc_network_manager_add:
|
|
Packit |
79f644 |
* @manager: an #TpawIrcNetworkManager
|
|
Packit |
79f644 |
* @network: the #TpawIrcNetwork to add
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Add an #TpawIrcNetwork to the given #TpawIrcNetworkManager.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
void
|
|
Packit |
79f644 |
tpaw_irc_network_manager_add (TpawIrcNetworkManager *self,
|
|
Packit |
79f644 |
TpawIrcNetwork *network)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gchar *id = NULL;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_return_if_fail (TPAW_IS_IRC_NETWORK_MANAGER (self));
|
|
Packit |
79f644 |
g_return_if_fail (TPAW_IS_IRC_NETWORK (network));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* generate an id for this network */
|
|
Packit |
79f644 |
do
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_free (id);
|
|
Packit |
79f644 |
id = g_strdup_printf ("id%u", ++self->priv->last_id);
|
|
Packit |
79f644 |
} while (g_hash_table_lookup (self->priv->networks, id) != NULL &&
|
|
Packit |
79f644 |
self->priv->last_id < G_MAXUINT);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (self->priv->last_id == G_MAXUINT)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("Can't add network: too many networks using a similar ID");
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
DEBUG ("add server with \"%s\" as ID", id);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
network->user_defined = TRUE;
|
|
Packit |
79f644 |
add_network (self, network, id);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->have_to_save = TRUE;
|
|
Packit |
79f644 |
reset_save_timeout (self);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_free (id);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/**
|
|
Packit |
79f644 |
* tpaw_irc_network_manager_remove:
|
|
Packit |
79f644 |
* @manager: an #TpawIrcNetworkManager
|
|
Packit |
79f644 |
* @network: the #TpawIrcNetwork to remove
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Remove an #TpawIrcNetwork from the given #TpawIrcNetworkManager.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
void
|
|
Packit |
79f644 |
tpaw_irc_network_manager_remove (TpawIrcNetworkManager *self,
|
|
Packit |
79f644 |
TpawIrcNetwork *network)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_return_if_fail (TPAW_IS_IRC_NETWORK_MANAGER (self));
|
|
Packit |
79f644 |
g_return_if_fail (TPAW_IS_IRC_NETWORK (network));
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
network->user_defined = TRUE;
|
|
Packit |
79f644 |
network->dropped = TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->have_to_save = TRUE;
|
|
Packit |
79f644 |
reset_save_timeout (self);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
append_active_networks_to_list (const gchar *id,
|
|
Packit |
79f644 |
TpawIrcNetwork *network,
|
|
Packit |
79f644 |
GSList **list)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (network->dropped)
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
*list = g_slist_prepend (*list, g_object_ref (network));
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
append_dropped_networks_to_list (const gchar *id,
|
|
Packit |
79f644 |
TpawIrcNetwork *network,
|
|
Packit |
79f644 |
GSList **list)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (!network->dropped)
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
*list = g_slist_prepend (*list, g_object_ref (network));
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static GSList *
|
|
Packit |
79f644 |
get_network_list (TpawIrcNetworkManager *self,
|
|
Packit |
79f644 |
gboolean get_active)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GSList *irc_networks = NULL;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_return_val_if_fail (TPAW_IS_IRC_NETWORK_MANAGER (self), NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (get_active)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_hash_table_foreach (self->priv->networks,
|
|
Packit |
79f644 |
(GHFunc) append_active_networks_to_list, &irc_networks);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
else
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_hash_table_foreach (self->priv->networks,
|
|
Packit |
79f644 |
(GHFunc) append_dropped_networks_to_list, &irc_networks);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return irc_networks;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/**
|
|
Packit |
79f644 |
* tpaw_irc_network_manager_get_networks:
|
|
Packit |
79f644 |
* @manager: an #TpawIrcNetworkManager
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Get the list of #TpawIrcNetwork associated with the given
|
|
Packit |
79f644 |
* manager.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Returns: a new #GSList of refed #TpawIrcNetwork
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
GSList *
|
|
Packit |
79f644 |
tpaw_irc_network_manager_get_networks (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
return get_network_list (self, TRUE);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/**
|
|
Packit |
79f644 |
* tpaw_irc_network_manager_get_dropped_networks:
|
|
Packit |
79f644 |
* @manager: an #TpawIrcNetworkManager
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Get the list of dropped #TpawIrcNetworks associated with the given
|
|
Packit |
79f644 |
* manager.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Returns: a new #GSList of refed dropped #TpawIrcNetworks
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
GSList *
|
|
Packit |
79f644 |
tpaw_irc_network_manager_get_dropped_networks (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
return get_network_list (self, FALSE);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/*
|
|
Packit |
79f644 |
* API to save/load and parse the irc_networks file.
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
load_global_file (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (self->priv->global_file == NULL)
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!g_file_test (self->priv->global_file, G_FILE_TEST_EXISTS))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("Global networks file %s doesn't exist",
|
|
Packit |
79f644 |
self->priv->global_file);
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
irc_network_manager_file_parse (self, self->priv->global_file, FALSE);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
load_user_file (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (self->priv->user_file == NULL)
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!g_file_test (self->priv->user_file, G_FILE_TEST_EXISTS))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("User networks file %s doesn't exist", self->priv->global_file);
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
irc_network_manager_file_parse (self, self->priv->user_file, TRUE);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
irc_network_manager_load_servers (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
self->priv->loading = TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
load_global_file (self);
|
|
Packit |
79f644 |
load_user_file (self);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->loading = FALSE;
|
|
Packit |
79f644 |
self->priv->have_to_save = FALSE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
irc_network_manager_parse_irc_server (TpawIrcNetwork *network,
|
|
Packit |
79f644 |
xmlNodePtr node)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
xmlNodePtr server_node;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (server_node = node->children; server_node;
|
|
Packit |
79f644 |
server_node = server_node->next)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gchar *address = NULL, *port = NULL, *ssl = NULL;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (g_strcmp0 ((const gchar *) server_node->name, "server") != 0)
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
address = (gchar *) xmlGetProp (server_node, (const xmlChar *) "address");
|
|
Packit |
79f644 |
port = (gchar *) xmlGetProp (server_node, (const xmlChar *) "port");
|
|
Packit |
79f644 |
ssl = (gchar *) xmlGetProp (server_node, (const xmlChar *) "ssl");
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (address != NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gint port_nb = 0;
|
|
Packit |
79f644 |
gboolean have_ssl = FALSE;
|
|
Packit |
79f644 |
TpawIrcServer *server;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (port != NULL)
|
|
Packit |
79f644 |
port_nb = strtol (port, NULL, 10);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (port_nb <= 0 || port_nb > G_MAXUINT16)
|
|
Packit |
79f644 |
port_nb = 6667;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (ssl == NULL || g_strcmp0 (ssl, "TRUE") == 0)
|
|
Packit |
79f644 |
have_ssl = TRUE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
DEBUG ("parsed server %s port %d ssl %d", address, port_nb, have_ssl);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
server = tpaw_irc_server_new (address, port_nb, have_ssl);
|
|
Packit |
79f644 |
tpaw_irc_network_append_server (network, server);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (address)
|
|
Packit |
79f644 |
xmlFree (address);
|
|
Packit |
79f644 |
if (port)
|
|
Packit |
79f644 |
xmlFree (port);
|
|
Packit |
79f644 |
if (ssl)
|
|
Packit |
79f644 |
xmlFree (ssl);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
irc_network_manager_parse_irc_network (TpawIrcNetworkManager *self,
|
|
Packit |
79f644 |
xmlNodePtr node,
|
|
Packit |
79f644 |
gboolean user_defined)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcNetwork *network;
|
|
Packit |
79f644 |
xmlNodePtr child;
|
|
Packit |
79f644 |
gchar *str;
|
|
Packit |
79f644 |
gchar *id, *name;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
id = (gchar *) xmlGetProp (node, (const xmlChar *) "id");
|
|
Packit |
79f644 |
if (xmlHasProp (node, (const xmlChar *) "dropped"))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
if (!user_defined)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("the 'dropped' attribute shouldn't be used in the global file");
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
network = g_hash_table_lookup (self->priv->networks, id);
|
|
Packit |
79f644 |
if (network != NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
network->dropped = TRUE;
|
|
Packit |
79f644 |
network->user_defined = TRUE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
xmlFree (id);
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!xmlHasProp (node, (const xmlChar *) "name"))
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
name = (gchar *) xmlGetProp (node, (const xmlChar *) "name");
|
|
Packit |
79f644 |
network = tpaw_irc_network_new (name);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (xmlHasProp (node, (const xmlChar *) "network_charset"))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gchar *charset;
|
|
Packit |
79f644 |
charset = (gchar *) xmlGetProp (node, (const xmlChar *) "network_charset");
|
|
Packit |
79f644 |
g_object_set (network, "charset", charset, NULL);
|
|
Packit |
79f644 |
xmlFree (charset);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
add_network (self, network, id);
|
|
Packit |
79f644 |
DEBUG ("add network %s (id %s)", name, id);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (child = node->children; child; child = child->next)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
gchar *tag;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
tag = (gchar *) child->name;
|
|
Packit |
79f644 |
str = (gchar *) xmlNodeGetContent (child);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!str)
|
|
Packit |
79f644 |
continue;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (g_strcmp0 (tag, "servers") == 0)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
irc_network_manager_parse_irc_server (network, child);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
xmlFree (str);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
network->user_defined = user_defined;
|
|
Packit |
79f644 |
g_object_unref (network);
|
|
Packit |
79f644 |
xmlFree (name);
|
|
Packit |
79f644 |
xmlFree (id);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static gboolean
|
|
Packit |
79f644 |
irc_network_manager_file_parse (TpawIrcNetworkManager *self,
|
|
Packit |
79f644 |
const gchar *filename,
|
|
Packit |
79f644 |
gboolean user_defined)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
xmlParserCtxtPtr ctxt;
|
|
Packit |
79f644 |
xmlDocPtr doc;
|
|
Packit |
79f644 |
xmlNodePtr networks;
|
|
Packit |
79f644 |
xmlNodePtr node;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
DEBUG ("Attempting to parse file:'%s'...", filename);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
ctxt = xmlNewParserCtxt ();
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Parse and validate the file. */
|
|
Packit |
79f644 |
doc = xmlCtxtReadFile (ctxt, filename, NULL, 0);
|
|
Packit |
79f644 |
if (!doc)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_warning ("Failed to parse file:'%s'", filename);
|
|
Packit |
79f644 |
xmlFreeParserCtxt (ctxt);
|
|
Packit |
79f644 |
return FALSE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!tpaw_xml_validate_from_resource (doc, IRC_NETWORKS_DTD_RESOURCENAME)) {
|
|
Packit |
79f644 |
g_warning ("Failed to validate file:'%s'", filename);
|
|
Packit |
79f644 |
xmlFreeDoc (doc);
|
|
Packit |
79f644 |
xmlFreeParserCtxt (ctxt);
|
|
Packit |
79f644 |
return FALSE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* The root node, networks. */
|
|
Packit |
79f644 |
networks = xmlDocGetRootElement (doc);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (node = networks->children; node; node = node->next)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
irc_network_manager_parse_irc_network (self, node, user_defined);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
xmlFreeDoc (doc);
|
|
Packit |
79f644 |
xmlFreeParserCtxt (ctxt);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return TRUE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static void
|
|
Packit |
79f644 |
write_network_to_xml (const gchar *id,
|
|
Packit |
79f644 |
TpawIrcNetwork *network,
|
|
Packit |
79f644 |
xmlNodePtr root)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
xmlNodePtr network_node, servers_node;
|
|
Packit |
79f644 |
GSList *servers, *l;
|
|
Packit |
79f644 |
gchar *name, *charset;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (!network->user_defined)
|
|
Packit |
79f644 |
/* no need to write this network to the XML */
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
network_node = xmlNewChild (root, NULL, (const xmlChar *) "network", NULL);
|
|
Packit |
79f644 |
xmlNewProp (network_node, (const xmlChar *) "id", (const xmlChar *) id);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (network->dropped)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
xmlNewProp (network_node, (const xmlChar *) "dropped",
|
|
Packit |
79f644 |
(const xmlChar *) "1");
|
|
Packit |
79f644 |
return;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_get (network,
|
|
Packit |
79f644 |
"name", &name,
|
|
Packit |
79f644 |
"charset", &charset,
|
|
Packit |
79f644 |
NULL);
|
|
Packit |
79f644 |
xmlNewProp (network_node, (const xmlChar *) "name", (const xmlChar *) name);
|
|
Packit |
79f644 |
xmlNewProp (network_node, (const xmlChar *) "network_charset",
|
|
Packit |
79f644 |
(const xmlChar *) charset);
|
|
Packit |
79f644 |
g_free (name);
|
|
Packit |
79f644 |
g_free (charset);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
servers = tpaw_irc_network_get_servers (network);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
servers_node = xmlNewChild (network_node, NULL, (const xmlChar *) "servers",
|
|
Packit |
79f644 |
NULL);
|
|
Packit |
79f644 |
for (l = servers; l != NULL; l = g_slist_next (l))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcServer *server;
|
|
Packit |
79f644 |
xmlNodePtr server_node;
|
|
Packit |
79f644 |
gchar *address, *tmp;
|
|
Packit |
79f644 |
guint port;
|
|
Packit |
79f644 |
gboolean ssl;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
server = l->data;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
server_node = xmlNewChild (servers_node, NULL, (const xmlChar *) "server",
|
|
Packit |
79f644 |
NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_get (server,
|
|
Packit |
79f644 |
"address", &address,
|
|
Packit |
79f644 |
"port", &port,
|
|
Packit |
79f644 |
"ssl", &ssl,
|
|
Packit |
79f644 |
NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
xmlNewProp (server_node, (const xmlChar *) "address",
|
|
Packit |
79f644 |
(const xmlChar *) address);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
tmp = g_strdup_printf ("%u", port);
|
|
Packit |
79f644 |
xmlNewProp (server_node, (const xmlChar *) "port",
|
|
Packit |
79f644 |
(const xmlChar *) tmp);
|
|
Packit |
79f644 |
g_free (tmp);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
xmlNewProp (server_node, (const xmlChar *) "ssl",
|
|
Packit |
79f644 |
ssl ? (const xmlChar *) "TRUE": (const xmlChar *) "FALSE");
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_free (address);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* free the list */
|
|
Packit |
79f644 |
g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
|
|
Packit |
79f644 |
g_slist_free (servers);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static gboolean
|
|
Packit |
79f644 |
irc_network_manager_file_save (TpawIrcNetworkManager *self)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
xmlDocPtr doc;
|
|
Packit |
79f644 |
xmlNodePtr root;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (self->priv->user_file == NULL)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
DEBUG ("can't save: no user file defined");
|
|
Packit |
79f644 |
return FALSE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
DEBUG ("Saving IRC networks");
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
doc = xmlNewDoc ((const xmlChar *) "1.0");
|
|
Packit |
79f644 |
root = xmlNewNode (NULL, (const xmlChar *) "networks");
|
|
Packit |
79f644 |
xmlDocSetRootElement (doc, root);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_hash_table_foreach (self->priv->networks,
|
|
Packit |
79f644 |
(GHFunc) write_network_to_xml, root);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/* Make sure the XML is indented properly */
|
|
Packit |
79f644 |
xmlIndentTreeOutput = 1;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
xmlSaveFormatFileEnc (self->priv->user_file, doc, "utf-8", 1);
|
|
Packit |
79f644 |
xmlFreeDoc (doc);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
xmlMemoryDump ();
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
self->priv->have_to_save = FALSE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return TRUE;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
static gboolean
|
|
Packit |
79f644 |
find_network_by_address (const gchar *id,
|
|
Packit |
79f644 |
TpawIrcNetwork *network,
|
|
Packit |
79f644 |
const gchar *address)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
GSList *servers, *l;
|
|
Packit |
79f644 |
gboolean found = FALSE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (network->dropped)
|
|
Packit |
79f644 |
return FALSE;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
servers = tpaw_irc_network_get_servers (network);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
for (l = servers; l != NULL && !found; l = g_slist_next (l))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcServer *server = l->data;
|
|
Packit |
79f644 |
gchar *_address;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_get (server, "address", &_address, NULL);
|
|
Packit |
79f644 |
found = (_address != NULL && g_strcmp0 (address, _address) == 0);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_free (_address);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
|
|
Packit |
79f644 |
g_slist_free (servers);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return found;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
/**
|
|
Packit |
79f644 |
* tpaw_irc_network_manager_find_network_by_address:
|
|
Packit |
79f644 |
* @manager: an #TpawIrcNetworkManager
|
|
Packit |
79f644 |
* @address: the server address to look for
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Find the #TpawIrcNetwork which owns an #TpawIrcServer
|
|
Packit |
79f644 |
* that has the given address.
|
|
Packit |
79f644 |
*
|
|
Packit |
79f644 |
* Returns: the found #TpawIrcNetwork, or %NULL if not found.
|
|
Packit |
79f644 |
*/
|
|
Packit |
79f644 |
TpawIrcNetwork *
|
|
Packit |
79f644 |
tpaw_irc_network_manager_find_network_by_address (
|
|
Packit |
79f644 |
TpawIrcNetworkManager *self,
|
|
Packit |
79f644 |
const gchar *address)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
TpawIrcNetwork *network;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_return_val_if_fail (address != NULL, NULL);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
network = g_hash_table_find (self->priv->networks,
|
|
Packit |
79f644 |
(GHRFunc) find_network_by_address, (gchar *) address);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
return network;
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
TpawIrcNetworkManager *
|
|
Packit |
79f644 |
tpaw_irc_network_manager_dup_default (void)
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
static TpawIrcNetworkManager *default_mgr = NULL;
|
|
Packit |
79f644 |
gchar *dir, *user_file_with_path, *global_file_with_path;
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
if (default_mgr != NULL)
|
|
Packit |
79f644 |
return g_object_ref (default_mgr);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
|
|
Packit |
79f644 |
g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
|
|
Packit |
79f644 |
user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL);
|
|
Packit |
79f644 |
g_free (dir);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
global_file_with_path = g_build_filename (g_getenv ("TPAW_SRCDIR"),
|
|
Packit |
79f644 |
"tp-account-widgets", IRC_NETWORKS_FILENAME, NULL);
|
|
Packit |
79f644 |
if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS))
|
|
Packit |
79f644 |
{
|
|
Packit |
79f644 |
g_free (global_file_with_path);
|
|
Packit |
79f644 |
global_file_with_path = g_build_filename (DATADIR, "empathy",
|
|
Packit |
79f644 |
IRC_NETWORKS_FILENAME, NULL);
|
|
Packit |
79f644 |
}
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
default_mgr = tpaw_irc_network_manager_new (
|
|
Packit |
79f644 |
global_file_with_path, user_file_with_path);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_object_add_weak_pointer (G_OBJECT (default_mgr), (gpointer *) &default_mgr);
|
|
Packit |
79f644 |
|
|
Packit |
79f644 |
g_free (global_file_with_path);
|
|
Packit |
79f644 |
g_free (user_file_with_path);
|
|
Packit |
79f644 |
return default_mgr;
|
|
Packit |
79f644 |
}
|