summaryrefslogtreecommitdiff
path: root/libpurple/conversationtypes.c
diff options
context:
space:
mode:
authorGary Kramlich <grim@reaperworld.com>2020-08-13 18:29:17 -0500
committerGary Kramlich <grim@reaperworld.com>2020-08-13 18:29:17 -0500
commiteed4b41fcde498a6883d63a547ecac2135de6d1b (patch)
tree2bae034b8ecf418582b0483ac9c9625044ff2d7b /libpurple/conversationtypes.c
parent943018e236b4e910c9942d3cca3ccd19d73005bc (diff)
downloadpidgin-eed4b41fcde498a6883d63a547ecac2135de6d1b.tar.gz
Move PurpleIMConversation to its own file
Move PurpleIMConversation to it's own file. Testing Done: Compiled and was able to send an IM. It's not yet using `G_DECLARE_FINAL_TYPE` because `PurpleConversation` is not using `G_DECLARE_*` so it fails if I try to use it. I didn't clean up too much of the code yet, but I tried to get most of the formatting changes we have. Reviewed at https://reviews.imfreedom.org/r/60/
Diffstat (limited to 'libpurple/conversationtypes.c')
-rw-r--r--libpurple/conversationtypes.c459
1 files changed, 0 insertions, 459 deletions
diff --git a/libpurple/conversationtypes.c b/libpurple/conversationtypes.c
index cdd14f307a..6dee3b9335 100644
--- a/libpurple/conversationtypes.c
+++ b/libpurple/conversationtypes.c
@@ -28,37 +28,6 @@
#include "enums.h"
#include "purpleprivate.h"
-#define SEND_TYPED_TIMEOUT_SECONDS 5
-
-/**************************************************************************/
-/* PurpleIMConversation */
-/**************************************************************************/
-
-/*
- * Data specific to Instant Messages.
- */
-typedef struct
-{
- PurpleIMTypingState typing_state; /* The current typing state. */
- guint typing_timeout; /* The typing timer handle. */
- time_t type_again; /* The type again time. */
- guint send_typed_timeout; /* The type again timer handle. */
- PurpleBuddyIcon *icon; /* The buddy icon. */
-} PurpleIMConversationPrivate;
-
-/* IM Property enums */
-enum {
- IM_PROP_0,
- IM_PROP_TYPING_STATE,
- IM_PROP_ICON,
- IM_PROP_LAST
-};
-
-static GParamSpec *im_properties[IM_PROP_LAST];
-
-G_DEFINE_TYPE_WITH_PRIVATE(PurpleIMConversation, purple_im_conversation,
- PURPLE_TYPE_CONVERSATION);
-
/**************************************************************************/
/* PurpleChatConversation */
/**************************************************************************/
@@ -149,434 +118,6 @@ static int purple_chat_user_compare(PurpleChatUser *a,
PurpleChatUser *b);
/**************************************************************************
- * IM Conversation API
- **************************************************************************/
-static gboolean
-reset_typing_cb(gpointer data)
-{
- PurpleIMConversation *im = (PurpleIMConversation *)data;
-
- purple_im_conversation_set_typing_state(im, PURPLE_IM_NOT_TYPING);
- purple_im_conversation_stop_typing_timeout(im);
-
- return FALSE;
-}
-
-static gboolean
-send_typed_cb(gpointer data)
-{
- PurpleIMConversation *im = PURPLE_IM_CONVERSATION(data);
- PurpleConnection *gc;
- const char *name;
-
- g_return_val_if_fail(im != NULL, FALSE);
-
- gc = purple_conversation_get_connection(PURPLE_CONVERSATION(im));
- name = purple_conversation_get_name(PURPLE_CONVERSATION(im));
-
- if (gc != NULL && name != NULL) {
- /* We set this to 1 so that PURPLE_IM_TYPING will be sent
- * if the Purple user types anything else.
- */
- purple_im_conversation_set_type_again(im, 1);
-
- purple_serv_send_typing(gc, name, PURPLE_IM_TYPED);
-
- purple_debug(PURPLE_DEBUG_MISC, "conversationtypes", "typed...\n");
- }
-
- return FALSE;
-}
-
-void
-purple_im_conversation_set_icon(PurpleIMConversation *im, PurpleBuddyIcon *icon)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- priv = purple_im_conversation_get_instance_private(im);
- if (priv->icon != icon)
- {
- purple_buddy_icon_unref(priv->icon);
-
- priv->icon = (icon == NULL ? NULL : purple_buddy_icon_ref(icon));
-
- g_object_notify_by_pspec(G_OBJECT(im), im_properties[IM_PROP_ICON]);
- }
-
- purple_conversation_update(PURPLE_CONVERSATION(im),
- PURPLE_CONVERSATION_UPDATE_ICON);
-}
-
-PurpleBuddyIcon *
-purple_im_conversation_get_icon(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_val_if_fail(PURPLE_IS_IM_CONVERSATION(im), NULL);
-
- priv = purple_im_conversation_get_instance_private(im);
- return priv->icon;
-}
-
-void
-purple_im_conversation_set_typing_state(PurpleIMConversation *im, PurpleIMTypingState state)
-{
- PurpleIMConversationPrivate *priv = NULL;
- PurpleAccount *account;
- const char *name;
-
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- priv = purple_im_conversation_get_instance_private(im);
- name = purple_conversation_get_name(PURPLE_CONVERSATION(im));
- account = purple_conversation_get_account(PURPLE_CONVERSATION(im));
-
- if (priv->typing_state != state)
- {
- priv->typing_state = state;
-
- g_object_notify_by_pspec(G_OBJECT(im),
- im_properties[IM_PROP_TYPING_STATE]);
-
- switch (state)
- {
- case PURPLE_IM_TYPING:
- purple_signal_emit(purple_conversations_get_handle(),
- "buddy-typing", account, name);
- break;
- case PURPLE_IM_TYPED:
- purple_signal_emit(purple_conversations_get_handle(),
- "buddy-typed", account, name);
- break;
- case PURPLE_IM_NOT_TYPING:
- purple_signal_emit(purple_conversations_get_handle(),
- "buddy-typing-stopped", account, name);
- break;
- }
-
- purple_im_conversation_update_typing(im);
- }
-}
-
-PurpleIMTypingState
-purple_im_conversation_get_typing_state(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_val_if_fail(PURPLE_IS_IM_CONVERSATION(im), 0);
-
- priv = purple_im_conversation_get_instance_private(im);
- return priv->typing_state;
-}
-
-void
-purple_im_conversation_start_typing_timeout(PurpleIMConversation *im, int timeout)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- priv = purple_im_conversation_get_instance_private(im);
- if (priv->typing_timeout > 0)
- purple_im_conversation_stop_typing_timeout(im);
-
- priv->typing_timeout = g_timeout_add_seconds(timeout, reset_typing_cb, im);
-}
-
-void
-purple_im_conversation_stop_typing_timeout(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- priv = purple_im_conversation_get_instance_private(im);
- if (priv->typing_timeout == 0)
- return;
-
- g_source_remove(priv->typing_timeout);
- priv->typing_timeout = 0;
-}
-
-guint
-purple_im_conversation_get_typing_timeout(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_val_if_fail(PURPLE_IS_IM_CONVERSATION(im), 0);
-
- priv = purple_im_conversation_get_instance_private(im);
- return priv->typing_timeout;
-}
-
-void
-purple_im_conversation_set_type_again(PurpleIMConversation *im, unsigned int val)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- priv = purple_im_conversation_get_instance_private(im);
- if (val == 0)
- priv->type_again = 0;
- else
- priv->type_again = time(NULL) + val;
-}
-
-time_t
-purple_im_conversation_get_type_again(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_val_if_fail(PURPLE_IS_IM_CONVERSATION(im), 0);
-
- priv = purple_im_conversation_get_instance_private(im);
- return priv->type_again;
-}
-
-void
-purple_im_conversation_start_send_typed_timeout(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- priv = purple_im_conversation_get_instance_private(im);
- priv->send_typed_timeout = g_timeout_add_seconds(SEND_TYPED_TIMEOUT_SECONDS,
- send_typed_cb, im);
-}
-
-void
-purple_im_conversation_stop_send_typed_timeout(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- priv = purple_im_conversation_get_instance_private(im);
- if (priv->send_typed_timeout == 0)
- return;
-
- g_source_remove(priv->send_typed_timeout);
- priv->send_typed_timeout = 0;
-}
-
-guint
-purple_im_conversation_get_send_typed_timeout(PurpleIMConversation *im)
-{
- PurpleIMConversationPrivate *priv = NULL;
-
- g_return_val_if_fail(PURPLE_IS_IM_CONVERSATION(im), 0);
-
- priv = purple_im_conversation_get_instance_private(im);
- return priv->send_typed_timeout;
-}
-
-void
-purple_im_conversation_update_typing(PurpleIMConversation *im)
-{
- g_return_if_fail(PURPLE_IS_IM_CONVERSATION(im));
-
- purple_conversation_update(PURPLE_CONVERSATION(im),
- PURPLE_CONVERSATION_UPDATE_TYPING);
-}
-
-static void
-im_conversation_write_message(PurpleConversation *conv, PurpleMessage *msg)
-{
- PurpleIMConversation *im = PURPLE_IM_CONVERSATION(conv);
- gboolean is_recv;
-
- g_return_if_fail(im != NULL);
- g_return_if_fail(msg != NULL);
-
- is_recv = (purple_message_get_flags(msg) & PURPLE_MESSAGE_RECV);
-
- if (is_recv)
- purple_im_conversation_set_typing_state(im, PURPLE_IM_NOT_TYPING);
-
- _purple_conversation_write_common(conv, msg);
-}
-
-/**************************************************************************
- * GObject code for IMs
- **************************************************************************/
-
-/* Set method for GObject properties */
-static void
-purple_im_conversation_set_property(GObject *obj, guint param_id, const GValue *value,
- GParamSpec *pspec)
-{
- PurpleIMConversation *im = PURPLE_IM_CONVERSATION(obj);
-
- switch (param_id) {
- case IM_PROP_TYPING_STATE:
- purple_im_conversation_set_typing_state(im, g_value_get_enum(value));
- break;
- case IM_PROP_ICON:
- purple_im_conversation_set_icon(im, g_value_get_pointer(value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
- break;
- }
-}
-
-/* Get method for GObject properties */
-static void
-purple_im_conversation_get_property(GObject *obj, guint param_id, GValue *value,
- GParamSpec *pspec)
-{
- PurpleIMConversation *im = PURPLE_IM_CONVERSATION(obj);
-
- switch (param_id) {
- case IM_PROP_TYPING_STATE:
- g_value_set_enum(value, purple_im_conversation_get_typing_state(im));
- break;
- case IM_PROP_ICON:
- g_value_set_pointer(value, purple_im_conversation_get_icon(im));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
- break;
- }
-}
-
-/* GObject initialization function */
-static void purple_im_conversation_init(PurpleIMConversation *im)
-{
-}
-
-/* Called when done constructing */
-static void
-purple_im_conversation_constructed(GObject *object)
-{
- PurpleIMConversation *im = PURPLE_IM_CONVERSATION(object);
- PurpleAccount *account;
- PurpleBuddyIcon *icon;
- gchar *name;
-
- G_OBJECT_CLASS(purple_im_conversation_parent_class)->
- constructed(object);
-
- g_object_get(object,
- "account", &account,
- "name", &name,
- NULL);
-
- if ((icon = purple_buddy_icons_find(account, name)))
- {
- purple_im_conversation_set_icon(im, icon);
- /* purple_im_conversation_set_icon refs the icon. */
- purple_buddy_icon_unref(icon);
- }
-
- if (purple_prefs_get_bool("/purple/logging/log_ims"))
- purple_conversation_set_logging(PURPLE_CONVERSATION(im), TRUE);
-
- g_object_unref(account);
- g_free(name);
-}
-
-/* GObject dispose function */
-static void
-purple_im_conversation_dispose(GObject *object)
-{
- PurpleIMConversationPrivate *priv =
- purple_im_conversation_get_instance_private(
- PURPLE_IM_CONVERSATION(object));
-
- if (priv->icon) {
- purple_buddy_icon_unref(priv->icon);
- priv->icon = NULL;
- }
-
- G_OBJECT_CLASS(purple_im_conversation_parent_class)->dispose(object);
-}
-
-/* GObject finalize function */
-static void
-purple_im_conversation_finalize(GObject *object)
-{
- PurpleIMConversation *im = PURPLE_IM_CONVERSATION(object);
- PurpleConnection *gc = purple_conversation_get_connection(PURPLE_CONVERSATION(im));
- PurpleProtocol *protocol = NULL;
- const char *name = purple_conversation_get_name(PURPLE_CONVERSATION(im));
-
- if (gc != NULL)
- {
- /* Still connected */
- protocol = purple_connection_get_protocol(gc);
-
- if (purple_prefs_get_bool("/purple/conversations/im/send_typing"))
- purple_serv_send_typing(gc, name, PURPLE_IM_NOT_TYPING);
-
- purple_protocol_client_iface_convo_closed(protocol, gc, name);
- }
-
- purple_im_conversation_stop_typing_timeout(im);
- purple_im_conversation_stop_send_typed_timeout(im);
-
- G_OBJECT_CLASS(purple_im_conversation_parent_class)->finalize(object);
-}
-
-/* Class initializer function */
-static void purple_im_conversation_class_init(PurpleIMConversationClass *klass)
-{
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- PurpleConversationClass *conv_class = PURPLE_CONVERSATION_CLASS(klass);
-
- obj_class->dispose = purple_im_conversation_dispose;
- obj_class->finalize = purple_im_conversation_finalize;
- obj_class->constructed = purple_im_conversation_constructed;
-
- /* Setup properties */
- obj_class->get_property = purple_im_conversation_get_property;
- obj_class->set_property = purple_im_conversation_set_property;
-
- conv_class->write_message = im_conversation_write_message;
-
- im_properties[IM_PROP_TYPING_STATE] =
- g_param_spec_enum("typing-state", "Typing state",
- "Status of the user's typing of a message.",
- PURPLE_TYPE_IM_TYPING_STATE, PURPLE_IM_NOT_TYPING,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-
- im_properties[IM_PROP_ICON] = g_param_spec_pointer(
- "icon", "Buddy icon", "The buddy icon for the IM.",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-
- g_object_class_install_properties(obj_class, IM_PROP_LAST, im_properties);
-}
-
-PurpleIMConversation *
-purple_im_conversation_new(PurpleAccount *account, const char *name)
-{
- PurpleIMConversation *im;
- PurpleConnection *gc;
-
- g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
- g_return_val_if_fail(name != NULL, NULL);
-
- /* Check if this conversation already exists. */
- if ((im = purple_conversations_find_im_with_account(name, account)) != NULL)
- return im;
-
- gc = purple_account_get_connection(account);
- g_return_val_if_fail(PURPLE_IS_CONNECTION(gc), NULL);
-
- im = g_object_new(PURPLE_TYPE_IM_CONVERSATION,
- "account", account,
- "name", name,
- "title", name,
- NULL);
-
- return im;
-}
-
-/**************************************************************************
* Chat Conversation API
**************************************************************************/
static guint