Add online and offline signals that are emitted when the first account goes and the last account go offline.

Tue, 31 Mar 2020 00:59:27 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 31 Mar 2020 00:59:27 -0500
changeset 40369
41733d530d58
parent 40368
cb9a81e8845a
child 40370
74c0f140048d

Add online and offline signals that are emitted when the first account goes and the last account go offline.

doc/reference/libpurple/signals_connection.xml file | annotate | diff | comparison | revisions
libpurple/connection.c file | annotate | diff | comparison | revisions
libpurple/connection.h file | annotate | diff | comparison | revisions
--- 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>
+  &quot;<link linkend="connections-online">online</link>&quot;
+  &quot;<link linkend="connections-offline">offline</link>&quot;
   &quot;<link linkend="connections-signing-on">signing-on</link>&quot;
   &quot;<link linkend="connections-signed-on">signed-on</link>&quot;
   &quot;<link linkend="connections-autojoin">autojoin</link>&quot;
@@ -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>&quot;online&quot;</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>&#160;:</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>&quot;online&quot;</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>&#160;:</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>&quot;signing-on&quot;</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                                              */
 /**************************************************************************/

mercurial