diff src/prpl.c @ 9949:ced29c7b396c

[gaim-migrate @ 10845] (00:25:10) LSchiere: datallah: commit message? (00:25:40) datallah: LSchiere: nah.. nothing comes to me datallah undertook the heroic effort of merging in all the .rejs and fixing things up from the unclean merge of the status rewrite committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Sat, 04 Sep 2004 04:27:05 +0000
parents eae7e049d639
children 9baedaca25c7
line wrap: on
line diff
--- a/src/prpl.c	Sat Sep 04 03:33:16 2004 +0000
+++ b/src/prpl.c	Sat Sep 04 04:27:05 2004 +0000
@@ -28,6 +28,322 @@
 #include "request.h"
 #include "util.h"
 
+/**************************************************************************/
+/** @name Protocol Plugin API  */
+/**************************************************************************/
+void
+gaim_prpl_got_account_idle(GaimAccount *account, gboolean idle,
+						   time_t idle_time)
+{
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(gaim_account_is_connected(account));
+
+	gaim_presence_set_idle(gaim_account_get_presence(account),
+						   idle, idle_time);
+}
+
+void
+gaim_prpl_got_account_login_time(GaimAccount *account, const char *name,
+		time_t login_time)
+{
+	GaimPresence *presence;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(name != NULL && *name != '\0');
+	g_return_if_fail(gaim_account_is_connected(account));
+
+	if (login_time == 0)
+		login_time = time(NULL);
+
+	presence = gaim_account_get_presence(account);
+
+	/*
+	 * TODO: Set a presence's sign-on time. We don't support this yet.
+	 */
+	gaim_debug_warning("prpl",
+					   "Attempting to set an account's sign-on time, but we "
+					   "don't support this yet! FIX IT!\n");
+}
+
+static gboolean
+set_value_from_arg(GaimStatus *status, const char *id, va_list *args)
+{
+	GaimValue *value;
+
+	value = gaim_status_get_attr_value(status, id);
+
+	if (value == NULL)
+	{
+		gaim_debug_error("prpl",
+						 "Attempted to set an unknown attribute %s on "
+						 "status %s\n",
+						 id, gaim_status_get_id(status));
+		return FALSE;
+	}
+
+	switch (gaim_value_get_type(value))
+	{
+		case GAIM_TYPE_CHAR:
+			gaim_value_set_char(value, (char)va_arg(*args, int));
+			break;
+
+		case GAIM_TYPE_UCHAR:
+			gaim_value_set_uchar(value,
+								 (unsigned char)va_arg(*args, unsigned int));
+			break;
+
+		case GAIM_TYPE_BOOLEAN:
+			gaim_value_set_boolean(value, va_arg(*args, gboolean));
+			break;
+
+		case GAIM_TYPE_SHORT:
+			gaim_value_set_short(value, (short)va_arg(*args, int));
+			break;
+
+		case GAIM_TYPE_USHORT:
+			gaim_value_set_ushort(value,
+					(unsigned short)va_arg(*args, unsigned int));
+			break;
+
+		case GAIM_TYPE_INT:
+			gaim_value_set_int(value, va_arg(*args, int));
+			break;
+
+		case GAIM_TYPE_UINT:
+			gaim_value_set_uint(value, va_arg(*args, unsigned int));
+			break;
+
+		case GAIM_TYPE_LONG:
+			gaim_value_set_long(value, va_arg(*args, long));
+			break;
+
+		case GAIM_TYPE_ULONG:
+			gaim_value_set_ulong(value, va_arg(*args, unsigned long));
+			break;
+
+		case GAIM_TYPE_INT64:
+			gaim_value_set_int64(value, va_arg(*args, gint64));
+			break;
+
+		case GAIM_TYPE_UINT64:
+			gaim_value_set_uint64(value, va_arg(*args, guint64));
+			break;
+
+		case GAIM_TYPE_STRING:
+			gaim_value_set_string(value, va_arg(*args, char *));
+			break;
+
+		case GAIM_TYPE_OBJECT:
+			gaim_value_set_object(value, va_arg(*args, void *));
+			break;
+
+		case GAIM_TYPE_POINTER:
+			gaim_value_set_pointer(value, va_arg(*args, void *));
+			break;
+
+		case GAIM_TYPE_ENUM:
+			gaim_value_set_enum(value, va_arg(*args, int));
+			break;
+
+		case GAIM_TYPE_BOXED:
+			gaim_value_set_boxed(value, va_arg(*args, void *));
+			break;
+
+		default:
+			return FALSE;
+	}
+
+	return TRUE;
+}
+
+void
+gaim_prpl_got_account_status(GaimAccount *account, const char *status_id,
+		const char *attr_id, ...)
+{
+	GaimPresence *presence;
+	GaimStatus *status;
+
+	g_return_if_fail(account   != NULL);
+	g_return_if_fail(status_id != NULL);
+	g_return_if_fail(gaim_account_is_connected(account));
+
+	presence = gaim_account_get_presence(account);
+	status   = gaim_presence_get_status(presence, status_id);
+
+	g_return_if_fail(status != NULL);
+
+	if (attr_id != NULL)
+	{
+		va_list args;
+
+		va_start(args, attr_id);
+
+		while (attr_id != NULL)
+		{
+			set_value_from_arg(status, attr_id, &args);
+
+			attr_id = va_arg(args, char *);
+		}
+
+		va_end(args);
+	}
+
+	gaim_presence_set_status_active(presence, status_id, TRUE);
+}
+
+void
+gaim_prpl_got_account_warning_level(GaimAccount *account, const char *username,
+		unsigned int level)
+{
+	GaimPresence *presence;
+	unsigned int old_level;
+	char buf2[1024];
+
+	g_return_if_fail(account != NULL);
+
+	presence = gaim_account_get_presence(account);
+
+	gaim_signal_emit(gaim_accounts_get_handle(), "account-warned",
+					 account, username, level);
+
+	old_level = gaim_presence_get_warning_level(presence);
+	gaim_presence_set_warning_level(presence, level);
+
+	if (old_level >= level)
+		return;
+
+	g_snprintf(buf2, sizeof(buf2),
+			   _("%s has just been warned by %s.\n"
+				 "Your new warning level is %d%%"),
+			   gaim_account_get_username(account),
+			   (username == NULL ? _("an anonymous person") : username),
+			   level);
+
+	gaim_notify_info(NULL, NULL, buf2, NULL);
+}
+
+void
+gaim_prpl_got_user_idle(GaimAccount *account, const char *name,
+		gboolean idle, time_t idle_time)
+{
+	GaimBuddy *buddy;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(name    != NULL);
+	g_return_if_fail(gaim_account_is_connected(account));
+
+	if ((buddy = gaim_find_buddy(account, name)) == NULL)
+		return;
+
+	gaim_presence_set_idle(gaim_buddy_get_presence(buddy), idle, idle_time);
+}
+
+void
+gaim_prpl_got_user_login_time(GaimAccount *account, const char *name,
+		time_t login_time)
+{
+	GaimBuddy *buddy;
+	GaimPresence *presence;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(name    != NULL);
+
+	if ((buddy = gaim_find_buddy(account, name)) == NULL)
+		return;
+
+	if (login_time == 0)
+		login_time = time(NULL);
+
+	presence = gaim_buddy_get_presence(buddy);
+
+	/*
+	 * TODO: Set a presence's sign-on time. We don't support this yet.
+	 */
+	gaim_debug_warning("prpl",
+					   "Attempting to set a user's sign-on time, but we "
+					   "don't support this yet! FIX IT!\n");
+}
+
+void
+gaim_prpl_got_user_status(GaimAccount *account, const char *name,
+		const char *status_id, const char *attr_id, ...)
+{
+	GaimBuddy *buddy;
+	GaimPresence *presence;
+	GaimStatus *status;
+
+	g_return_if_fail(account   != NULL);
+	g_return_if_fail(name      != NULL);
+	g_return_if_fail(status_id != NULL);
+	g_return_if_fail(gaim_account_is_connected(account));
+
+	if ((buddy = gaim_find_buddy(account, name)) == NULL)
+		return;
+
+	presence = gaim_buddy_get_presence(buddy);
+	status   = gaim_presence_get_status(presence, status_id);
+
+	g_return_if_fail(status != NULL);
+
+	if (attr_id != NULL)
+	{
+		va_list args;
+
+		va_start(args, attr_id);
+
+		while (attr_id != NULL)
+		{
+			set_value_from_arg(status, attr_id, &args);
+
+			attr_id = va_arg(args, char *);
+		}
+
+		va_end(args);
+	}
+
+	gaim_presence_set_status_active(presence, status_id, TRUE);
+}
+
+void
+gaim_prpl_got_user_warning_level(GaimAccount *account, const char *name,
+		unsigned int level)
+{
+	GaimBuddy *buddy;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(name    != NULL);
+
+	if ((buddy = gaim_find_buddy(account, name)) == NULL)
+		return;
+
+	gaim_presence_set_warning_level(gaim_buddy_get_presence(buddy), level);
+}
+
+void
+gaim_prpl_set_account_status(GaimAccount *account, GaimStatus *status)
+{
+	GaimPlugin *prpl;
+	GaimPluginProtocolInfo *prpl_info;
+
+	g_return_if_fail(account != NULL);
+	g_return_if_fail(status  != NULL);
+
+	prpl = gaim_find_prpl(gaim_account_get_protocol_id(account));
+
+	if (prpl == NULL)
+		return;
+
+	prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl);
+
+	if (prpl_info->set_status != NULL)
+		prpl_info->set_status(account, status);
+}
+
+
+/**************************************************************************
+ * Protocol Plugin Subsystem API
+ **************************************************************************/
+
 GaimPlugin *
 gaim_find_prpl(const char *id)
 {