pidgin/plugins/relnot.c

Thu, 22 Jul 2021 22:33:54 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Thu, 22 Jul 2021 22:33:54 -0500
changeset 40991
d92defc9ba95
parent 40894
80d9d7a73a60
child 41078
84e48180ef67
permissions
-rw-r--r--

Move minidialog stuff from utils to its source file

* Remove minidialog list from utils.
It's supposed to be used to delete them when the connection is dropped, but this list is never added to. And the dialogs are automatically closed when the account disconnects in some other way that I could not find.
Consequently, drop the unused `gc` from `pidgin_make_mini_dialog*`.
* Replace `PidginUtilMiniDialogCallback` by `PidginMiniDialogCallback`.
It is just a wrapper around the latter, with different argument order.
* Move minidialog wrappers from utils to `minidialog.c`. And fix naming/arguments to match the existing functions.

Testing Done:
Compiled, connected an account that had buddy requests, but didn't act on them.

Reviewed at https://reviews.imfreedom.org/r/788/

/*
 * Release Notification Plugin
 *
 * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
 *
 * This program 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 program 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 program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02111-1301, USA.
 */

#include <glib/gi18n-lib.h>

#include <libsoup/soup.h>
#include <string.h>

#include <purple.h>

#include <pidgin.h>

static SoupSession *session = NULL;

/* 1 day */
#define MIN_CHECK_INTERVAL 60 * 60 * 24

static void
release_hide(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
             G_GNUC_UNUSED GtkButton *button,
             G_GNUC_UNUSED gpointer user_data)
{
	/* No-op.  We may use this method in the future to avoid showing
	 * the popup twice */
}

static void
release_show(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
             G_GNUC_UNUSED GtkButton *button,
             G_GNUC_UNUSED gpointer user_data)
{
	purple_notify_uri(NULL, PURPLE_WEBSITE);
}

static void
version_fetch_cb(G_GNUC_UNUSED SoupSession *session, SoupMessage *msg,
                 gpointer user_data)
{
	gchar *cur_ver;
	const char *changelog;
	GtkWidget *release_dialog;

	GString *message;
	int i = 0;

	if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
		return;
	}

	changelog = msg->response_body->data;

	while(changelog[i] && changelog[i] != '\n') i++;

	/* this basically means the version thing wasn't in the format we were
	 * looking for so sourceforge is probably having web server issues, and
	 * we should try again later */
	if(i == 0)
		return;

	cur_ver = g_strndup(changelog, i);

	message = g_string_new("");
	g_string_append_printf(message, _("You can upgrade to %s %s today."),
			PIDGIN_NAME, cur_ver);

	release_dialog = pidgin_mini_dialog_new_with_buttons(
		_("New Version Available"), message->str, "dialog-information", NULL,
		_("Later"), release_hide, _("Download Now"), release_show, NULL);

	pidgin_blist_add_alert(release_dialog);

	g_string_free(message, TRUE);
	g_free(cur_ver);
}

static void
do_check(void)
{
	int last_check = purple_prefs_get_int("/plugins/gtk/relnot/last_check");
	if(!last_check || time(NULL) - last_check > MIN_CHECK_INTERVAL) {
		SoupMessage *msg;

		purple_debug_info("relnot", "Checking for new version.");

		msg = soup_form_request_new("GET", "https://pidgin.im/version.php",
		                            "version", purple_core_get_version(),
		                            "build",
#ifdef _WIN32
		                            "purple-win32",
#else
		                            "purple",
#endif
		                            NULL);

		soup_session_queue_message(session, msg, version_fetch_cb, NULL);

		purple_prefs_set_int("/plugins/gtk/relnot/last_check", time(NULL));
	}
}

static void
signed_on_cb(PurpleConnection *gc, void *data) {
	do_check();
}

/**************************************************************************
 * Plugin stuff
 **************************************************************************/
static GPluginPluginInfo *
relnot_query(GError **error)
{
	const gchar * const authors[] = {
		"Nathan Walp <faceprint@faceprint.com>",
		NULL
	};

	return pidgin_plugin_info_new(
		"id",           "gtk-relnot",
		"name",         N_("Release Notification"),
		"version",      DISPLAY_VERSION,
		"category",     N_("Notification"),
		"summary",      N_("Checks periodically for new releases."),
		"description",  N_("Checks periodically for new releases and notifies "
		                   "the user with the ChangeLog."),
		"authors",      authors,
		"website",      PURPLE_WEBSITE,
		"abi-version",  PURPLE_ABI_VERSION,
		NULL
	);
}

static gboolean
relnot_load(GPluginPlugin *plugin, GError **error)
{
	purple_prefs_add_none("/plugins/gtk/relnot");
	purple_prefs_add_int("/plugins/gtk/relnot/last_check", 0);

	purple_signal_connect(purple_connections_get_handle(), "signed-on",
						plugin, PURPLE_CALLBACK(signed_on_cb), NULL);

	session = soup_session_new();

	/* we don't check if we're offline */
	if(purple_connections_get_all())
		do_check();

	return TRUE;
}

static gboolean
relnot_unload(GPluginPlugin *plugin, GError **error)
{
	soup_session_abort(session);
	g_clear_object(&session);
	return TRUE;
}

GPLUGIN_NATIVE_PLUGIN_DECLARE(relnot)

mercurial