Move the PurpleProtocolServer interface to its own file.
Testing Done:
Compiled and ran locally. Connected with bonjour and xmpp without issues.
Bugs closed: PIDGIN-17458
Reviewed at https://reviews.imfreedom.org/r/418/
--- a/ChangeLog.API Thu Jan 14 21:20:10 2021 -0600
+++ b/ChangeLog.API Thu Jan 14 22:33:49 2021 -0600
@@ -329,10 +329,12 @@
* purple_account_get_check_mail
* purple_account_get_password. Use
purple_credential_manager_read_password_async instead.
+ * purple_account_get_public_alias * purple_account_set_check_mail
+ * purple_account_set_current_error * purple_account_set_password. Use
purple_credential_manager_write_password_async instead.
- * purple_account_set_current_error
+ * purple_account_set_public_alias * purple_base64_*. Use g_base64_* instead
* purple_blist_get_ui_data
@@ -376,6 +378,8 @@
yourself. See GLib Main Event Loop docs.
* purple_fd_get_ip. Use GSocket instead.
+ * PurpleGetPublicAliasSuccessCallback + * PurpleGetPublicAliasFailureCallback * purple_get_host_name. Use g_get_host_name, instead.
* purple_get_tzoff_str(). Use g_date_time_format, instead.
* purple_ip_address_is_valid, purple_ipv4_address_is_valid, and
@@ -494,6 +498,8 @@
* purple_restore_default_signal_handlers
* purple_request_certificate
* purple_request_field_list_add
+ * PurpleSetPublicAliasFailureCallback + * PurpleSetPublicAliasSuccessCallback * purple_socket_get_family
* purple_socket_speaks_ipv4
--- a/doc/reference/libpurple/libpurple-docs.xml Thu Jan 14 21:20:10 2021 -0600
+++ b/doc/reference/libpurple/libpurple-docs.xml Thu Jan 14 22:33:49 2021 -0600
@@ -80,6 +80,7 @@
<xi:include href="xml/purpleprotocolim.xml" />
<xi:include href="xml/purpleprotocolmedia.xml" />
<xi:include href="xml/purpleprotocolprivacy.xml" />
+ <xi:include href="xml/purpleprotocolserver.xml" /> <xi:include href="xml/purplewhiteboard.xml" />
<xi:include href="xml/purplewhiteboardops.xml" />
<xi:include href="xml/purplewhiteboarduiops.xml" />
--- a/libpurple/account.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/account.c Thu Jan 14 22:33:49 2021 -0600
@@ -33,6 +33,7 @@
#include "purplecredentialmanager.h"
#include "purpleprivate.h"
#include "purpleprotocolclient.h"
+#include "purpleprotocolserver.h" @@ -428,42 +429,6 @@
purple_serv_set_info(gc, user_info);
-struct public_alias_closure
- PurpleAccount *account;
-set_public_alias_unsupported(gpointer data)
- struct public_alias_closure *closure = data;
- PurpleSetPublicAliasFailureCallback failure_cb = closure->failure_cb;
- failure_cb(closure->account,
- _("This protocol does not support setting a public alias."));
- g_object_unref(closure->account);
-get_public_alias_unsupported(gpointer data)
- struct public_alias_closure *closure = data;
- PurpleGetPublicAliasFailureCallback failure_cb = closure->failure_cb;
- failure_cb(closure->account,
- _("This protocol does not support fetching the public alias."));
- g_object_unref(closure->account);
delete_setting(void *data)
@@ -1842,56 +1807,6 @@
purple_accounts_schedule_save();
-purple_account_set_public_alias(PurpleAccount *account,
- const char *alias, PurpleSetPublicAliasSuccessCallback success_cb,
- PurpleSetPublicAliasFailureCallback failure_cb)
- PurpleProtocol *protocol = NULL;
- g_return_if_fail(PURPLE_IS_ACCOUNT(account));
- g_return_if_fail(purple_account_is_connected(account));
- gc = purple_account_get_connection(account);
- protocol = purple_connection_get_protocol(gc);
- if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, set_public_alias))
- purple_protocol_server_iface_set_public_alias(protocol, gc, alias, success_cb, failure_cb);
- struct public_alias_closure *closure =
- g_new0(struct public_alias_closure, 1);
- closure->account = g_object_ref(account);
- closure->failure_cb = failure_cb;
- g_timeout_add(0, set_public_alias_unsupported, closure);
-purple_account_get_public_alias(PurpleAccount *account,
- PurpleGetPublicAliasSuccessCallback success_cb,
- PurpleGetPublicAliasFailureCallback failure_cb)
- PurpleProtocol *protocol = NULL;
- g_return_if_fail(PURPLE_IS_ACCOUNT(account));
- g_return_if_fail(purple_account_is_connected(account));
- gc = purple_account_get_connection(account);
- protocol = purple_connection_get_protocol(gc);
- if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, get_public_alias))
- purple_protocol_server_iface_get_public_alias(protocol, gc, success_cb, failure_cb);
- struct public_alias_closure *closure =
- g_new0(struct public_alias_closure, 1);
- closure->account = g_object_ref(account);
- closure->failure_cb = failure_cb;
- g_timeout_add(0, get_public_alias_unsupported, closure);
purple_account_get_silence_suppression(PurpleAccount *account)
@@ -2858,9 +2773,12 @@
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_add_buddy(protocol, gc, buddy,
- purple_buddy_get_group(buddy), message);
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + PurpleGroup *group = purple_buddy_get_group(buddy); + purple_protocol_server_add_buddy(PURPLE_PROTOCOL_SERVER(protocol), gc, + buddy, group, message); @@ -2881,16 +2799,9 @@
groups = g_list_append(groups, purple_buddy_get_group(buddy));
- if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, add_buddies))
- purple_protocol_server_iface_add_buddies(protocol, gc, buddies, groups, message);
- else if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, add_buddy)) {
- GList *curb = buddies, *curg = groups;
- while ((curb != NULL) && (curg != NULL)) {
- purple_protocol_server_iface_add_buddy(protocol, gc, curb->data, curg->data, message);
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_add_buddies(PURPLE_PROTOCOL_SERVER(protocol), + gc, buddies, groups, message); @@ -2907,8 +2818,10 @@
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_remove_buddy(protocol, gc, buddy, group);
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_remove_buddy(PURPLE_PROTOCOL_SERVER(protocol), @@ -2920,18 +2833,9 @@
protocol = purple_connection_get_protocol(gc);
- if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, remove_buddies))
- purple_protocol_server_iface_remove_buddies(protocol, gc, buddies, groups);
- while ((curb != NULL) && (curg != NULL)) {
- purple_account_remove_buddy(account, curb->data, curg->data);
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_remove_buddies(PURPLE_PROTOCOL_SERVER(protocol), @@ -2944,8 +2848,10 @@
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_remove_group(protocol, gc, group);
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_remove_group(PURPLE_PROTOCOL_SERVER(protocol), @@ -2966,8 +2872,10 @@
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_change_passwd(protocol, gc, orig_pw, new_pw);
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_change_passwd(PURPLE_PROTOCOL_SERVER(protocol), gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy)
--- a/libpurple/account.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/account.h Thu Jan 14 22:33:49 2021 -0600
@@ -53,10 +53,6 @@
typedef void (*PurpleAccountRequestAuthorizationCb)(const char *response, void *data);
typedef void (*PurpleAccountRegistrationCb)(PurpleAccount *account, gboolean succeeded, void *user_data);
typedef void (*PurpleAccountUnregistrationCb)(PurpleAccount *account, gboolean succeeded, void *user_data);
-typedef void (*PurpleSetPublicAliasSuccessCallback)(PurpleAccount *account, const char *new_alias);
-typedef void (*PurpleSetPublicAliasFailureCallback)(PurpleAccount *account, const char *error);
-typedef void (*PurpleGetPublicAliasSuccessCallback)(PurpleAccount *account, const char *alias);
-typedef void (*PurpleGetPublicAliasFailureCallback)(PurpleAccount *account, const char *error);
@@ -462,41 +458,6 @@
const char *status_id, gboolean active, GHashTable *attrs);
- * purple_account_set_public_alias:
- * @account: The account
- * @alias: The new public alias for this account or %NULL
- * to unset the alias/nickname (or return it to
- * a protocol-specific "default", like the username)
- * @success_cb: (scope call): A callback which will be called if the alias
- * is successfully set on the server (or %NULL).
- * @failure_cb: (scope call): A callback which will be called if the alias
- * is not successfully set on the server (or %NULL).
- * Set a server-side (public) alias for this account. The account
- * must already be connected.
- * Currently, the public alias is not stored locally, although this
- * may change in a later version.
-void purple_account_set_public_alias(PurpleAccount *account,
- const char *alias, PurpleSetPublicAliasSuccessCallback success_cb,
- PurpleSetPublicAliasFailureCallback failure_cb);
- * purple_account_get_public_alias:
- * @account: The account
- * @success_cb: (scope call): A callback which will be called with the alias
- * @failure_cb: (scope call): A callback which will be called if the protocol is
- * unable to retrieve the server-side alias.
- * Fetch the server-side (public) alias for this account. The account
- * must already be connected.
-void purple_account_get_public_alias(PurpleAccount *account,
- PurpleGetPublicAliasSuccessCallback success_cb,
- PurpleGetPublicAliasFailureCallback failure_cb);
* purple_account_get_silence_suppression:
--- a/libpurple/buddyicon.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/buddyicon.c Thu Jan 14 22:33:49 2021 -0600
@@ -25,6 +25,7 @@
#include "purpleprivate.h"
+#include "purpleprotocolserver.h" /* NOTE: Instances of this struct are allocated without zeroing the memory, so
@@ -757,8 +758,10 @@
gc = purple_account_get_connection(account);
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_set_buddy_icon(protocol, gc, img);
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_set_buddy_icon(PURPLE_PROTOCOL_SERVER(protocol), --- a/libpurple/connection.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/connection.c Thu Jan 14 22:33:49 2021 -0600
@@ -33,6 +33,7 @@
#include "purpleprivate.h"
+#include "purpleprotocolserver.h" #include "purpleprotocolfactory.h"
@@ -125,7 +126,8 @@
PurpleConnection *gc = data;
PurpleConnectionPrivate *priv = purple_connection_get_instance_private(gc);
- purple_protocol_server_iface_keepalive(priv->protocol, gc);
+ purple_protocol_server_keepalive(PURPLE_PROTOCOL_SERVER(priv->protocol), @@ -140,7 +142,7 @@
if (on && !priv->keepalive)
- int interval = purple_protocol_server_iface_get_keepalive_interval(priv->protocol);
+ int interval = purple_protocol_server_get_keepalive_interval(PURPLE_PROTOCOL_SERVER(priv->protocol)); purple_debug_info("connection", "Activating keepalive to %d seconds.", interval);
priv->keepalive = g_main_context_find_source_by_id(NULL, g_timeout_add_seconds(interval, send_keepalive, gc));
@@ -677,7 +679,7 @@
* it seems unlikely that the implementation will change, we just do that
* for now as a workaround for this API shortcoming.
- gint64 seconds_from_now = purple_protocol_server_iface_get_keepalive_interval(priv->protocol);
+ gint64 seconds_from_now = purple_protocol_server_get_keepalive_interval(PURPLE_PROTOCOL_SERVER(priv->protocol)); @@ -1038,7 +1040,8 @@
priv = purple_connection_get_instance_private(gc);
priv->wants_to_die = TRUE;
- purple_protocol_server_iface_register_user(protocol, account);
+ purple_protocol_server_register_user(PURPLE_PROTOCOL_SERVER(protocol), @@ -1051,7 +1054,7 @@
_purple_connection_new_unregister(PurpleAccount *account, const char *password,
- PurpleAccountUnregistrationCb cb, void *user_data)
+ PurpleAccountUnregistrationCb cb, gpointer user_data) /* Lots of copy/pasted code to avoid API changes. You might want to integrate that into the previous function when posssible. */
@@ -1073,7 +1076,8 @@
if (!purple_account_is_disconnected(account)) {
- purple_protocol_server_iface_unregister_user(protocol, account, cb, user_data);
+ purple_protocol_server_unregister_user(PURPLE_PROTOCOL_SERVER(protocol), + account, cb, user_data); @@ -1101,7 +1105,8 @@
purple_debug_info("connection", "Unregistering. gc = %p\n", gc);
- purple_protocol_server_iface_unregister_user(protocol, account, cb, user_data);
+ purple_protocol_server_unregister_user(PURPLE_PROTOCOL_SERVER(protocol), + account, cb, user_data); /**************************************************************************
--- a/libpurple/group.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/group.c Thu Jan 14 22:33:49 2021 -0600
@@ -24,6 +24,7 @@
#include "internal.h" /* TODO: we need to kill this */
#include "purpleprivate.h"
+#include "purpleprotocolserver.h" typedef struct _PurpleGroupPrivate PurpleGroupPrivate;
@@ -212,7 +213,9 @@
if(PURPLE_PROTOCOL_IMPLEMENTS(protocol, SERVER, rename_group)) {
- purple_protocol_server_iface_rename_group(protocol, gc, old_name, source, buddies);
+ purple_protocol_server_rename_group(PURPLE_PROTOCOL_SERVER(protocol), GList *cur, *groups = NULL;
--- a/libpurple/meson.build Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/meson.build Thu Jan 14 22:33:49 2021 -0600
@@ -65,6 +65,7 @@
'purpleprotocolprivacy.c',
+ 'purpleprotocolserver.c', 'purplewhiteboarduiops.c',
@@ -154,6 +155,7 @@
'purpleprotocolprivacy.h',
+ 'purpleprotocolserver.h', --- a/libpurple/protocol.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocol.c Thu Jan 14 22:33:49 2021 -0600
@@ -209,196 +209,3 @@
#undef DEFINE_PROTOCOL_FUNC_WITH_RETURN
#undef DEFINE_PROTOCOL_FUNC
-/**************************************************************************
- * Protocol Server Interface API
- **************************************************************************/
-#define DEFINE_PROTOCOL_FUNC(protocol,funcname,...) \
- PurpleProtocolServerInterface *server_iface = \
- PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol); \
- if (server_iface && server_iface->funcname) \
- server_iface->funcname(__VA_ARGS__);
-#define DEFINE_PROTOCOL_FUNC_WITH_RETURN(protocol,defaultreturn,funcname,...) \
- PurpleProtocolServerInterface *server_iface = \
- PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol); \
- if (server_iface && server_iface->funcname) \
- return server_iface->funcname(__VA_ARGS__); \
-purple_protocol_server_iface_get_type(void)
- if (G_UNLIKELY(type == 0)) {
- static const GTypeInfo info = {
- .class_size = sizeof(PurpleProtocolServerInterface),
- type = g_type_register_static(G_TYPE_INTERFACE,
- "PurpleProtocolServerInterface", &info, 0);
-purple_protocol_server_iface_register_user(PurpleProtocol *protocol,
- PurpleAccount *account)
- DEFINE_PROTOCOL_FUNC(protocol, register_user, account);
-purple_protocol_server_iface_unregister_user(PurpleProtocol *protocol,
- PurpleAccount *account, PurpleAccountUnregistrationCb cb,
- DEFINE_PROTOCOL_FUNC(protocol, unregister_user, account, cb, user_data);
-purple_protocol_server_iface_set_info(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *info)
- DEFINE_PROTOCOL_FUNC(protocol, set_info, gc, info);
-purple_protocol_server_iface_get_info(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *who)
- DEFINE_PROTOCOL_FUNC(protocol, get_info, gc, who);
-purple_protocol_server_iface_set_status(PurpleProtocol *protocol,
- PurpleAccount *account, PurpleStatus *status)
- DEFINE_PROTOCOL_FUNC(protocol, set_status, account, status);
-purple_protocol_server_iface_set_idle(PurpleProtocol *protocol,
- PurpleConnection *gc, int idletime)
- DEFINE_PROTOCOL_FUNC(protocol, set_idle, gc, idletime);
-purple_protocol_server_iface_change_passwd(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *old_pass, const char *new_pass)
- DEFINE_PROTOCOL_FUNC(protocol, change_passwd, gc, old_pass, new_pass);
-purple_protocol_server_iface_add_buddy(PurpleProtocol *protocol,
- PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group,
- DEFINE_PROTOCOL_FUNC(protocol, add_buddy, gc, buddy, group, message);
-purple_protocol_server_iface_add_buddies(PurpleProtocol *protocol,
- PurpleConnection *gc, GList *buddies, GList *groups,
- DEFINE_PROTOCOL_FUNC(protocol, add_buddies, gc, buddies, groups, message);
-purple_protocol_server_iface_remove_buddy(PurpleProtocol *protocol,
- PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
- DEFINE_PROTOCOL_FUNC(protocol, remove_buddy, gc, buddy, group);
-purple_protocol_server_iface_remove_buddies(PurpleProtocol *protocol,
- PurpleConnection *gc, GList *buddies, GList *groups)
- DEFINE_PROTOCOL_FUNC(protocol, remove_buddies, gc, buddies, groups);
-purple_protocol_server_iface_keepalive(PurpleProtocol *protocol,
- DEFINE_PROTOCOL_FUNC(protocol, keepalive, gc);
-purple_protocol_server_iface_get_keepalive_interval(PurpleProtocol *protocol)
- DEFINE_PROTOCOL_FUNC_WITH_RETURN(protocol, 30, get_keepalive_interval);
-purple_protocol_server_iface_alias_buddy(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *who, const char *alias)
- DEFINE_PROTOCOL_FUNC(protocol, alias_buddy, gc, who, alias);
-purple_protocol_server_iface_group_buddy(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *who, const char *old_group,
- DEFINE_PROTOCOL_FUNC(protocol, group_buddy, gc, who, old_group, new_group);
-purple_protocol_server_iface_rename_group(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *old_name, PurpleGroup *group,
- DEFINE_PROTOCOL_FUNC(protocol, rename_group, gc, old_name, group,
-purple_protocol_server_iface_set_buddy_icon(PurpleProtocol *protocol,
- PurpleConnection *gc, PurpleImage *img)
- DEFINE_PROTOCOL_FUNC(protocol, set_buddy_icon, gc, img);
-purple_protocol_server_iface_remove_group(PurpleProtocol *protocol,
- PurpleConnection *gc, PurpleGroup *group)
- DEFINE_PROTOCOL_FUNC(protocol, remove_group, gc, group);
-purple_protocol_server_iface_send_raw(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *buf, int len)
- DEFINE_PROTOCOL_FUNC_WITH_RETURN(protocol, 0, send_raw, gc, buf, len);
-purple_protocol_server_iface_set_public_alias(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *alias,
- PurpleSetPublicAliasSuccessCallback success_cb,
- PurpleSetPublicAliasFailureCallback failure_cb)
- DEFINE_PROTOCOL_FUNC(protocol, set_public_alias, gc, alias, success_cb,
-purple_protocol_server_iface_get_public_alias(PurpleProtocol *protocol,
- PurpleConnection *gc, PurpleGetPublicAliasSuccessCallback success_cb,
- PurpleGetPublicAliasFailureCallback failure_cb)
- DEFINE_PROTOCOL_FUNC(protocol, get_public_alias, gc, success_cb,
-#undef DEFINE_PROTOCOL_FUNC_WITH_RETURN
-#undef DEFINE_PROTOCOL_FUNC
--- a/libpurple/protocol.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocol.h Thu Jan 14 22:33:49 2021 -0600
@@ -138,144 +138,6 @@
void (*_purple_reserved4)(void);
-#define PURPLE_TYPE_PROTOCOL_SERVER (purple_protocol_server_iface_get_type())
-typedef struct _PurpleProtocolServerInterface PurpleProtocolServerInterface;
- * PurpleProtocolServerInterface:
- * @register_user: New user registration
- * @unregister_user: Remove the user from the server. The account can either be
- * connected or disconnected. After the removal is finished,
- * the connection will stay open and has to be closed!
- * @get_info: Should arrange for purple_notify_userinfo() to be called
- * with @who's user info.
- * @add_buddy: Add a buddy to a group on the server.
- * <sbr/>This protocol function may be called in situations in
- * which the buddy is already in the specified group. If the
- * protocol supports authorization and the user is not already
- * authorized to see the status of @buddy, @add_buddy should
- * request authorization.
- * <sbr/>If authorization is required, then use the supplied
- * @keepalive: If implemented, this will be called regularly for this
- * protocol's active connections. You'd want to do this if you
- * need to repeatedly send some kind of keepalive packet to
- * the server to avoid being disconnected. ("Regularly" is
- * defined to be 30 unless @get_keepalive_interval is
- * implemented to override it).
- * <filename>libpurple/connection.c</filename>.)
- * @get_keepalive_interval: If implemented, this will override the default
- * @alias_buddy: Save/store buddy's alias on server list/roster
- * @group_buddy: Change a buddy's group on a server list/roster
- * @rename_group: Rename a group on a server list/roster
- * @set_buddy_icon: Set the buddy icon for the given connection to @img. The
- * protocol does <emphasis>NOT</emphasis> own a reference to
- * @img; if it needs one, it must #g_object_ref(@img)
- * @send_raw: For use in plugins that may understand the underlying
- * @set_public_alias: Set the user's "friendly name" (or alias or nickname or
- * whatever term you want to call it) on the server. The
- * protocol should call @success_cb or @failure_cb
- * <emphasis>asynchronously</emphasis> (if it knows
- * immediately that the set will fail, call one of the
- * callbacks from an idle/0-second timeout) depending on if
- * the nickname is set successfully. See
- * purple_account_set_public_alias().
- * <sbr/>@gc: The connection for which to set an alias
- * <sbr/>@alias: The new server-side alias/nickname for this
- * account, or %NULL to unset the
- * alias/nickname (or return it to a
- * protocol-specific "default").
- * <sbr/>@success_cb: Callback to be called if the public
- * <sbr/>@failure_cb: Callback to be called if setting the
- * @get_public_alias: Retrieve the user's "friendly name" as set on the server.
- * The protocol should call @success_cb or @failure_cb
- * <emphasis>asynchronously</emphasis> (even if it knows
- * immediately that the get will fail, call one of the
- * callbacks from an idle/0-second timeout) depending on if
- * the nickname is retrieved. See
- * purple_account_get_public_alias().
- * <sbr/>@gc: The connection for which to retireve
- * <sbr/>@success_cb: Callback to be called with the
- * <sbr/>@failure_cb: Callback to be called if the protocol
- * is unable to retrieve the alias
- * The protocol server interface.
- * This interface provides a gateway between purple and the protocol's server.
-struct _PurpleProtocolServerInterface
- GTypeInterface parent_iface;
- void (*register_user)(PurpleAccount *account);
- void (*unregister_user)(PurpleAccount *account, PurpleAccountUnregistrationCb cb,
- void (*set_info)(PurpleConnection *connection, const char *info);
- void (*get_info)(PurpleConnection *connection, const char *who);
- void (*set_status)(PurpleAccount *account, PurpleStatus *status);
- void (*set_idle)(PurpleConnection *connection, int idletime);
- void (*change_passwd)(PurpleConnection *connection, const char *old_pass,
- void (*add_buddy)(PurpleConnection *pc, PurpleBuddy *buddy,
- PurpleGroup *group, const char *message);
- void (*add_buddies)(PurpleConnection *pc, GList *buddies, GList *groups,
- void (*remove_buddy)(PurpleConnection *connection, PurpleBuddy *buddy,
- void (*remove_buddies)(PurpleConnection *connection, GList *buddies, GList *groups);
- void (*keepalive)(PurpleConnection *connection);
- int (*get_keepalive_interval)(void);
- void (*alias_buddy)(PurpleConnection *connection, const char *who,
- void (*group_buddy)(PurpleConnection *connection, const char *who,
- const char *old_group, const char *new_group);
- void (*rename_group)(PurpleConnection *connection, const char *old_name,
- PurpleGroup *group, GList *moved_buddies);
- void (*set_buddy_icon)(PurpleConnection *connection, PurpleImage *img);
- void (*remove_group)(PurpleConnection *gc, PurpleGroup *group);
- int (*send_raw)(PurpleConnection *gc, const char *buf, int len);
- void (*set_public_alias)(PurpleConnection *gc, const char *alias,
- PurpleSetPublicAliasSuccessCallback success_cb,
- PurpleSetPublicAliasFailureCallback failure_cb);
- void (*get_public_alias)(PurpleConnection *gc,
- PurpleGetPublicAliasSuccessCallback success_cb,
- PurpleGetPublicAliasFailureCallback failure_cb);
-#define PURPLE_IS_PROTOCOL_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_PROTOCOL_SERVER))
-#define PURPLE_PROTOCOL_SERVER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), PURPLE_TYPE_PROTOCOL_SERVER, \
- PurpleProtocolServerInterface))
* PURPLE_PROTOCOL_IMPLEMENTS:
* @protocol: The protocol in which to check
@@ -388,104 +250,6 @@
const char *purple_protocol_class_list_icon(PurpleProtocol *protocol,
PurpleAccount *account, PurpleBuddy *buddy);
-/**************************************************************************/
-/* Protocol Server Interface API */
-/**************************************************************************/
- * purple_protocol_server_iface_get_type:
- * Returns: The #GType for the protocol server interface.
-GType purple_protocol_server_iface_get_type(void);
-void purple_protocol_server_iface_register_user(PurpleProtocol *protocol,
- PurpleAccount *account);
- * purple_protocol_server_iface_unregister_user:
-void purple_protocol_server_iface_unregister_user(PurpleProtocol *protocol,
- PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
-void purple_protocol_server_iface_set_info(PurpleProtocol *protocol, PurpleConnection *connection,
-void purple_protocol_server_iface_get_info(PurpleProtocol *protocol, PurpleConnection *connection,
-void purple_protocol_server_iface_set_status(PurpleProtocol *protocol,
- PurpleAccount *account, PurpleStatus *status);
-void purple_protocol_server_iface_set_idle(PurpleProtocol *protocol, PurpleConnection *connection,
-void purple_protocol_server_iface_change_passwd(PurpleProtocol *protocol,
- PurpleConnection *connection, const char *old_pass, const char *new_pass);
-void purple_protocol_server_iface_add_buddy(PurpleProtocol *protocol,
- PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group,
-void purple_protocol_server_iface_add_buddies(PurpleProtocol *protocol,
- PurpleConnection *pc, GList *buddies, GList *groups,
-void purple_protocol_server_iface_remove_buddy(PurpleProtocol *protocol,
- PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group);
-void purple_protocol_server_iface_remove_buddies(PurpleProtocol *protocol,
- PurpleConnection *connection, GList *buddies, GList *groups);
-void purple_protocol_server_iface_keepalive(PurpleProtocol *protocol,
- PurpleConnection *connection);
-int purple_protocol_server_iface_get_keepalive_interval(PurpleProtocol *protocol);
-void purple_protocol_server_iface_alias_buddy(PurpleProtocol *protocol,
- PurpleConnection *connection, const char *who, const char *alias);
-void purple_protocol_server_iface_group_buddy(PurpleProtocol *protocol,
- PurpleConnection *connection, const char *who, const char *old_group,
- const char *new_group);
-void purple_protocol_server_iface_rename_group(PurpleProtocol *protocol,
- PurpleConnection *connection, const char *old_name, PurpleGroup *group,
-void purple_protocol_server_iface_set_buddy_icon(PurpleProtocol *protocol,
- PurpleConnection *connection, PurpleImage *img);
-void purple_protocol_server_iface_remove_group(PurpleProtocol *protocol,
- PurpleConnection *gc, PurpleGroup *group);
-int purple_protocol_server_iface_send_raw(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *buf, int len);
- * purple_protocol_server_iface_set_public_alias:
- * @success_cb: (scope call):
- * @failure_cb: (scope call):
-void purple_protocol_server_iface_set_public_alias(PurpleProtocol *protocol,
- PurpleConnection *gc, const char *alias,
- PurpleSetPublicAliasSuccessCallback success_cb,
- PurpleSetPublicAliasFailureCallback failure_cb);
- * purple_protocol_server_iface_get_public_alias:
- * @success_cb: (scope call):
- * @failure_cb: (scope call):
-void purple_protocol_server_iface_get_public_alias(PurpleProtocol *protocol,
- PurpleConnection *gc, PurpleGetPublicAliasSuccessCallback success_cb,
- PurpleGetPublicAliasFailureCallback failure_cb);
-/**************************************************************************/
-/* Protocol Chat Interface API */
-/**************************************************************************/
#endif /* PURPLE_PROTOCOL_H */
--- a/libpurple/protocols.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols.c Thu Jan 14 22:33:49 2021 -0600
@@ -33,6 +33,7 @@
#include "purplecredentialmanager.h"
#include "purpleprotocolattention.h"
#include "purpleprotocolmedia.h"
+#include "purpleprotocolserver.h" @@ -311,8 +312,10 @@
- if (!purple_account_is_disconnected(account))
- purple_protocol_server_iface_set_status(protocol, account, new_status);
+ if(!purple_account_is_disconnected(account)) { + purple_protocol_server_set_status(PURPLE_PROTOCOL_SERVER(protocol), --- a/libpurple/protocols/bonjour/bonjour.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/bonjour/bonjour.c Thu Jan 14 22:33:49 2021 -0600
@@ -216,7 +216,8 @@
-bonjour_set_status(PurpleAccount *account, PurpleStatus *status)
+bonjour_set_status(PurpleProtocolServer *protocol_server, + PurpleAccount *account, PurpleStatus *status) @@ -258,7 +259,10 @@
* if there is no add_buddy callback.
-bonjour_fake_add_buddy(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group, const char *message) {
+bonjour_fake_add_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *pc, PurpleBuddy *buddy, + PurpleGroup *group, const gchar *message) purple_debug_error("bonjour", "Buddy '%s' manually added; removing. "
"Bonjour buddies must be discovered and not manually added.\n",
purple_buddy_get_name(buddy));
@@ -270,7 +274,11 @@
-static void bonjour_remove_buddy(PurpleConnection *pc, PurpleBuddy *buddy, PurpleGroup *group) {
+bonjour_remove_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *pc, PurpleBuddy *buddy, BonjourBuddy *bb = purple_buddy_get_protocol_data(buddy);
bonjour_buddy_delete(bb);
@@ -329,7 +337,8 @@
-bonjour_set_buddy_icon(PurpleConnection *conn, PurpleImage *img)
+bonjour_set_buddy_icon(PurpleProtocolServer *protocol_server, + PurpleConnection *conn, PurpleImage *img) BonjourData *bd = purple_connection_get_protocol_data(conn);
bonjour_dns_sd_update_buddy_icon(bd->dns_sd_data);
@@ -439,18 +448,22 @@
-bonjour_group_buddy(PurpleConnection *connection, const char *who, const char *old_group, const char *new_group)
+bonjour_group_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, const gchar *who, + const gchar *old_group, const gchar *new_group) PurpleBuddy *buddy = purple_blist_find_buddy(purple_connection_get_account(connection), who);
bonjour_do_group_change(buddy, new_group);
-bonjour_rename_group(PurpleConnection *connection, const char *old_name, PurpleGroup *group, GList *moved_buddies)
+bonjour_rename_group(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + const gchar *old_name, PurpleGroup *group,
+ const gchar *new_group; new_group = purple_group_get_name(group);
--- a/libpurple/protocols/facebook/facebook.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/facebook/facebook.c Thu Jan 14 22:33:49 2021 -0600
@@ -1167,7 +1167,8 @@
-fb_server_set_status(PurpleAccount *acct, PurpleStatus *status)
+fb_server_set_status(PurpleProtocolServer *protocol_server, + PurpleAccount *acct, PurpleStatus *status) @@ -1584,7 +1585,7 @@
-facebook_protocol_server_iface_init(PurpleProtocolServerInterface *iface)
+facebook_protocol_server_init(PurpleProtocolServerInterface *iface) iface->set_status = fb_server_set_status;
@@ -1621,7 +1622,7 @@
G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CLIENT,
facebook_protocol_client_iface_init)
G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_SERVER,
- facebook_protocol_server_iface_init)
+ facebook_protocol_server_init) G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_IM,
facebook_protocol_im_iface_init)
G_IMPLEMENT_INTERFACE_DYNAMIC(PURPLE_TYPE_PROTOCOL_CHAT,
--- a/libpurple/protocols/gg/avatar.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/avatar.c Thu Jan 14 22:33:49 2021 -0600
@@ -286,7 +286,8 @@
-ggp_avatar_own_set(PurpleConnection *gc, PurpleImage *img)
+ggp_avatar_own_set(PurpleProtocolServer *protocol_server, PurpleConnection *gc, ggp_avatar_session_data *avdata;
--- a/libpurple/protocols/gg/avatar.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/avatar.h Thu Jan 14 22:33:49 2021 -0600
@@ -41,6 +41,6 @@
void ggp_avatar_buddy_update(PurpleConnection *gc, uin_t uin, time_t timestamp);
void ggp_avatar_buddy_remove(PurpleConnection *gc, uin_t uin);
-void ggp_avatar_own_set(PurpleConnection *gc, PurpleImage *img);
+void ggp_avatar_own_set(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleImage *img); #endif /* PURPLE_GG_AVATAR_H */
--- a/libpurple/protocols/gg/gg.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/gg.c Thu Jan 14 22:33:49 2021 -0600
@@ -889,7 +889,9 @@
return 1; /* wait 1 second before another notification */
-static void ggp_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group, const char *message)
+ggp_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + PurpleBuddy *buddy, PurpleGroup *group, const gchar *message) PurpleAccount *account = purple_connection_get_account(gc);
GGPInfo *info = purple_connection_get_protocol_data(gc);
@@ -901,21 +903,22 @@
if (purple_strequal(purple_account_get_username(account), name))
ggp_status_fake_to_self(gc);
- ggp_roster_add_buddy(gc, buddy, group, message);
+ ggp_roster_add_buddy(protocol_server, gc, buddy, group, message); ggp_pubdir_request_buddy_alias(gc, buddy);
-static void ggp_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
+ggp_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + PurpleBuddy *buddy, PurpleGroup *group) GGPInfo *info = purple_connection_get_protocol_data(gc);
gg_remove_notify(info->session, ggp_str_to_uin(purple_buddy_get_name(buddy)));
- ggp_roster_remove_buddy(gc, buddy, group);
+ ggp_roster_remove_buddy(protocol_server, gc, buddy, group); -static void ggp_keepalive(PurpleConnection *gc)
+ggp_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *gc) { GGPInfo *info = purple_connection_get_protocol_data(gc);
/* purple_debug_info("gg", "Keeping connection alive....\n"); */
--- a/libpurple/protocols/gg/pubdir-prpl.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/pubdir-prpl.c Thu Jan 14 22:33:49 2021 -0600
@@ -406,7 +406,8 @@
-ggp_pubdir_get_info_protocol(PurpleConnection *gc, const char *name)
+ggp_pubdir_get_info_protocol(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *name) uin_t uin = ggp_str_to_uin(name);
uin_t *uin_p = g_new0(uin_t, 1);
@@ -606,7 +607,7 @@
ggp_pubdir_search_results_info(PurpleConnection *gc, GList *row, gpointer _form)
- ggp_pubdir_get_info_protocol(gc, g_list_nth_data(row, 0));
+ ggp_pubdir_get_info_protocol(NULL, gc, g_list_nth_data(row, 0)); --- a/libpurple/protocols/gg/pubdir-prpl.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/pubdir-prpl.h Thu Jan 14 22:33:49 2021 -0600
@@ -62,7 +62,7 @@
void ggp_pubdir_get_info(PurpleConnection *gc, uin_t uin,
ggp_pubdir_request_cb cb, void *user_data);
-void ggp_pubdir_get_info_protocol(PurpleConnection *gc, const char *name);
+void ggp_pubdir_get_info_protocol(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const char *name); void ggp_pubdir_request_buddy_alias(PurpleConnection *gc, PurpleBuddy *buddy);
void ggp_pubdir_search(PurpleConnection *gc,
--- a/libpurple/protocols/gg/roster.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/roster.c Thu Jan 14 22:33:49 2021 -0600
@@ -341,8 +341,10 @@
******************************************************************************/
-void ggp_roster_alias_buddy(PurpleConnection *gc, const char *who,
+ggp_roster_alias_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *who, @@ -360,8 +362,10 @@
ggp_roster_set_synchronized(gc, buddy, FALSE);
-void ggp_roster_group_buddy(PurpleConnection *gc, const char *who,
- const char *old_group, const char *new_group)
+ggp_roster_group_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *who, + const gchar *old_group, const gchar *new_group) ggp_roster_session_data *rdata = ggp_roster_get_rdata(gc);
ggp_roster_change *change;
@@ -382,8 +386,10 @@
rdata->pending_updates = g_list_append(rdata->pending_updates, change);
-void ggp_roster_rename_group(PurpleConnection *gc, const char *old_name,
- PurpleGroup *group, GList *moved_buddies)
+ggp_roster_rename_group(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *old_name, + PurpleGroup *group, GList *moved_buddies) ggp_roster_session_data *rdata = ggp_roster_get_rdata(gc);
ggp_roster_change *change;
@@ -399,8 +405,10 @@
rdata->pending_updates = g_list_append(rdata->pending_updates, change);
-void ggp_roster_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
- PurpleGroup *group, const char *message)
+ggp_roster_add_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleBuddy *buddy, + PurpleGroup *group, const gchar *message) g_return_if_fail(gc != NULL);
g_return_if_fail(buddy != NULL);
@@ -411,8 +419,10 @@
ggp_roster_set_synchronized(gc, buddy, FALSE);
-void ggp_roster_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
+ggp_roster_remove_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleBuddy *buddy, ggp_roster_session_data *rdata = ggp_roster_get_rdata(gc);
ggp_roster_change *change;
--- a/libpurple/protocols/gg/roster.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/roster.h Thu Jan 14 22:33:49 2021 -0600
@@ -59,15 +59,15 @@
struct gg_event_userlist100_version *version);
/* libpurple callbacks */
-void ggp_roster_alias_buddy(PurpleConnection *gc, const char *who,
+void ggp_roster_alias_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const char *who, -void ggp_roster_group_buddy(PurpleConnection *gc, const char *who,
+void ggp_roster_group_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const char *who, const char *old_group, const char *new_group);
-void ggp_roster_rename_group(PurpleConnection *, const char *old_name,
+void ggp_roster_rename_group(PurpleProtocolServer *protocol_server, PurpleConnection *, const char *old_name, PurpleGroup *group, GList *moved_buddies);
-void ggp_roster_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
+void ggp_roster_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group, const char *message);
-void ggp_roster_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
+void ggp_roster_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleBuddy *buddy, #endif /* PURPLE_GG_ROSTER_H */
--- a/libpurple/protocols/gg/status.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/status.c Thu Jan 14 22:33:49 2021 -0600
@@ -249,7 +249,9 @@
-void ggp_status_set_purplestatus(PurpleAccount *account, PurpleStatus *status)
+ggp_status_set_purplestatus(PurpleProtocolServer *protocol_server, + PurpleAccount *account, PurpleStatus *status) @@ -330,7 +332,7 @@
ggp_status_get_ssdata(gc)->status_broadcasting = broadcasting;
purple_account_set_bool(account, "status_broadcasting", broadcasting);
- ggp_status_set_purplestatus(account,
+ ggp_status_set_purplestatus(NULL, account, purple_account_get_active_status(account));
--- a/libpurple/protocols/gg/status.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/gg/status.h Thu Jan 14 22:33:49 2021 -0600
@@ -48,7 +48,7 @@
void ggp_status_set_initial(PurpleConnection *gc, struct gg_login_params *glp);
gboolean ggp_status_set(PurpleAccount *account, int status, const gchar* msg);
-void ggp_status_set_purplestatus(PurpleAccount *account, PurpleStatus *status);
+void ggp_status_set_purplestatus(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleStatus *status); void ggp_status_set_disconnected(PurpleAccount *account);
void ggp_status_fake_to_self(PurpleConnection *gc);
--- a/libpurple/protocols/irc/irc.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/irc/irc.c Thu Jan 14 22:33:49 2021 -0600
@@ -221,7 +221,9 @@
-static int irc_send_raw(PurpleConnection *gc, const char *buf, int len)
+irc_send_raw(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + const gchar *buf, gint len) struct irc_conn *irc = purple_connection_get_protocol_data(gc);
@@ -644,7 +646,9 @@
-static void irc_get_info(PurpleConnection *gc, const char *who)
+irc_get_info(PurpleProtocolServer *protocol_server, PurpleConnection *gc, struct irc_conn *irc = purple_connection_get_protocol_data(gc);
@@ -653,7 +657,9 @@
irc_cmd_whois(irc, "whois", NULL, args);
-static void irc_set_status(PurpleAccount *account, PurpleStatus *status)
+irc_set_status(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleConnection *gc = purple_account_get_connection(account);
@@ -678,7 +684,9 @@
-static void irc_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group, const char *message)
+irc_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + PurpleBuddy *buddy, PurpleGroup *group, const gchar *message) struct irc_conn *irc = purple_connection_get_protocol_data(gc);
@@ -703,7 +711,9 @@
-static void irc_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
+irc_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + PurpleBuddy *buddy, PurpleGroup *group) struct irc_conn *irc = purple_connection_get_protocol_data(gc);
@@ -936,8 +946,8 @@
-static void irc_keepalive(PurpleConnection *gc)
+irc_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *gc) { struct irc_conn *irc = purple_connection_get_protocol_data(gc);
if ((time(NULL) - irc->recv_time) > PING_TIMEOUT)
irc_cmd_ping(irc, NULL, NULL, NULL);
--- a/libpurple/protocols/irc/msgs.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/irc/msgs.c Thu Jan 14 22:33:49 2021 -0600
@@ -104,7 +104,7 @@
status = purple_account_get_active_status(irc->account);
if (purple_status_type_get_primitive(purple_status_get_status_type(status)) != PURPLE_STATUS_AVAILABLE) {
PurpleProtocol *protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_set_status(protocol, irc->account, status);
+ purple_protocol_server_set_status(PURPLE_PROTOCOL_SERVER(protocol), irc->account, status); /* this used to be in the core, but it's not now */
--- a/libpurple/protocols/jabber/buddy.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/buddy.c Thu Jan 14 22:33:49 2021 -0600
@@ -449,7 +449,9 @@
* Send vCard info to Jabber server
-void jabber_set_info(PurpleConnection *gc, const char *info)
+jabber_set_info(PurpleProtocolServer *protocol_server, PurpleConnection *gc, @@ -546,14 +548,16 @@
-void jabber_set_buddy_icon(PurpleConnection *gc, PurpleImage *img)
+jabber_set_buddy_icon(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleImage *img) PurpleAccount *account = purple_connection_get_account(gc);
/* Publish the avatar as specified in XEP-0084 */
jabber_avatar_set(purple_connection_get_protocol_data(gc), img);
/* Set the image in our vCard */
- jabber_set_info(gc, purple_account_get_user_info(account));
+ jabber_set_info(NULL, gc, purple_account_get_user_info(account)); /* TODO: Fake image to ourselves, since a number of servers do not echo
* back our presence to us. To do this without uselessly copying the data
@@ -902,7 +906,7 @@
- jabber_set_info(js->gc, purple_account_get_user_info(account));
+ jabber_set_info(NULL, js->gc, purple_account_get_user_info(account)); @@ -962,11 +966,12 @@
* it returns an error (namespaces trimmed):
* <error code="500" type="wait"><internal-server-error/></error>.
js->vcard_timer = g_timeout_add_seconds(10, set_own_vcard_cb,
- jabber_set_info(js->gc, purple_account_get_user_info(account));
+ jabber_set_info(NULL, js->gc, purple_account_get_user_info(account)); /* A photo is in the vCard. Advertise its hash */
js->avatar_hash = vcard_hash;
@@ -1619,7 +1624,9 @@
jbi->timeout_handle = g_timeout_add_seconds(30, jabber_buddy_get_info_timeout, jbi);
-void jabber_buddy_get_info(PurpleConnection *gc, const char *who)
+jabber_buddy_get_info(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const char *who) JabberStream *js = purple_connection_get_protocol_data(gc);
JabberID *jid = jabber_id_new(who);
--- a/libpurple/protocols/jabber/buddy.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/buddy.h Thu Jan 14 22:33:49 2021 -0600
@@ -103,13 +103,13 @@
JabberBuddyResource *jabber_buddy_track_resource(JabberBuddy *jb, const char *resource,
int priority, JabberBuddyState state, const char *status);
void jabber_buddy_remove_resource(JabberBuddy *jb, const char *resource);
-void jabber_buddy_get_info(PurpleConnection *gc, const char *who);
+void jabber_buddy_get_info(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const char *who); GList *jabber_blist_node_menu(PurpleProtocolClient *client, PurpleBlistNode *node);
-void jabber_set_info(PurpleConnection *gc, const char *info);
+void jabber_set_info(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const char *info); void jabber_setup_set_info(PurpleProtocolAction *action);
-void jabber_set_buddy_icon(PurpleConnection *gc, PurpleImage *img);
+void jabber_set_buddy_icon(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleImage *img); void jabber_user_search(JabberStream *js, const char *directory);
void jabber_user_search_begin(PurpleProtocolAction *);
--- a/libpurple/protocols/jabber/jabber.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/jabber.c Thu Jan 14 22:33:49 2021 -0600
@@ -95,7 +95,7 @@
/* setup the parser fresh for each stream */
- jabber_send_raw(js, open_stream, -1);
+ jabber_send_raw(NULL, js, open_stream, -1); @@ -225,7 +225,7 @@
* We request STARTTLS for standard XMPP connections, but we do nothing for insecure
* BOSH connections, per XEP-0206. */
+ jabber_send_raw(NULL, js, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1);
@@ -408,7 +408,9 @@
-void jabber_send_raw(JabberStream *js, const char *data, int len)
+jabber_send_raw(PurpleProtocolServer *protocol_server, JabberStream *js, + const gchar *data, gint len) @@ -514,7 +516,9 @@
do_jabber_send_raw(js, data, len);
-int jabber_protocol_send_raw(PurpleConnection *gc, const char *buf, int len)
+jabber_protocol_send_raw(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *buf, gint len) JabberStream *js = purple_connection_get_protocol_data(gc);
@@ -524,7 +528,7 @@
* to do things during the connection process.
- jabber_send_raw(js, buf, len);
+ jabber_send_raw(NULL, js, buf, len); return (len < 0 ? (int)strlen(buf) : len);
@@ -551,7 +555,7 @@
purple_strequal((*packet)->name, "presence"))
purple_xmlnode_set_namespace(*packet, NS_XMPP_CLIENT);
txt = purple_xmlnode_to_str(*packet, &len);
- jabber_send_raw(js, txt, len);
+ jabber_send_raw(NULL, js, txt, len); @@ -569,8 +573,8 @@
-void jabber_keepalive(PurpleConnection *gc)
+jabber_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *gc) { JabberStream *js = purple_connection_get_protocol_data(gc);
if (js->keepalive_timeout == 0) {
@@ -580,8 +584,8 @@
-static int jabber_get_keepalive_interval(void)
+jabber_get_keepalive_interval(PurpleProtocolServer *protocol_server) { @@ -731,7 +735,7 @@
g_io_stream_get_output_stream(js->stream));
if (js->state == JABBER_STREAM_CONNECTING) {
- jabber_send_raw(js, "<?xml version='1.0' ?>", -1);
+ jabber_send_raw(NULL, js, "<?xml version='1.0' ?>", -1); jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING);
@@ -1512,7 +1516,9 @@
-void jabber_register_account(PurpleAccount *account)
+jabber_register_account(PurpleProtocolServer *protocol_server, + PurpleAccount *account) @@ -1566,7 +1572,11 @@
-void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data) {
+jabber_unregister_account(PurpleProtocolServer *protocol_server, + PurpleAccount *account, + PurpleAccountUnregistrationCb cb, gpointer user_data) PurpleConnection *gc = purple_account_get_connection(account);
@@ -1771,7 +1781,9 @@
-void jabber_idle_set(PurpleConnection *gc, int idle)
+jabber_idle_set(PurpleProtocolServer *protocol_server, PurpleConnection *gc, JabberStream *js = purple_connection_get_protocol_data(gc);
@@ -2098,10 +2110,11 @@
js->inactivity_timer = 0;
jabber_bosh_connection_send_keepalive(js->bosh);
- jabber_send_raw(js, "\t", 1);
+ jabber_send_raw(NULL, js, "\t", 1); --- a/libpurple/protocols/jabber/jabber.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/jabber.h Thu Jan 14 22:33:49 2021 -0600
@@ -325,7 +325,7 @@
void jabber_stream_features_parse(JabberStream *js, PurpleXmlNode *packet);
void jabber_process_packet(JabberStream *js, PurpleXmlNode **packet);
void jabber_send(JabberStream *js, PurpleXmlNode *data);
-void jabber_send_raw(JabberStream *js, const char *data, int len);
+void jabber_send_raw(PurpleProtocolServer *protocol_server, JabberStream *js, const char *data, int len); void jabber_send_signal_cb(PurpleConnection *pc, PurpleXmlNode **packet,
@@ -404,23 +404,23 @@
GList *jabber_status_types(PurpleAccount *account);
void jabber_login(PurpleAccount *account);
void jabber_close(PurpleConnection *gc);
-void jabber_idle_set(PurpleConnection *gc, int idle);
+void jabber_idle_set(PurpleProtocolServer *protocol_server, PurpleConnection *gc, int idle); void jabber_blocklist_parse_push(JabberStream *js, const char *from,
JabberIqType type, const char *id,
void jabber_request_block_list(JabberStream *js);
void jabber_add_deny(PurpleProtocolPrivacy *privacy, PurpleConnection *gc, const char *who);
void jabber_remove_deny(PurpleProtocolPrivacy *privacy, PurpleConnection *gc, const char *who);
-void jabber_keepalive(PurpleConnection *gc);
+void jabber_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *gc); void jabber_register_gateway(JabberStream *js, const char *gateway);
-void jabber_register_account(PurpleAccount *account);
-void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
+void jabber_register_account(PurpleProtocolServer *protocol_server, PurpleAccount *account); +void jabber_unregister_account(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data); gboolean jabber_send_attention(PurpleProtocolAttention *attn, PurpleConnection *gc, const char *username, guint code);
GList *jabber_attention_types(PurpleProtocolAttention *attn, PurpleAccount *account);
void jabber_convo_closed(PurpleProtocolClient *client, PurpleConnection *gc, const char *who);
PurpleChat *jabber_find_blist_chat(PurpleProtocolClient *client, PurpleAccount *account, const char *name);
gboolean jabber_offline_message(PurpleProtocolClient *client, PurpleBuddy *buddy);
-int jabber_protocol_send_raw(PurpleConnection *gc, const char *buf, int len);
+int jabber_protocol_send_raw(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const char *buf, int len); GList *jabber_get_actions(PurpleProtocolClient *client, PurpleConnection *gc);
gboolean jabber_audio_enabled(JabberStream *js, const char *unused);
--- a/libpurple/protocols/jabber/presence.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/presence.c Thu Jan 14 22:33:49 2021 -0600
@@ -140,7 +140,9 @@
-void jabber_set_status(PurpleAccount *account, PurpleStatus *status)
+jabber_set_status(PurpleProtocolServer *protocol_server, + PurpleAccount *account, PurpleStatus *status) --- a/libpurple/protocols/jabber/presence.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/presence.h Thu Jan 14 22:33:49 2021 -0600
@@ -84,7 +84,7 @@
void jabber_presence_init(void);
void jabber_presence_uninit(void);
-void jabber_set_status(PurpleAccount *account, PurpleStatus *status);
+void jabber_set_status(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleStatus *status); * Send a full presence stanza.
--- a/libpurple/protocols/jabber/roster.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/roster.c Thu Jan 14 22:33:49 2021 -0600
@@ -351,8 +351,10 @@
-void jabber_roster_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
- PurpleGroup *group, const char *message)
+jabber_roster_add_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleBuddy *buddy, + PurpleGroup *group, const gchar *message) JabberStream *js = purple_connection_get_protocol_data(gc);
@@ -415,7 +417,10 @@
-void jabber_roster_alias_change(PurpleConnection *gc, const char *name, const char *alias)
+jabber_roster_alias_change(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *name, PurpleBuddy *b = purple_blist_find_buddy(purple_connection_get_account(gc), name);
@@ -429,8 +434,10 @@
-void jabber_roster_group_change(PurpleConnection *gc, const char *name,
- const char *old_group, const char *new_group)
+jabber_roster_group_change(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *name, + const gchar *old_group, const gchar *new_group) GSList *buddies, *groups = NULL;
@@ -449,19 +456,28 @@
jabber_roster_update(purple_connection_get_protocol_data(gc), name, groups);
-void jabber_roster_group_rename(PurpleConnection *gc, const char *old_name,
- PurpleGroup *group, GList *moved_buddies)
+jabber_roster_group_rename(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *old_name, + PurpleGroup *group, GList *moved_buddies) const char *gname = jabber_roster_group_get_global_name(group);
for(l = moved_buddies; l; l = l->next) {
PurpleBuddy *buddy = l->data;
- jabber_roster_group_change(gc, purple_buddy_get_name(buddy), old_name, gname);
+ jabber_roster_group_change(protocol_server, gc, + purple_buddy_get_name(buddy), old_name, -void jabber_roster_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
+jabber_roster_remove_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleBuddy *buddy, const char *name = purple_buddy_get_name(buddy);
GSList *buddies = purple_blist_find_buddies(purple_connection_get_account(gc), name);
--- a/libpurple/protocols/jabber/roster.h Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/jabber/roster.h Thu Jan 14 22:33:49 2021 -0600
@@ -35,15 +35,15 @@
void jabber_roster_parse(JabberStream *js, const char *from,
JabberIqType type, const char *id, PurpleXmlNode *query);
-void jabber_roster_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
- PurpleGroup *group, const char *message);
-void jabber_roster_alias_change(PurpleConnection *gc, const char *name,
-void jabber_roster_group_change(PurpleConnection *gc, const char *name,
- const char *old_group, const char *new_group);
-void jabber_roster_group_rename(PurpleConnection *gc, const char *old_name,
+void jabber_roster_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleBuddy *buddy, + PurpleGroup *group, const gchar *message); +void jabber_roster_alias_change(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const gchar *name, +void jabber_roster_group_change(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const gchar *name, + const gchar *old_group, const gchar *new_group); +void jabber_roster_group_rename(PurpleProtocolServer *protocol_server, PurpleConnection *gc, const gchar *old_name, PurpleGroup *group, GList *moved_buddies);
-void jabber_roster_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
+void jabber_roster_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleBuddy *buddy, --- a/libpurple/protocols/novell/novell.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/novell/novell.c Thu Jan 14 22:33:49 2021 -0600
@@ -2557,7 +2557,8 @@
-novell_add_buddy(PurpleConnection * gc, PurpleBuddy *buddy, PurpleGroup * group, const char *message)
+novell_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + PurpleBuddy *buddy, PurpleGroup * group, const gchar *message) @@ -2620,7 +2621,9 @@
-novell_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
+novell_remove_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleBuddy *buddy, @@ -2655,7 +2658,8 @@
-novell_remove_group(PurpleConnection * gc, PurpleGroup *group)
+novell_remove_group(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleGroup *group) @@ -2676,7 +2680,8 @@
-novell_alias_buddy(PurpleConnection * gc, const char *name, const char *alias)
+novell_alias_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + const gchar *name, const gchar *alias) @@ -2732,9 +2737,9 @@
-novell_group_buddy(PurpleConnection * gc,
- const char *name, const char *old_group_name,
- const char *new_group_name)
+novell_group_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *name, + const gchar *old_group_name, const gchar *new_group_name) @@ -2794,7 +2799,8 @@
-novell_rename_group(PurpleConnection * gc, const char *old_name,
+novell_rename_group(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *old_name, PurpleGroup *group, GList *moved_buddies)
@@ -2894,7 +2900,8 @@
-novell_set_idle(PurpleConnection * gc, int time)
+novell_set_idle(PurpleProtocolServer *protocol_server, PurpleConnection *gc, @@ -2924,7 +2931,8 @@
-novell_get_info(PurpleConnection * gc, const char *name)
+novell_get_info(PurpleProtocolServer *protocol_server, PurpleConnection * gc, NMUserRecord *user_record;
@@ -3020,7 +3028,8 @@
-novell_set_status(PurpleAccount *account, PurpleStatus *status)
+novell_set_status(PurpleProtocolServer *protocol_server, + PurpleAccount *account, PurpleStatus *status) @@ -3477,8 +3486,7 @@
-novell_keepalive(PurpleConnection *gc)
+novell_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *gc) { --- a/libpurple/protocols/null/nullprpl.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/null/nullprpl.c Thu Jan 14 22:33:49 2021 -0600
@@ -458,7 +458,10 @@
-static void null_set_info(PurpleConnection *gc, const char *info) {
+null_set_info(PurpleProtocolServer *protocol_server, PurpleConnection *gc, purple_debug_info("nullprpl", "setting %s's user info to %s\n",
purple_account_get_username(purple_connection_get_account(gc)), info);
@@ -496,7 +499,10 @@
-static void null_get_info(PurpleConnection *gc, const char *username) {
+null_get_info(PurpleProtocolServer *protocol_server, PurpleConnection *gc, PurpleNotifyUserInfo *info = purple_notify_user_info_new();
@@ -529,7 +535,10 @@
NULL); /* userdata for callback */
-static void null_set_status(PurpleAccount *acct, PurpleStatus *status) {
+null_set_status(PurpleProtocolServer *protocol_server, PurpleAccount *acct, const char *msg = purple_status_get_attr_string(status, "message");
purple_debug_info("nullprpl", "setting %s's status to %s: %s\n",
purple_account_get_username(acct), purple_status_get_name(status), msg);
@@ -538,20 +547,26 @@
-static void null_set_idle(PurpleConnection *gc, int idletime) {
+null_set_idle(PurpleProtocolServer *protocol_server, PurpleConnection *gc, purple_debug_info("nullprpl",
"purple reports that %s has been idle for %d seconds\n",
purple_account_get_username(purple_connection_get_account(gc)), idletime);
-static void null_change_passwd(PurpleConnection *gc, const char *old_pass,
- const char *new_pass) {
+null_change_passwd(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + const gchar *old_pass, const gchar *new_pass) purple_debug_info("nullprpl", "%s wants to change their password\n",
purple_account_get_username(purple_connection_get_account(gc)));
-static void null_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
- PurpleGroup *group, const char *message)
+null_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + PurpleBuddy *buddy, PurpleGroup *group, const gchar *message) const char *username = purple_account_get_username(purple_connection_get_account(gc));
PurpleConnection *buddy_gc = get_null_gc(purple_buddy_get_name(buddy));
@@ -579,38 +594,44 @@
-static void null_add_buddies(PurpleConnection *gc, GList *buddies,
- GList *groups, const char *message) {
+null_add_buddies(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + GList *buddies, GList *groups, const gchar *message) purple_debug_info("nullprpl", "adding multiple buddies\n");
- null_add_buddy(gc, (PurpleBuddy *)buddy->data, (PurpleGroup *)group->data, message);
+ null_add_buddy(protocol_server, gc, PURPLE_BUDDY(buddy->data), + PURPLE_GROUP(group->data), message); buddy = g_list_next(buddy);
group = g_list_next(group);
-static void null_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
+null_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *gc, + PurpleBuddy *buddy, PurpleGroup *group) purple_debug_info("nullprpl", "removing %s from %s's buddy list\n",
purple_buddy_get_name(buddy),
purple_account_get_username(purple_connection_get_account(gc)));
-static void null_remove_buddies(PurpleConnection *gc, GList *buddies,
+null_remove_buddies(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, GList *buddies, GList *groups) purple_debug_info("nullprpl", "removing multiple buddies\n");
- null_remove_buddy(gc, (PurpleBuddy *)buddy->data,
- (PurpleGroup *)group->data);
+ null_remove_buddy(protocol_server, gc, PURPLE_BUDDY(buddy->data), + PURPLE_GROUP(group->data)); buddy = g_list_next(buddy);
group = g_list_next(group);
@@ -833,26 +854,35 @@
-static void null_register_user(PurpleAccount *acct) {
+null_register_user(PurpleProtocolServer *protocol_server, PurpleAccount *acct) { purple_debug_info("nullprpl", "registering account for %s\n",
purple_account_get_username(acct));
-static void null_alias_buddy(PurpleConnection *gc, const char *who,
+null_alias_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *who, purple_debug_info("nullprpl", "%s sets %s's alias to %s\n",
purple_account_get_username(purple_connection_get_account(gc)), who, alias);
-static void null_group_buddy(PurpleConnection *gc, const char *who,
- const char *new_group) {
+null_group_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *who, + const gchar *old_group, const gchar *new_group) purple_debug_info("nullprpl", "%s has moved %s from group %s to group %s\n",
purple_account_get_username(purple_connection_get_account(gc)), who, old_group, new_group);
-static void null_rename_group(PurpleConnection *gc, const char *old_name,
- PurpleGroup *group, GList *moved_buddies) {
+null_rename_group(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *old_name, + PurpleGroup *group, GList *moved_buddies) purple_debug_info("nullprpl", "%s has renamed group %s to %s\n",
purple_account_get_username(purple_connection_get_account(gc)), old_name,
purple_group_get_name(group));
@@ -876,14 +906,19 @@
-static void null_set_buddy_icon(PurpleConnection *gc,
+null_set_buddy_icon(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleImage *img) purple_debug_info("nullprpl", "setting %s's buddy icon to %s\n",
purple_account_get_username(purple_connection_get_account(gc)),
img ? purple_image_get_path(img) : "(null)");
-static void null_remove_group(PurpleConnection *gc, PurpleGroup *group) {
+null_remove_group(PurpleProtocolServer *protocol_server, PurpleConnection *gc, purple_debug_info("nullprpl", "%s has removed group %s\n",
purple_account_get_username(purple_connection_get_account(gc)),
purple_group_get_name(group));
--- a/libpurple/protocols/sametime/sametime.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/sametime/sametime.c Thu Jan 14 22:33:49 2021 -0600
@@ -1424,7 +1424,7 @@
-static void mw_protocol_set_status(PurpleAccount *acct, PurpleStatus *status);
+static void mw_protocol_set_status(PurpleProtocolServer *protocol_server, PurpleAccount *acct, PurpleStatus *status); /** called from mw_session_stateChange when the session's state is
@@ -1437,7 +1437,7 @@
/* set out initial status */
acct = purple_connection_get_account(pd->gc);
status = purple_account_get_active_status(acct);
- mw_protocol_set_status(acct, status);
+ mw_protocol_set_status(NULL, acct, status); /* start watching for new conversations */
purple_signal_connect(purple_conversations_get_handle(),
@@ -3824,8 +3824,10 @@
-static void mw_protocol_get_info(PurpleConnection *gc, const char *who) {
+mw_protocol_get_info(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *who) struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL };
struct mwPurpleProtocolData *pd;
@@ -3898,7 +3900,10 @@
-static void mw_protocol_set_status(PurpleAccount *acct, PurpleStatus *status) {
+mw_protocol_set_status(PurpleProtocolServer *protocol_server, + PurpleAccount *acct, PurpleStatus *status) @@ -3951,7 +3956,10 @@
-static void mw_protocol_set_idle(PurpleConnection *gc, int t) {
+mw_protocol_set_idle(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, gint t) struct mwSession *session;
struct mwUserStatus stat;
@@ -4125,11 +4133,11 @@
-static void mw_protocol_add_buddy(PurpleConnection *gc,
+mw_protocol_add_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleBuddy *buddy, + PurpleGroup *group, const gchar *message) struct mwPurpleProtocolData *pd = purple_connection_get_protocol_data(gc);
struct mwServiceResolve *srvc;
@@ -4173,7 +4181,9 @@
-static void mw_protocol_add_buddies(PurpleConnection *gc,
+mw_protocol_add_buddies(PurpleProtocolServer *protocol_server, @@ -4224,9 +4234,11 @@
-static void mw_protocol_remove_buddy(PurpleConnection *gc,
- PurpleBuddy *buddy, PurpleGroup *group) {
+mw_protocol_remove_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleBuddy *buddy, struct mwPurpleProtocolData *pd;
struct mwAwareIdBlock idb = { mwAware_USER, (char *)purple_buddy_get_name(buddy), NULL };
struct mwAwareList *list;
@@ -4527,7 +4539,10 @@
-static void mw_protocol_keepalive(PurpleConnection *gc) {
+mw_protocol_keepalive(PurpleProtocolServer *protocol_server, struct mwSession *session;
g_return_if_fail(gc != NULL);
@@ -4539,10 +4554,11 @@
-static void mw_protocol_alias_buddy(PurpleConnection *gc,
+mw_protocol_alias_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *who, struct mwPurpleProtocolData *pd = purple_connection_get_protocol_data(gc);
g_return_if_fail(pd != NULL);
@@ -4553,11 +4569,11 @@
-static void mw_protocol_group_buddy(PurpleConnection *gc,
- const char *new_group) {
+mw_protocol_group_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *who, + const gchar *old_group, const gchar *new_group) struct mwAwareIdBlock idb = { mwAware_USER, (char *) who, NULL };
GList *gl = g_list_prepend(NULL, &idb);
@@ -4582,11 +4598,11 @@
-static void mw_protocol_rename_group(PurpleConnection *gc,
+mw_protocol_rename_group(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, const gchar *old, + PurpleGroup *group, GList *buddies) struct mwPurpleProtocolData *pd = purple_connection_get_protocol_data(gc);
g_return_if_fail(pd != NULL);
@@ -4644,7 +4660,10 @@
-static void mw_protocol_remove_group(PurpleConnection *gc, PurpleGroup *group) {
+mw_protocol_remove_group(PurpleProtocolServer *protocol_server, + PurpleConnection *gc, PurpleGroup *group) struct mwPurpleProtocolData *pd;
struct mwAwareList *list;
--- a/libpurple/protocols/zephyr/zephyr.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/protocols/zephyr/zephyr.c Thu Jan 14 22:33:49 2021 -0600
@@ -1867,7 +1867,9 @@
-static void zephyr_zloc(PurpleConnection *gc, const char *who)
+zephyr_zloc(PurpleProtocolServer *protocol_server, PurpleConnection *gc, zephyr_account *zephyr = purple_connection_get_protocol_data(gc);
gchar* normalized_who = local_zephyr_normalize(zephyr,who);
@@ -1894,7 +1896,10 @@
-static void zephyr_set_status(PurpleAccount *account, PurpleStatus *status) {
+zephyr_set_status(PurpleProtocolServer *protocol_server, + PurpleAccount *account, PurpleStatus *status) PurpleConnection *gc = purple_account_get_connection(account);
zephyr_account *zephyr = purple_connection_get_protocol_data(gc);
PurpleStatusPrimitive primitive = purple_status_type_get_primitive(purple_status_get_status_type(status));
@@ -2230,7 +2235,7 @@
static PurpleCmdRet zephyr_purple_cmd_zlocate(PurpleConversation *conv,
const char *cmd, char **args, char **error, void *data)
- zephyr_zloc(purple_conversation_get_connection(conv),args[0]);
+ zephyr_zloc(NULL, purple_conversation_get_connection(conv),args[0]); return PURPLE_CMD_RET_OK;
--- a/libpurple/purpleaccountpresence.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/purpleaccountpresence.c Thu Jan 14 22:33:49 2021 -0600
@@ -23,6 +23,8 @@
#include "purpleaccountpresence.h"
+#include "purpleprotocolserver.h" struct _PurpleAccountPresence {
@@ -94,8 +96,8 @@
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_set_idle(protocol, gc, (idle ? (current_time - idle_time) : 0));
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_set_idle(PURPLE_PROTOCOL_SERVER(protocol), gc, (idle ? (current_time - idle_time) : 0)); --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purpleprotocolserver.c Thu Jan 14 22:33:49 2021 -0600
@@ -0,0 +1,377 @@
+ * 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 + * 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, see <https://www.gnu.org/licenses/>. +#include "purpleprotocolserver.h" +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +G_DEFINE_INTERFACE(PurpleProtocolServer, purple_protocol_server, G_TYPE_INVALID) +purple_protocol_server_default_init(PurpleProtocolServerInterface *iface) { +/****************************************************************************** + *****************************************************************************/ +purple_protocol_server_register_user(PurpleProtocolServer *protocol_server, + PurpleAccount *account) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_ACCOUNT(account)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->register_user != NULL) { + iface->register_user(protocol_server, account); +purple_protocol_server_unregister_user(PurpleProtocolServer *protocol_server, + PurpleAccount *account, + PurpleAccountUnregistrationCb cb, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_ACCOUNT(account)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->unregister_user != NULL) { + iface->unregister_user(protocol_server, account, cb, data); +purple_protocol_server_set_info(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->set_info != NULL) { + iface->set_info(protocol_server, connection, info); +purple_protocol_server_get_info(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, const gchar *who) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(who != NULL); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->get_info != NULL) { + iface->get_info(protocol_server, connection, who); +purple_protocol_server_set_status(PurpleProtocolServer *protocol_server, + PurpleAccount *account, PurpleStatus *status) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_ACCOUNT(account)); + g_return_if_fail(PURPLE_IS_STATUS(status)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->set_status != NULL) { + iface->set_status(protocol_server, account, status); +purple_protocol_server_set_idle(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, gint idletime) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->set_idle != NULL) { + iface->set_idle(protocol_server, connection, idletime); +purple_protocol_server_change_passwd(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(old_pass != NULL); + g_return_if_fail(new_pass != NULL); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->change_passwd != NULL) { + iface->change_passwd(protocol_server, connection, old_pass, new_pass); +purple_protocol_server_add_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + PurpleBuddy *buddy, PurpleGroup *group, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(PURPLE_IS_BUDDY(buddy)); + g_return_if_fail(PURPLE_IS_GROUP(group)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->add_buddy != NULL) { + iface->add_buddy(protocol_server, connection, buddy, group, message); +purple_protocol_server_add_buddies(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + GList *buddies, GList *groups, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(g_list_length(buddies) != g_list_length(groups)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->add_buddies != NULL) { + iface->add_buddies(protocol_server, connection, buddies, groups, + while(buddies != NULL && groups != NULL) { + purple_protocol_server_add_buddy(protocol_server, connection, + PURPLE_BUDDY(buddies->data), + PURPLE_GROUP(groups->data), + buddies = g_list_next(buddies); + groups = g_list_next(groups); +purple_protocol_server_remove_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + PurpleBuddy *buddy, PurpleGroup *group) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(PURPLE_IS_BUDDY(buddy)); + g_return_if_fail(PURPLE_IS_GROUP(group)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->remove_buddy != NULL) { + iface->remove_buddy(protocol_server, connection, buddy, group); +purple_protocol_server_remove_buddies(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + GList *buddies, GList *groups) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->remove_buddies != NULL) { + iface->remove_buddies(protocol_server, connection, buddies, groups); + while(buddies != NULL && groups != NULL) { + purple_protocol_server_remove_buddy(protocol_server, connection, + PURPLE_BUDDY(buddies->data), + PURPLE_GROUP(groups->data)); + buddies = g_list_next(buddies); + groups = g_list_next(groups); +purple_protocol_server_keepalive(PurpleProtocolServer *protocol_server, + PurpleConnection *connection) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->keepalive != NULL) { + iface->keepalive(protocol_server, connection); +purple_protocol_server_get_keepalive_interval(PurpleProtocolServer *protocol_server) + PurpleProtocolServerInterface *iface = NULL; + g_return_val_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server), -1); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->get_keepalive_interval != NULL) { + return iface->get_keepalive_interval(protocol_server); +purple_protocol_server_alias_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + const gchar *who, const gchar *alias) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(who != NULL); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->alias_buddy != NULL) { + iface->alias_buddy(protocol_server, connection, who, alias); +purple_protocol_server_group_buddy(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + const gchar *who, const gchar *old_group, + const gchar *new_group) + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(who != NULL); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->group_buddy != NULL) { + iface->group_buddy(protocol_server, connection, who, old_group, +purple_protocol_server_rename_group(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + const gchar *old_name, PurpleGroup *group, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(PURPLE_IS_GROUP(group)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->rename_group != NULL) { + iface->rename_group(protocol_server, connection, old_name, group, +purple_protocol_server_set_buddy_icon(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(PURPLE_IS_IMAGE(img)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->set_buddy_icon != NULL) { + iface->set_buddy_icon(protocol_server, connection, img); +purple_protocol_server_remove_group(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + PurpleProtocolServerInterface *iface = NULL; + g_return_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server)); + g_return_if_fail(PURPLE_IS_CONNECTION(connection)); + g_return_if_fail(PURPLE_IS_GROUP(group)); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->remove_group != NULL) { + iface->remove_group(protocol_server, connection, group); +purple_protocol_server_send_raw(PurpleProtocolServer *protocol_server, + PurpleConnection *connection, + const gchar *buf, gint len) + PurpleProtocolServerInterface *iface = NULL; + g_return_val_if_fail(PURPLE_IS_PROTOCOL_SERVER(protocol_server), -1); + g_return_val_if_fail(PURPLE_IS_CONNECTION(connection), -1); + iface = PURPLE_PROTOCOL_SERVER_GET_IFACE(protocol_server); + if(iface != NULL && iface->send_raw != NULL) { + return iface->send_raw(protocol_server, connection, buf, len); --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/purpleprotocolserver.h Thu Jan 14 22:33:49 2021 -0600
@@ -0,0 +1,414 @@
+ * 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 + * 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, see <https://www.gnu.org/licenses/>. +#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION) +# error "only <purple.h> may be included directly" +#ifndef PURPLE_PROTOCOL_SERVER_H +#define PURPLE_PROTOCOL_SERVER_H + * SECTION:purpleprotocolserver + * @section_id: libpurple-purpleprotocolserver + * @short_description: Protocol Server Interface + * @title: ProtocolServer Interface + * #PurpleProtocolServer describes the API for protocols that have a central +#include <glib-object.h> +#include <libpurple/account.h> +#include <libpurple/buddy.h> +#include <libpurple/connection.h> +#include <libpurple/group.h> +#include <libpurple/purplemessage.h> +#define PURPLE_TYPE_PROTOCOL_SERVER (purple_protocol_server_get_type()) +G_DECLARE_INTERFACE(PurpleProtocolServer, purple_protocol_server, PURPLE, + PROTOCOL_SERVER, GObject) + * PURPLE_TYPE_PROTOCOL_SERVER: + * The standard _get_type method for #PurpleProtocolServer. + * PurpleProtocolServer: + * An opaque data structure used to reference a #PurpleProtocol that implements + * #PurpleProtocolServerInterface. + * PurpleProtocolServerInterface: + * @register_user: Register a new user. + * @unregister_user: Remove the user from the server. The account can either be + * connected or disconnected. After the removal is finished, + * the connection will stay open and has to be closed! + * @set_info: Sets the user's profile. + * @get_info: Should arrange for purple_notify_userinfo() to be called with the + * requested user's profile. + * @set_status: Sets the active status for the given account. + * @set_idle: Set the idle time for the given account. + * @change_passwd: Changes the users password. + * @add_buddy: Add a buddy to a group on the server. + * @add_buddies: Add multiple buddies on the server at once. + * @remove_buddy: Removes the given buddy from the user's buddy list. + * @remove_buddies: Removes multiple buddies from the user's buddy list. + * @keepalive: If implemented, this will be called regularly for this + * protocol's active connections. You'd want to do this if you need + * to repeatedly send some kind of keepalive packet to the server + * to avoid being disconnected. ("Regularly" is defined to be 30 + * unless @get_keepalive_interval is implemented to override it). + * @get_keepalive_interval: If implemented, this will override the default + * @alias_buddy: Save/store buddy's alias on server list/roster + * @group_buddy: Change a buddy's group on a server list/roster + * @rename_group: Rename a group on a server list/roster + * @set_buddy_icon: Set the buddy icon for the given connection to @img. The + * protocol does <emphasis>NOT</emphasis> own a reference to + * @img; if it needs one, it must #g_object_ref(@img) itself. + * @remove_group: Removes the given group from the users buddy list. + * @send_raw: For use in plugins that may understand the underlying protocol. + * The protocol server interface. + * This interface provides a gateway between purple and the protocol's server. +struct _PurpleProtocolServerInterface { + void (*register_user)(PurpleProtocolServer *protocol_server, PurpleAccount *account); + void (*unregister_user)(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleAccountUnregistrationCb cb, gpointer data); + void (*set_info)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *info); + void (*get_info)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who); + void (*set_status)(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleStatus *status); + void (*set_idle)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, gint idletime); + void (*change_passwd)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *old_pass, const gchar *new_pass); + void (*add_buddy)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group, const gchar *message); + void (*add_buddies)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, GList *buddies, GList *groups, const gchar *message); + void (*remove_buddy)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group); + void (*remove_buddies)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, GList *buddies, GList *groups); + void (*keepalive)(PurpleProtocolServer *protocol_server, PurpleConnection *connection); + gint (*get_keepalive_interval)(PurpleProtocolServer *protocol_server); + void (*alias_buddy)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who, const gchar *alias); + void (*group_buddy)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who, const gchar *old_group, const gchar *new_group); + void (*rename_group)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *old_name, PurpleGroup *group, GList *moved_buddies); + void (*set_buddy_icon)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleImage *img); + void (*remove_group)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleGroup *group); + gint (*send_raw)(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *buf, gint len); + * purple_protocol_server_register_user: + * @protocol_server: The #PurpleProtocolServer instance. + * @account: The #PurpleAccount to register. + * Tell @protocol_server to register the new account described by @account. +void purple_protocol_server_register_user(PurpleProtocolServer *protocol_server, PurpleAccount *account); + * purple_protocol_server_unregister_user: + * @protocol_server: The #PurpleProtocolServer instance. + * @account: The #PurpleAccount instance. + * @cb: (scope call): A PurpleAccountUnregistrationCb function. + * @data: User data to pass to @cb. + * Unregisters @account with @protocol_server. The account can either be + * connected or disconnected. After the removal is finished, the connection + * will stay open and has to be closed. +void purple_protocol_server_unregister_user(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleAccountUnregistrationCb cb, gpointer data); + * purple_protocol_server_set_info: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @info: The user info to set. + * Sets the user info, sometimes referred to as a user profile to @info. +void purple_protocol_server_set_info(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *info); + * purple_protocol_server_get_info: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @who: The name of the user whose information you're asking for. + * Gets the user info or profile for @who and displays it in a protocol specifc +void purple_protocol_server_get_info(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who); + * purple_protocol_server_set_status: + * @protocol_server: The #PurpleProtocolServer instance. + * @account: The #PurpleAccount instance. + * @status: The #PurpleStatus instance. + * Sets the status for account @account to @status. +void purple_protocol_server_set_status(PurpleProtocolServer *protocol_server, PurpleAccount *account, PurpleStatus *status); + * purple_protocol_server_set_idle: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @idletime: The number of seconds that the user has been idle. + * Tells @protocol_server to set the user's idle time to @idletime. +void purple_protocol_server_set_idle(PurpleProtocolServer *protocol_server, PurpleConnection *connection, gint idletime); + * purple_protocol_server_change_passwd: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @old_pass: The user's old password. + * @new_pass: The new password for the user. + * Changes the user's password from @old_pass to @new_pass. +void purple_protocol_server_change_passwd(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *old_pass, const gchar *new_pass); + * purple_protocol_server_add_buddy: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @buddy: The #PurpleBuddy to add. + * @group: The #PurpleGroup for @buddy. + * @message: An optional invite message. + * This protocol function may be called in situations in which the buddy is + * already in the specified group. If the protocol supports authorization and + * the user is not already authorized to see the status of @buddy, this + * function will request authorization. If authorization is required, then + * @message will be used as an invite message. +void purple_protocol_server_add_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group, const gchar *message); + * purple_protocol_server_add_buddies: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @buddies: (element-type PurpleBuddy): A #GList of #PurpleBuddy's to add. + * @groups: (element-type PurpleGroup): A #GList of #PurpleGroup's that + * correspond to the @buddies parameter. + * @message: An optional invite message to send. + * Similar to purple_protocol_server_add_buddy() but can add multiple buddies + * at a time. If @protocol_server does not implement this function, this will + * call purple_protocol_server_add_buddy() for each buddy/group pair in +void purple_protocol_server_add_buddies(PurpleProtocolServer *protocol_server, PurpleConnection *connection, GList *buddies, GList *groups, const gchar *message); + * purple_protocol_server_remove_buddy: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @buddy: The #PurpleBuddy instance. + * @group: The #PurpleGroup instance. + * Removes @buddy and potentially @group from the server side list of contacts. +void purple_protocol_server_remove_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleBuddy *buddy, PurpleGroup *group); + * purple_protocol_server_remove_buddies: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @buddies: (element-type PurpleBuddy): A #GList of #PurpleBuddy's to remove. + * @groups: (element-type PurpleGroup): A #GList of #PurpleGroup's + * corresponding to @buddies. + * Similiar to purple_protocol_server_remove_buddy() but allows you to remove + * If @protocol_server doesn't implement this function directly, + * purple_protocol_server_remove_buddy() will be called for each buddy/group + * pair in @buddies/@groups. +void purple_protocol_server_remove_buddies(PurpleProtocolServer *protocol_server, PurpleConnection *connection, GList *buddies, GList *groups); + * purple_protocol_server_keepalive: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * Tell @protocol_server to send its keep alive to the server. +void purple_protocol_server_keepalive(PurpleProtocolServer *protocol_server, PurpleConnection *connection); + * purple_protocol_server_get_keepalive_interval: + * @protocol_server: The #PurpleProtocolServer instance. + * Returns a custom interval, in seconds, that libpurple should tell + * @protocol_server to send its keepalive. + * Returns: The interval, in seconds, that the keep-alive function should be +gint purple_protocol_server_get_keepalive_interval(PurpleProtocolServer *protocol_server); + * purple_protocol_server_alias_buddy: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @who: The name of the user to alias. + * @alias: The new alias for @who. + * Sets the server side alias for @who to @alias. +void purple_protocol_server_alias_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who, const gchar *alias); + * purple_protocol_server_group_buddy: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @who: The name of the user whose group to switch. + * @old_group: The name of @who's old group. + * @new_group: The name of the new group to add @who to. + * Moves @who from group @old_group to a new group of @new_group. +void purple_protocol_server_group_buddy(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *who, const gchar *old_group, const gchar *new_group); + * purple_protocol_server_rename_group: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @old_name: The old name of the group. + * @group: The new #PurpleGroup instance. + * @moved_buddies: (element-type PurpleBuddy): A list of #PurpleBuddy's being + * moved as part of this rename. + * Renames the group named @old_name to the new @group. +void purple_protocol_server_rename_group(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *old_name, PurpleGroup *group, GList *moved_buddies); + * purple_protocol_server_set_buddy_icon: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @img: The #PurpleImage instance. + * Sets the user's buddy icon to @img. +void purple_protocol_server_set_buddy_icon(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleImage *img); + * purple_protocol_server_remove_group: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @group: The #PurpleGroup instance. + * Removes @group from the server side contact list. +void purple_protocol_server_remove_group(PurpleProtocolServer *protocol_server, PurpleConnection *connection, PurpleGroup *group); + * purple_protocol_server_send_raw: + * @protocol_server: The #PurpleProtocolServer instance. + * @connection: The #PurpleConnection instance. + * @buf: The raw protocol data to send. + * @len: The length of @buf in bytes. + * Sends raw data over the protocol. This should only be called when you know + * the exact underlying protocol. + * Returns: The number of bytes that was sent. +gint purple_protocol_server_send_raw(PurpleProtocolServer *protocol_server, PurpleConnection *connection, const gchar *buf, gint len); +#endif /* PURPLE_PROTOCOL_SERVER_H */ --- a/libpurple/server.c Thu Jan 14 21:20:10 2021 -0600
+++ b/libpurple/server.c Thu Jan 14 22:33:49 2021 -0600
@@ -38,6 +38,7 @@
#include "purpleprotocolchat.h"
#include "purpleprotocolim.h"
#include "purpleprotocolprivacy.h"
+#include "purpleprotocolserver.h" @@ -179,7 +180,8 @@
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_get_info(protocol, gc, name);
+ purple_protocol_server_get_info(PURPLE_PROTOCOL_SERVER(protocol), gc, @@ -197,7 +199,8 @@
purple_signal_emit(purple_accounts_get_handle(),
"account-setting-info", account, info);
- purple_protocol_server_iface_set_info(protocol, gc, info);
+ purple_protocol_server_set_info(PURPLE_PROTOCOL_SERVER(protocol), purple_signal_emit(purple_accounts_get_handle(),
"account-set-info", account, info);
@@ -220,11 +223,12 @@
gc = purple_account_get_connection(account);
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_alias_buddy(protocol, gc,
- purple_buddy_get_name(b),
- purple_buddy_get_local_alias(b));
+ purple_protocol_server_alias_buddy(PURPLE_PROTOCOL_SERVER(protocol), + purple_buddy_get_name(b), + purple_buddy_get_local_alias(b)); @@ -345,9 +349,10 @@
protocol = purple_connection_get_protocol(gc);
- purple_protocol_server_iface_group_buddy(protocol, gc, purple_buddy_get_name(buddy),
- purple_group_get_name(orig),
- purple_group_get_name(dest));
+ purple_protocol_server_group_buddy(PURPLE_PROTOCOL_SERVER(protocol), + gc, purple_buddy_get_name(buddy), + purple_group_get_name(orig), + purple_group_get_name(dest)); --- a/pidgin/plugins/xmppconsole/xmppconsole.c Thu Jan 14 21:20:10 2021 -0600
+++ b/pidgin/plugins/xmppconsole/xmppconsole.c Thu Jan 14 22:33:49 2021 -0600
@@ -252,8 +252,10 @@
gtk_text_buffer_get_bounds(console->entry_buffer, &start, &end);
text = gtk_text_buffer_get_text(console->entry_buffer, &start, &end, FALSE);
- purple_protocol_server_iface_send_raw(protocol, gc, text, strlen(text));
+ if(PURPLE_IS_PROTOCOL_SERVER(protocol)) { + purple_protocol_server_send_raw(PURPLE_PROTOCOL_SERVER(protocol), gc, gtk_text_buffer_set_text(console->entry_buffer, "", 0);
--- a/po/POTFILES.in Thu Jan 14 21:20:10 2021 -0600
+++ b/po/POTFILES.in Thu Jan 14 22:33:49 2021 -0600
@@ -261,6 +261,7 @@
libpurple/purpleprotocolim.c
libpurple/purpleprotocolmedia.c
libpurple/purpleprotocolprivacy.c
+libpurple/purpleprotocolserver.c libpurple/purplewhiteboard.c
libpurple/purplewhiteboarduiops.c
libpurple/queuedoutputstream.c