/*
 * Purple - Internet Messaging Library
 * Copyright (C) Pidgin Developers <devel@pidgin.im>
 *
 * Purple is the legal property of its developers, whose names are too numerous
 * to list here. Please refer to the COPYRIGHT file distributed with this
 * source distribution.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * 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 General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this library; if not, see <https://www.gnu.org/licenses/>.
 */

#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION)
# error "only <purple.h> may be included directly"
#endif

#ifndef PURPLE_GIO_H
#define PURPLE_GIO_H

#include <gio/gio.h>

#include "purpleaccount.h"
#include "purpleversion.h"

G_BEGIN_DECLS

/**
 * purple_gio_graceful_close:
 * @stream: A #GIOStream to close
 * @input: (nullable): A #GInputStream which wraps @stream's input stream
 * @output: (nullable): A #GOutputStream which wraps @stream's output stream
 *
 * Closes @input, @output, @stream. If there are pending operations, it
 * asynchronously waits for the operations to finish before closing the
 * arguments. Ensure the Gio callbacks can safely handle this being done
 * asynchronously.
 *
 * Since: 3.0
 */
PURPLE_AVAILABLE_IN_3_0
void purple_gio_graceful_close(GIOStream *stream, GInputStream *input, GOutputStream *output);

/**
 * purple_gio_socket_client_new:
 * @account: The #PurpleAccount to use for this connection
 * @error: Return location for a GError, or NULL
 *
 * A helper function to simplify creating a #GSocketClient. It's intended
 * to be used in protocol plugins.
 *
 * Returns: (transfer full): A new #GSocketClient with the appropriate
 * GProxyResolver, based on the #PurpleAccount settings and
 * TLS Certificate handling, or NULL if an error occurred.
 *
 * Since: 3.0
 */
PURPLE_AVAILABLE_IN_3_0
GSocketClient *purple_gio_socket_client_new(PurpleAccount *account, GError **error);

/**
 * purple_socket_listener_add_any_inet_port:
 * @listener: A #GSocketListener.
 * @source_object: (nullable): Optional GObject identifying this source.
 * @error: A #GError location to store the error occurring, or %NULL to ignore.
 *
 * Listens for TCP connections on any available port number for both IPv6 and
 * IPv4 (if each is available). This is a simple wrapper around
 * g_socket_listener_add_any_inet_port(), except if the user specified a port
 * range in the settings, than a port will be chosen from that range.
 *
 * Returns: The port number, or 0 in case of failure.
 *
 * Since: 3.0
 */
PURPLE_AVAILABLE_IN_3_0
guint16 purple_socket_listener_add_any_inet_port(GSocketListener *listener, GObject *source_object, GError **error);

G_END_DECLS

#endif /* PURPLE_GIO_H */
