/**
 * empathy_irc_network_activate:
 * @self: the name of the network
 *
 * Activates a #EmpathyIrcNetwork.
 *
 */
void
empathy_irc_network_activate (EmpathyIrcNetwork *self)
{
  g_return_if_fail (EMPATHY_IS_IRC_NETWORK (self));
  g_return_if_fail (self->dropped);

  self->dropped = FALSE;

  g_signal_emit (self, signals[MODIFIED], 0);
}
/**
 * empathy_irc_network_get_servers:
 * @network: an #EmpathyIrcNetwork
 *
 * Get the list of #EmpathyIrcServer that belongs to this network.
 * These servers are sorted according their priority.
 * So the first one will be the first used when trying to connect to
 * the network.
 *
 * Returns: a new #GSList of refed #EmpathyIrcServer.
 */
GSList *
empathy_irc_network_get_servers (EmpathyIrcNetwork *self)
{
  EmpathyIrcNetworkPriv *priv;
  GSList *servers = NULL, *l;

  g_return_val_if_fail (EMPATHY_IS_IRC_NETWORK (self), NULL);
  priv = GET_PRIV (self);

  for (l = priv->servers; l != NULL; l = g_slist_next (l))
    {
      servers = g_slist_prepend (servers, g_object_ref (l->data));
    }

  return g_slist_reverse (servers);
}
/**
 * empathy_irc_network_manager_remove:
 * @manager: an #EmpathyIrcNetworkManager
 * @network: the #EmpathyIrcNetwork to remove
 *
 * Remove an #EmpathyIrcNetwork from the given #EmpathyIrcNetworkManager.
 *
 */
void
empathy_irc_network_manager_remove (EmpathyIrcNetworkManager *self,
                                    EmpathyIrcNetwork *network)
{
  EmpathyIrcNetworkManagerPriv *priv;

  g_return_if_fail (EMPATHY_IS_IRC_NETWORK_MANAGER (self));
  g_return_if_fail (EMPATHY_IS_IRC_NETWORK (network));

  priv = GET_PRIV (self);

  network->user_defined = TRUE;
  network->dropped = TRUE;

  priv->have_to_save = TRUE;
  reset_save_timeout (self);
}
/**
 * empathy_irc_network_append_server:
 * @network: an #EmpathyIrcNetwork
 * @server: the #EmpathyIrcServer to add
 *
 * Add an #EmpathyIrcServer to the given #EmpathyIrcNetwork. The server
 * is added at the last position in network's servers list.
 *
 */
void
empathy_irc_network_append_server (EmpathyIrcNetwork *self,
                                   EmpathyIrcServer *server)
{
  EmpathyIrcNetworkPriv *priv;

  g_return_if_fail (EMPATHY_IS_IRC_NETWORK (self));
  g_return_if_fail (server != NULL && EMPATHY_IS_IRC_SERVER (server));

  priv = GET_PRIV (self);

  g_return_if_fail (g_slist_find (priv->servers, server) == NULL);

  priv->servers = g_slist_append (priv->servers, g_object_ref (server));

  g_signal_connect (server, "modified", G_CALLBACK (server_modified_cb), self);

  g_signal_emit (self, signals[MODIFIED], 0);
}
/**
 * empathy_irc_network_set_server_position:
 * @network: an #EmpathyIrcNetwork
 * @server: the #EmpathyIrcServer to move
 * @pos: the position to move the server. If this is negative, or is larger than
 * the number of servers in the list, the server is moved to the end of the
 * list.
 *
 * Move an #EmpathyIrcServer in the servers list of the given
 * #EmpathyIrcNetwork.
 *
 */
void
empathy_irc_network_set_server_position (EmpathyIrcNetwork *self,
                                         EmpathyIrcServer *server,
                                         gint pos)
{
  EmpathyIrcNetworkPriv *priv;
  GSList *l;

  g_return_if_fail (EMPATHY_IS_IRC_NETWORK (self));
  g_return_if_fail (server != NULL && EMPATHY_IS_IRC_SERVER (server));

  priv = GET_PRIV (self);

  l = g_slist_find (priv->servers, server);
  if (l == NULL)
    return;

  priv->servers = g_slist_delete_link (priv->servers, l);
  priv->servers = g_slist_insert (priv->servers, server, pos);

  g_signal_emit (self, signals[MODIFIED], 0);
}
/**
 * empathy_irc_network_remove_server:
 * @network: an #EmpathyIrcNetwork
 * @server: the #EmpathyIrcServer to remove
 *
 * Remove an #EmpathyIrcServer from the servers list of the
 * given #EmpathyIrcNetwork.
 *
 */
void
empathy_irc_network_remove_server (EmpathyIrcNetwork *self,
                                   EmpathyIrcServer *server)
{
  EmpathyIrcNetworkPriv *priv;
  GSList *l;

  g_return_if_fail (EMPATHY_IS_IRC_NETWORK (self));
  g_return_if_fail (server != NULL && EMPATHY_IS_IRC_SERVER (server));

  priv = GET_PRIV (self);

  l = g_slist_find (priv->servers, server);
  if (l == NULL)
    return;

  g_object_unref (l->data);
  priv->servers = g_slist_delete_link (priv->servers, l);
  g_signal_handlers_disconnect_by_func (server, G_CALLBACK (server_modified_cb),
      self);

  g_signal_emit (self, signals[MODIFIED], 0);
}
/**
 * empathy_irc_network_manager_add:
 * @manager: an #EmpathyIrcNetworkManager
 * @network: the #EmpathyIrcNetwork to add
 *
 * Add an #EmpathyIrcNetwork to the given #EmpathyIrcNetworkManager.
 *
 */
void
empathy_irc_network_manager_add (EmpathyIrcNetworkManager *self,
                                 EmpathyIrcNetwork *network)
{
  EmpathyIrcNetworkManagerPriv *priv;
  gchar *id = NULL;

  g_return_if_fail (EMPATHY_IS_IRC_NETWORK_MANAGER (self));
  g_return_if_fail (EMPATHY_IS_IRC_NETWORK (network));

  priv = GET_PRIV (self);

  /* generate an id for this network */
  do
    {
      g_free (id);
      id = g_strdup_printf ("id%u", ++priv->last_id);
    } while (g_hash_table_lookup (priv->networks, id) != NULL &&
        priv->last_id < G_MAXUINT);

  if (priv->last_id == G_MAXUINT)
    {
      DEBUG ("Can't add network: too many networks using a similiar ID");
      return;
    }

  DEBUG ("add server with \"%s\" as ID", id);

  network->user_defined = TRUE;
  add_network (self, network, id);

  priv->have_to_save = TRUE;
  reset_save_timeout (self);

  g_free (id);
}