diff options
author | Gary Kramlich <grim@reaperworld.com> | 2020-08-13 18:29:17 -0500 |
---|---|---|
committer | Gary Kramlich <grim@reaperworld.com> | 2020-08-13 18:29:17 -0500 |
commit | eed4b41fcde498a6883d63a547ecac2135de6d1b (patch) | |
tree | 2bae034b8ecf418582b0483ac9c9625044ff2d7b /libpurple/conversationtypes.c | |
parent | 943018e236b4e910c9942d3cca3ccd19d73005bc (diff) | |
download | pidgin-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.c | 459 |
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 |