Tue, 31 Mar 2020 00:59:27 -0500
Add online and offline signals that are emitted when the first account goes and the last account go offline.
--- a/doc/reference/libpurple/signals_connection.xml Mon Mar 30 22:47:30 2020 -0500 +++ b/doc/reference/libpurple/signals_connection.xml Tue Mar 31 00:59:27 2020 -0500 @@ -8,6 +8,8 @@ <refsect1 id="connections.signals" role="signal_proto"> <title role="signal_proto.title">List of signals</title> <synopsis> + "<link linkend="connections-online">online</link>" + "<link linkend="connections-offline">offline</link>" "<link linkend="connections-signing-on">signing-on</link>" "<link linkend="connections-signed-on">signed-on</link>" "<link linkend="connections-autojoin">autojoin</link>" @@ -20,6 +22,39 @@ <refsect1 id="connections.signal-details" role="signals"> <title role="signals.title">Signal details</title> +<refsect2 id="connections-online" role="signal"> + <title>The <literal>"online"</literal> signal</title> +<programlisting> +void user_function (gpointer user_data) +</programlisting> + <para> +Emitted when the first connection has connected when all connections were +previsously not connected. + </para> + <variablelist role="params"> + <varlistentry> + <term><parameter>user_data</parameter> :</term> + <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem> + </varlistentry> + </variablelist> +</refsect2> + +<refsect2 id="connections-offline" role="signal"> + <title>The <literal>"online"</literal> signal</title> +<programlisting> +void user_function (gpointer user_data) +</programlisting> + <para> +Emitted when the last connected connection has disconnected. + </para> + <variablelist role="params"> + <varlistentry> + <term><parameter>user_data</parameter> :</term> + <listitem><simpara>user data set when the signal handler was connected.</simpara></listitem> + </varlistentry> + </variablelist> +</refsect2> + <refsect2 id="connections-signing-on" role="signal"> <title>The <literal>"signing-on"</literal> signal</title> <programlisting>
--- a/libpurple/connection.c Mon Mar 30 22:47:30 2020 -0500 +++ b/libpurple/connection.c Tue Mar 31 00:59:27 2020 -0500 @@ -102,6 +102,7 @@ static GList *connections = NULL; static GList *connections_connecting = NULL; +static GList *connections_connected = NULL; static PurpleConnectionUiOps *connection_ui_ops = NULL; static int connections_handle; @@ -185,9 +186,12 @@ if (priv->state == PURPLE_CONNECTION_CONNECTED) { PurpleAccount *account; PurplePresence *presence; + gboolean emit_online = FALSE; + gpointer handle = NULL; account = purple_connection_get_account(gc); presence = purple_account_get_presence(account); + handle = purple_connections_get_handle(); /* Set the time the account came online */ purple_presence_set_login_time(presence, time(NULL)); @@ -214,12 +218,25 @@ purple_blist_add_account(account); - purple_signal_emit(purple_connections_get_handle(), "signed-on", gc); - purple_signal_emit_return_1(purple_connections_get_handle(), "autojoin", gc); + purple_signal_emit(handle, "signed-on", gc); + purple_signal_emit_return_1(handle, "autojoin", gc); purple_serv_set_permit_deny(gc); update_keepalive(gc, TRUE); + + /* check if connections_connected is NULL, if so we need to emit the + * online signal. + */ + if(connections_connected == NULL) { + emit_online = TRUE; + } + + connections_connected = g_list_append(connections_connected, gc); + + if(emit_online) { + purple_signal_emit(handle, "online"); + } } else if (priv->state == PURPLE_CONNECTION_DISCONNECTED) { PurpleAccount *account = purple_connection_get_account(gc); @@ -846,17 +863,19 @@ PurpleAccount *account; GSList *buddies; gboolean remove = FALSE; + gpointer handle; priv->is_finalizing = TRUE; account = purple_connection_get_account(gc); + handle = purple_connections_get_handle(); purple_debug_info("connection", "Disconnecting connection %p\n", gc); if (purple_connection_get_state(gc) != PURPLE_CONNECTION_CONNECTING) remove = TRUE; - purple_signal_emit(purple_connections_get_handle(), "signing-off", gc); + purple_signal_emit(handle, "signing-off", gc); g_slist_free_full(priv->active_chats, (GDestroyNotify)purple_chat_conversation_leave); @@ -881,12 +900,17 @@ if (remove) purple_blist_remove_account(account); - purple_signal_emit(purple_connections_get_handle(), "signed-off", gc); + purple_signal_emit(handle, "signed-off", gc); purple_account_request_close_with_account(account); purple_request_close_with_handle(gc); purple_notify_close_with_handle(gc); + connections_connected = g_list_remove(connections_connected, gc); + if(connections_connected == NULL) { + purple_signal_emit(handle, "offline"); + } + purple_debug_info("connection", "Destroying connection %p\n", gc); purple_account_set_connection(account, NULL); @@ -1122,6 +1146,11 @@ return connections_connecting; } +gboolean +purple_connections_is_online(void) { + return (connections_connected != NULL); +} + void purple_connections_set_ui_ops(PurpleConnectionUiOps *ops) { @@ -1139,6 +1168,12 @@ { void *handle = purple_connections_get_handle(); + purple_signal_register(handle, "online", purple_marshal_VOID, G_TYPE_NONE, + 0); + + purple_signal_register(handle, "offline", purple_marshal_VOID, G_TYPE_NONE, + 0); + purple_signal_register(handle, "signing-on", purple_marshal_VOID__POINTER, G_TYPE_NONE, 1, PURPLE_TYPE_CONNECTION);
--- a/libpurple/connection.h Mon Mar 30 22:47:30 2020 -0500 +++ b/libpurple/connection.h Tue Mar 31 00:59:27 2020 -0500 @@ -613,6 +613,15 @@ */ GList *purple_connections_get_connecting(void); +/** + * purple_connections_is_online: + * + * Checks if at least one account is online. + * + * Returns: %TRUE if at least one account is online. + */ +gboolean purple_connections_is_online(void); + /**************************************************************************/ /* UI Registration Functions */ /**************************************************************************/