pidgin/pidgin

956745ff3ee8
Parents b28beec32e25
Children d0f01217e491
Replace the ui info GHashTable with a gobject.
--- a/doc/reference/libpurple/libpurple-docs.xml Fri Mar 13 22:11:34 2020 -0500
+++ b/doc/reference/libpurple/libpurple-docs.xml Fri Mar 20 08:57:57 2020 -0500
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
@@ -66,6 +66,7 @@
<xi:include href="xml/purple-gio.xml" />
<xi:include href="xml/purpleaccountoption.xml" />
<xi:include href="xml/purpleaccountusersplit.xml" />
+ <xi:include href="xml/purpleuiinfo.xml" />
<xi:include href="xml/queuedoutputstream.xml" />
<xi:include href="xml/signals.xml" />
<xi:include href="xml/request.xml" />
@@ -93,7 +94,7 @@
</part>
<part id="Submodules">
- <title>Submodules</title>
+ <title>Submodules</title>
<chapter id="messages">
<title>Messaging</title>
--- a/finch/libfinch.c Fri Mar 13 22:11:34 2020 -0500
+++ b/finch/libfinch.c Fri Mar 20 08:57:57 2020 -0500
@@ -56,48 +56,13 @@
purple_debug_set_ui(PURPLE_DEBUG_UI(ui));
}
-static GHashTable *ui_info = NULL;
-static GHashTable *finch_ui_get_info(void)
+static PurpleUiInfo *ui_info = NULL;
+static PurpleUiInfo *
+finch_ui_get_info(void)
{
- if (ui_info == NULL) {
- ui_info = g_hash_table_new(g_str_hash, g_str_equal);
-
- g_hash_table_insert(ui_info, "name", (char*)_("Finch"));
- g_hash_table_insert(ui_info, "version", VERSION);
- g_hash_table_insert(ui_info, "website", "https://pidgin.im");
- g_hash_table_insert(ui_info, "dev_website", "https://developer.pidgin.im");
- g_hash_table_insert(ui_info, "client_type", "console");
-
- /*
- * This is the client key for "Finch." Please don't use this
- * key for other applications. You can not specify a client
- * key, in which case the default "libpurple" key will be used
- */
- g_hash_table_insert(ui_info, "prpl-aim-clientkey", "ma18nmEklXMR7Cj_");
-
- /*
- * This is the client key for "Pidgin." It is owned by the AIM
- * account "markdoliner." Please don't use this key for other
- * applications. You can either not specify a client key, in
- * which case the default "libpurple" key will be used, or you
- * can try to register your own at the AIM or ICQ web sites
- * (although this functionality was removed at some point, it's
- * possible it has been re-added). AOL's old key management
- * page is http://developer.aim.com/manageKeys.jsp
- *
- * We used to have a Finch-specific devId/clientkey
- * (ma19sqWV9ymU6UYc), but it stopped working, so we switched
- * to this one.
- */
- g_hash_table_insert(ui_info, "prpl-icq-clientkey", "ma1cSASNCKFtrdv9");
-
- /*
- * This is the distid for Finch, given to us by AOL. Please
- * don't use this for other applications. You can just not
- * specify a distid and libpurple will use a default.
- */
- g_hash_table_insert(ui_info, "prpl-aim-distid", GINT_TO_POINTER(1718));
- g_hash_table_insert(ui_info, "prpl-icq-distid", GINT_TO_POINTER(1552));
+ if(!PURPLE_IS_UI_INFO(ui_info)) {
+ ui_info = purple_ui_info_new(_("Finch"), VERSION, "https://pidgin.im",
+ "https://developer.pidgin.im", "console");
}
return ui_info;
@@ -107,8 +72,7 @@
finch_quit(void)
{
finch_ui_uninit();
- if (ui_info)
- g_hash_table_destroy(ui_info);
+ g_clear_object(&ui_info);
}
static PurpleCoreUiOps core_ops =
@@ -118,12 +82,6 @@
finch_ui_init,
finch_quit,
finch_ui_get_info,
-
- /* padding */
- NULL,
- NULL,
- NULL,
- NULL
};
static PurpleCoreUiOps *
--- a/libpurple/core.c Fri Mar 13 22:11:34 2020 -0500
+++ b/libpurple/core.c Fri Mar 20 08:57:57 2020 -0500
@@ -61,13 +61,13 @@
static void
purple_core_print_version(void)
{
- GHashTable *ui_info = purple_core_get_ui_info();
+ PurpleUiInfo *ui_info = purple_core_get_ui_info();
const gchar *ui_name;
const gchar *ui_version;
gchar *ui_full_name = NULL;
- ui_name = ui_info ? g_hash_table_lookup(ui_info, "name") : NULL;
- ui_version = ui_info ? g_hash_table_lookup(ui_info, "version") : NULL;
+ ui_name = ui_info ? purple_ui_info_get_name(ui_info) : NULL;
+ ui_version = ui_info ? purple_ui_info_get_version(ui_info) : NULL;
if (ui_name) {
if (ui_version) {
@@ -83,6 +83,7 @@
purple_core_get_version());
g_free(ui_full_name);
+ g_object_unref(G_OBJECT(ui_info));
}
gboolean
@@ -333,7 +334,7 @@
return _ops;
}
-GHashTable* purple_core_get_ui_info() {
+PurpleUiInfo* purple_core_get_ui_info() {
PurpleCoreUiOps *ops = purple_core_get_ui_ops();
if(NULL == ops || NULL == ops->get_ui_info)
--- a/libpurple/core.h Fri Mar 13 22:11:34 2020 -0500
+++ b/libpurple/core.h Fri Mar 20 08:57:57 2020 -0500
@@ -32,6 +32,8 @@
#include <glib.h>
#include <glib-object.h>
+#include <libpurple/purpleuiinfo.h>
+
#define PURPLE_TYPE_CORE_UI_OPS (purple_core_ui_ops_get_type())
typedef struct PurpleCore PurpleCore;
@@ -66,13 +68,10 @@
void (*quit)(void);
- GHashTable* (*get_ui_info)(void);
+ PurpleUiInfo *(*get_ui_info)(void);
/*< private >*/
- void (*_purple_reserved1)(void);
- void (*_purple_reserved2)(void);
- void (*_purple_reserved3)(void);
- void (*_purple_reserved4)(void);
+ gpointer reserved[4];
};
G_BEGIN_DECLS
@@ -175,52 +174,20 @@
/**
* purple_core_get_ui_info:
*
- * Returns a hash table containing various information about the UI. The
- * following well-known entries may be in the table (along with any others the
- * UI might choose to include):
+ * Returns a #PurpleUiInfo that contains information about the user interface.
*
- * <informaltable frame='none'>
- * <tgroup cols='2'><tbody>
- * <row>
- * <entry><literal>name</literal></entry>
- * <entry>the user-readable name for the UI.</entry>
- * </row>
- * <row>
- * <entry><literal>version</literal></entry>
- * <entry>a user-readable description of the current version of the UI.</entry>
- * </row>
- * <row>
- * <entry><literal>website</literal></entry>
- * <entry>the UI's website, such as https://pidgin.im.</entry>
- * </row>
- * <row>
- * <entry><literal>dev_website</literal></entry>
- * <entry>the UI's development/support website, such as
- * https://developer.pidgin.im.</entry>
- * </row>
- * <row>
- * <entry><literal>client_type</literal></entry>
- * <entry>the type of UI. Possible values include 'pc', 'console', 'phone',
- * 'handheld', 'web', and 'bot'. These values are compared
- * programmatically and should not be localized.</entry>
- * </row>
- * </tbody></tgroup>
- * </informaltable>
- *
- * Returns: (transfer none): A GHashTable with strings for keys and values.
- * This hash table should not be modified.
- *
+ * Returns: (transfer full): A #PurpleUiInfo instance.
*/
-GHashTable* purple_core_get_ui_info(void);
+PurpleUiInfo* purple_core_get_ui_info(void);
/**
* purple_core_migrate_to_xdg_base_dirs:
- *
- * Migrates from legacy directory for libpurple to location following
+ *
+ * Migrates from legacy directory for libpurple to location following
* XDG base dir spec. https://developer.pidgin.im/ticket/10029
* NOTE This is not finished yet. Need to decide where other profile files
* should be moved. Search for usages of purple_user_dir().
- *
+ *
* Returns: TRUE if migrated successfully, FALSE otherwise. On failure,
* the application must display an error to the user and then exit.
*/
--- a/libpurple/meson.build Fri Mar 13 22:11:34 2020 -0500
+++ b/libpurple/meson.build Fri Mar 20 08:57:57 2020 -0500
@@ -48,6 +48,7 @@
'purple-gio.c',
'purpleaccountoption.c',
'purpleaccountusersplit.c',
+ 'purpleuiinfo.c',
'queuedoutputstream.c',
'request.c',
'request-datasheet.c',
@@ -124,6 +125,7 @@
'purple-gio.h',
'purpleaccountoption.h',
'purpleaccountusersplit.h',
+ 'purpleuiinfo.h',
'queuedoutputstream.h',
'request.h',
'request-datasheet.h',
--- a/libpurple/plugins/keyrings/kwallet/purplekwallet.cpp Fri Mar 13 22:11:34 2020 -0500
+++ b/libpurple/plugins/keyrings/kwallet/purplekwallet.cpp Fri Mar 20 08:57:57 2020 -0500
@@ -400,14 +400,18 @@
static const char *kwallet_get_ui_name(void)
{
- GHashTable *ui_info;
+ PurpleUiInfo *ui_info = NULL;
const char *ui_name = NULL;
ui_info = purple_core_get_ui_info();
- if (ui_info != NULL)
- ui_name = (const char*)g_hash_table_lookup(ui_info, "name");
- if (ui_name == NULL)
+ if(PURPLE_IS_UI_INFO(ui_info)) {
+ ui_name = purple_ui_info_get_name(ui_info);
+ g_object_unref(G_OBJECT(ui_info));
+ }
+
+ if(ui_name == NULL) {
ui_name = KWALLET_APP_NAME;
+ }
return ui_name;
}
--- a/libpurple/protocols/jabber/bosh.c Fri Mar 13 22:11:34 2020 -0500
+++ b/libpurple/protocols/jabber/bosh.c Fri Mar 20 08:57:57 2020 -0500
@@ -64,21 +64,26 @@
void
jabber_bosh_init(void)
{
- GHashTable *ui_info = purple_core_get_ui_info();
+ PurpleUiInfo *ui_info = purple_core_get_ui_info();
const gchar *ui_name = NULL;
const gchar *ui_version = NULL;
- if (ui_info) {
- ui_name = g_hash_table_lookup(ui_info, "name");
- ui_version = g_hash_table_lookup(ui_info, "version");
+ if(ui_info) {
+ ui_name = purple_ui_info_get_name(ui_info);
+ ui_version = purple_ui_info_get_version(ui_info);
}
- if (ui_name) {
+ if(ui_name) {
jabber_bosh_useragent = g_strdup_printf(
"%s%s%s (libpurple " VERSION ")", ui_name,
ui_version ? " " : "", ui_version ? ui_version : "");
- } else
+ } else {
jabber_bosh_useragent = g_strdup("libpurple " VERSION);
+ }
+
+ if(ui_info) {
+ g_object_unref(G_OBJECT(ui_info));
+ }
}
void jabber_bosh_uninit(void)
--- a/libpurple/protocols/jabber/iq.c Fri Mar 13 22:11:34 2020 -0500
+++ b/libpurple/protocols/jabber/iq.c Fri Mar 20 08:57:57 2020 -0500
@@ -228,7 +228,7 @@
PurpleXmlNode *query;
if(type == JABBER_IQ_GET) {
- GHashTable *ui_info;
+ PurpleUiInfo *ui_info;
const char *ui_name = NULL, *ui_version = NULL;
iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, "jabber:iq:version");
@@ -240,9 +240,9 @@
ui_info = purple_core_get_ui_info();
- if(NULL != ui_info) {
- ui_name = g_hash_table_lookup(ui_info, "name");
- ui_version = g_hash_table_lookup(ui_info, "version");
+ if(PURPLE_IS_UI_INFO(ui_info)) {
+ ui_name = purple_ui_info_get_name(ui_info);
+ ui_version = purple_ui_info_get_version(ui_info);
}
if(NULL != ui_name && NULL != ui_version) {
@@ -256,6 +256,10 @@
}
jabber_iq_send(iq);
+
+ if(PURPLE_IS_UI_INFO(ui_info)) {
+ g_object_unref(G_OBJECT(ui_info));
+ }
}
}
--- a/libpurple/protocols/jabber/jabber.c Fri Mar 13 22:11:34 2020 -0500
+++ b/libpurple/protocols/jabber/jabber.c Fri Mar 20 08:57:57 2020 -0500
@@ -3815,7 +3815,7 @@
static void
jabber_do_init(void)
{
- GHashTable *ui_info = purple_core_get_ui_info();
+ PurpleUiInfo *ui_info = purple_core_get_ui_info();
const gchar *ui_type;
const gchar *type = "pc"; /* default client type, if unknown or
unspecified */
@@ -3853,7 +3853,7 @@
jabber_cmds = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, cmds_free_func);
- ui_type = ui_info ? g_hash_table_lookup(ui_info, "client_type") : NULL;
+ ui_type = ui_info ? purple_ui_info_get_client_type(ui_info) : NULL;
if (ui_type) {
if (purple_strequal(ui_type, "pc") ||
purple_strequal(ui_type, "console") ||
@@ -3866,7 +3866,7 @@
}
if (ui_info)
- ui_name = g_hash_table_lookup(ui_info, "name");
+ ui_name = purple_ui_info_get_name(ui_info);
if (ui_name == NULL)
ui_name = PACKAGE;
@@ -3930,6 +3930,8 @@
jabber_si_init();
jabber_auth_init();
+
+ g_object_unref(G_OBJECT(ui_info));
}
static void
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purpleuiinfo.c Fri Mar 20 08:57:57 2020 -0500
@@ -0,0 +1,281 @@
+/*
+ * purple
+ *
+ * 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 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 "purpleuiinfo.h"
+
+struct _PurpleUiInfo {
+ GObject parent;
+
+ gchar *name;
+ gchar *version;
+ gchar *website;
+ gchar *support_website;
+ gchar *client_type;
+};
+
+enum {
+ PROP_0,
+ PROP_NAME,
+ PROP_VERSION,
+ PROP_WEBSITE,
+ PROP_SUPPORT_WEBSITE,
+ PROP_CLIENT_TYPE,
+ N_PROPERTIES
+};
+static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+
+/******************************************************************************
+ * Helpers
+ *****************************************************************************/
+static void
+purple_ui_info_set_name(PurpleUiInfo *info, const gchar *name) {
+ g_free(info->name);
+ info->name = g_strdup(name);
+}
+
+static void
+purple_ui_info_set_version(PurpleUiInfo *info, const gchar *version) {
+ g_free(info->version);
+ info->version = g_strdup(version);
+}
+
+static void
+purple_ui_info_set_website(PurpleUiInfo *info, const gchar *website) {
+ g_free(info->website);
+ info->website = g_strdup(website);
+}
+
+static void
+purple_ui_info_set_support_website(PurpleUiInfo *info,
+ const gchar *support_website)
+{
+ g_free(info->support_website);
+ info->support_website = g_strdup(support_website);
+}
+
+static void
+purple_ui_info_set_client_type(PurpleUiInfo *info, const gchar *client_type) {
+ g_free(info->client_type);
+ info->client_type = g_strdup(client_type);
+}
+
+/******************************************************************************
+ * GObject Implementation
+ *****************************************************************************/
+G_DEFINE_TYPE(PurpleUiInfo, purple_ui_info, G_TYPE_OBJECT);
+
+static void
+purple_ui_info_get_property(GObject *obj, guint param_id, GValue *value,
+ GParamSpec *pspec)
+{
+ PurpleUiInfo *info = PURPLE_UI_INFO(obj);
+
+ switch(param_id) {
+ case PROP_NAME:
+ g_value_set_string(value, purple_ui_info_get_name(info));
+ break;
+ case PROP_VERSION:
+ g_value_set_string(value, purple_ui_info_get_version(info));
+ break;
+ case PROP_WEBSITE:
+ g_value_set_string(value, purple_ui_info_get_website(info));
+ break;
+ case PROP_SUPPORT_WEBSITE:
+ g_value_set_string(value, purple_ui_info_get_support_website(info));
+ break;
+ case PROP_CLIENT_TYPE:
+ g_value_set_string(value, purple_ui_info_get_client_type(info));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_ui_info_set_property(GObject *obj, guint param_id, const GValue *value,
+ GParamSpec *pspec)
+{
+ PurpleUiInfo *info = PURPLE_UI_INFO(obj);
+
+ switch(param_id) {
+ case PROP_NAME:
+ purple_ui_info_set_name(info, g_value_get_string(value));
+ break;
+ case PROP_VERSION:
+ purple_ui_info_set_version(info, g_value_get_string(value));
+ break;
+ case PROP_WEBSITE:
+ purple_ui_info_set_website(info, g_value_get_string(value));
+ break;
+ case PROP_SUPPORT_WEBSITE:
+ purple_ui_info_set_support_website(info,
+ g_value_get_string(value));
+ break;
+ case PROP_CLIENT_TYPE:
+ purple_ui_info_set_client_type(info, g_value_get_string(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_ui_info_init(PurpleUiInfo *info) {
+}
+
+static void
+purple_ui_info_finalize(GObject *obj) {
+ PurpleUiInfo *info = PURPLE_UI_INFO(obj);
+
+ g_clear_pointer(&info->name, g_free);
+ g_clear_pointer(&info->version, g_free);
+ g_clear_pointer(&info->website, g_free);
+ g_clear_pointer(&info->support_website, g_free);
+ g_clear_pointer(&info->client_type, g_free);
+
+ G_OBJECT_CLASS(purple_ui_info_parent_class)->finalize(obj);
+}
+
+static void
+purple_ui_info_class_init(PurpleUiInfoClass *klass) {
+ GObjectClass *obj_class = G_OBJECT_CLASS(klass);
+
+ obj_class->get_property = purple_ui_info_get_property;
+ obj_class->set_property = purple_ui_info_set_property;
+ obj_class->finalize = purple_ui_info_finalize;
+
+ /**
+ * PurpleUiInfo::name:
+ *
+ * The name of the user interface.
+ */
+ properties[PROP_NAME] =
+ g_param_spec_string("name", "name", "The name of the user interface",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * PurpleUiInfo::version:
+ *
+ * The name of the user interface.
+ */
+ properties[PROP_VERSION] =
+ g_param_spec_string("version", "version",
+ "The version of the user interface",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * PurpleUiInfo::website:
+ *
+ * The website of the user interface.
+ */
+ properties[PROP_WEBSITE] =
+ g_param_spec_string("website", "website",
+ "The website of the user interface",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * PurpleUiInfo::support-website:
+ *
+ * The support website of the user interface.
+ */
+ properties[PROP_SUPPORT_WEBSITE] =
+ g_param_spec_string("support-website", "support-website",
+ "The support website of the user interface",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * PurpleUiInfo::client-type:
+ *
+ * The client type of the user interface.
+ */
+ properties[PROP_CLIENT_TYPE] =
+ g_param_spec_string("client-type", "client-type",
+ "The client type of the user interface",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+}
+
+/******************************************************************************
+ * Public API
+ *****************************************************************************/
+PurpleUiInfo *
+purple_ui_info_new(const gchar *name, const gchar *version,
+ const gchar *website, const gchar *support_website,
+ const gchar *client_type)
+{
+ return g_object_new(PURPLE_TYPE_UI_INFO,
+ "name", name,
+ "version", version,
+ "website", website,
+ "support-website", support_website,
+ "client-type", client_type,
+ NULL);
+}
+
+const gchar *
+purple_ui_info_get_name(PurpleUiInfo *info) {
+ g_return_val_if_fail(PURPLE_IS_UI_INFO(info), NULL);
+
+ return info->name;
+}
+
+const gchar *
+purple_ui_info_get_version(PurpleUiInfo *info) {
+ g_return_val_if_fail(PURPLE_IS_UI_INFO(info), NULL);
+
+ return info->version;
+}
+
+const gchar *
+purple_ui_info_get_website(PurpleUiInfo *info) {
+ g_return_val_if_fail(PURPLE_IS_UI_INFO(info), NULL);
+
+ return info->website;
+}
+
+const gchar *
+purple_ui_info_get_support_website(PurpleUiInfo *info) {
+ g_return_val_if_fail(PURPLE_IS_UI_INFO(info), NULL);
+
+ return info->support_website;
+}
+
+const gchar *
+purple_ui_info_get_client_type(PurpleUiInfo *info) {
+ g_return_val_if_fail(PURPLE_IS_UI_INFO(info), NULL);
+
+ return info->client_type;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purpleuiinfo.h Fri Mar 20 08:57:57 2020 -0500
@@ -0,0 +1,126 @@
+/*
+ * purple
+ *
+ * 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 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
+ */
+
+#ifndef PURPLE_UI_INFO_H
+#define PURPLE_UI_INFO_H
+
+/**
+ * SECTION:purpleuiinfo
+ * @section_id: libpurple-ui-info
+ * @short_description: <filename>purpleuiinfo.h</filename>
+ * @title: A simple class that contains information about a user interface.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define PURPLE_TYPE_UI_INFO (purple_ui_info_get_type())
+G_DECLARE_FINAL_TYPE(PurpleUiInfo, purple_ui_info, PURPLE, UI_INFO, GObject)
+
+/**
+ * purple_ui_info_new:
+ * @name: The name.
+ * @version: The version.
+ * @website: The website.
+ * @support_website: The support website.
+ * @client_type: The client type.
+ *
+ * Creates a new #PurpleUiInfo with the given values. If you only want to set
+ * a few of these, you should use g_object_new() directly.
+ *
+ * Returns: (transfer full): The newly created #PurpleUiInfo instance.
+ *
+ * Since: 3.0.0
+ */
+PurpleUiInfo *purple_ui_info_new(const gchar *name,
+ const gchar *version,
+ const gchar *website,
+ const gchar *support_website,
+ const gchar *client_type);
+
+/**
+ * purple_ui_info_get_name:
+ * @info: The #PurpleUiInfo instance.
+ *
+ * Gets the name from @info.
+ *
+ * Returns: The name from @info.
+ *
+ * Since: 3.0.0
+ */
+const gchar *purple_ui_info_get_name(PurpleUiInfo *info);
+
+/**
+ * purple_ui_info_get_version:
+ * @info: The #PurpleUiInfo instance.
+ *
+ * Gets the version from @info.
+ *
+ * Returns: The version from @info.
+ *
+ * Since: 3.0.0
+ */
+const gchar *purple_ui_info_get_version(PurpleUiInfo *info);
+
+/**
+ * purple_ui_info_get_website:
+ * @info: The #PurpleUiInfo instance.
+ *
+ * Gets the website from @info.
+ *
+ * Returns: The website for @info.
+ *
+ * Since: 3.0.0
+ */
+const gchar *purple_ui_info_get_website(PurpleUiInfo *info);
+
+/**
+ * purple_ui_info_get_support_website:
+ * @info: The #PurpleUiInfo instance.
+ *
+ * Gets the support website from @info.
+ *
+ * Returns: The support website from @info.
+ *
+ * Since: 3.0.0
+ */
+const gchar *purple_ui_info_get_support_website(PurpleUiInfo *info);
+
+/**
+ * purple_ui_info_get_client_type:
+ * @info: The #PurpleUiInfo instance.
+ *
+ * Gets the client type from @info. For example: 'bot', 'console', 'mobile',
+ * 'pc', 'web', etc.
+ *
+ * Returns: The client type of @info.
+ *
+ * Since: 3.0.0
+ */
+const gchar *purple_ui_info_get_client_type(PurpleUiInfo *info);
+
+G_END_DECLS
+
+#endif /* PURPLE_UI_INFO_H */
+
--- a/pidgin/libpidgin.c Fri Mar 13 22:11:34 2020 -0500
+++ b/pidgin/libpidgin.c Fri Mar 20 08:57:57 2020 -0500
@@ -248,7 +248,7 @@
pidgin_notify_init();
}
-static GHashTable *ui_info = NULL;
+static PurpleUiInfo *ui_info = NULL;
static void
pidgin_quit(void)
@@ -269,46 +269,17 @@
purple_debug_set_ui(NULL);
g_object_unref(ui);
- if(NULL != ui_info)
- g_hash_table_destroy(ui_info);
+ g_clear_object(&ui_info);
/* and end it all... */
g_application_quit(g_application_get_default());
}
-static GHashTable *pidgin_ui_get_info(void)
+static PurpleUiInfo *pidgin_ui_get_info(void)
{
if(NULL == ui_info) {
- ui_info = g_hash_table_new(g_str_hash, g_str_equal);
-
- g_hash_table_insert(ui_info, "name", (char*)PIDGIN_NAME);
- g_hash_table_insert(ui_info, "version", VERSION);
- g_hash_table_insert(ui_info, "website", "https://pidgin.im");
- g_hash_table_insert(ui_info, "dev_website", "https://developer.pidgin.im");
- g_hash_table_insert(ui_info, "client_type", "pc");
-
- /*
- * prpl-aim-clientkey is a DevID (or "client key") for Pidgin, given to
- * us by AOL in September 2016. prpl-icq-clientkey is also a client key
- * for Pidgin, owned by the AIM account "markdoliner." Please don't use
- * either for other applications. Instead, you can either not specify a
- * client key, in which case the default "libpurple" key will be used,
- * or you can try to register your own at the AIM or ICQ web sites
- * (although this functionality was removed at some point, it's possible
- * it has been re-added).
- */
- g_hash_table_insert(ui_info, "prpl-aim-clientkey", "do1UCeb5gNqxB1S1");
- g_hash_table_insert(ui_info, "prpl-icq-clientkey", "ma1cSASNCKFtrdv9");
-
- /*
- * prpl-aim-distid is a distID for Pidgin, given to us by AOL in
- * September 2016. prpl-icq-distid is also a distID for Pidgin, given
- * to us by AOL. Please don't use either for other applications.
- * Instead, you can just not specify a distID and libpurple will use a
- * default.
- */
- g_hash_table_insert(ui_info, "prpl-aim-distid", GINT_TO_POINTER(1715));
- g_hash_table_insert(ui_info, "prpl-icq-distid", GINT_TO_POINTER(1550));
+ ui_info = purple_ui_info_new(PIDGIN_NAME, VERSION, "https://pidgin.im",
+ "https://developer.pidgin.im", "pc");
}
return ui_info;
@@ -321,10 +292,6 @@
pidgin_ui_init,
pidgin_quit,
pidgin_ui_get_info,
- NULL,
- NULL,
- NULL,
- NULL
};
static PurpleCoreUiOps *