--- a/libpurple/blistnodetypes.c Fri Aug 12 17:08:19 2016 -0500 +++ b/libpurple/blistnodetypes.c Fri Aug 12 18:53:31 2016 -0500 @@ -69,31 +69,9 @@ BUDDY_PROP_LAST }; -/* Private data for a chat node */ -struct _PurpleChatPrivate { - char *alias; /* The display name of this chat. */ - PurpleAccount *account; /* The account this chat is attached to */ - GHashTable *components; /* the stuff the protocol needs to know to - join the chat */ - - gboolean is_constructed; /* Indicates if the chat has finished being - constructed. */ -}; - -/* Chat property enums */ -enum -{ - CHAT_PROP_0, - CHAT_PROP_ALIAS, - CHAT_PROP_ACCOUNT, - CHAT_PROP_COMPONENTS, - CHAT_PROP_LAST -}; - static PurpleBlistNode *blistnode_parent_class; static GParamSpec *bd_properties[BUDDY_PROP_LAST]; -static GParamSpec *ch_properties[CHAT_PROP_LAST]; static gboolean purple_strings_are_different(const char *one, const char *two) @@ -737,278 +715,3 @@ "local-alias", alias, NULL); } - -/**************************************************************************/ -/* Chat API */ -/**************************************************************************/ - -const char *purple_chat_get_name(PurpleChat *chat) -{ - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - - g_return_val_if_fail(priv != NULL, NULL); - - if ((priv->alias != NULL) && (*priv->alias != '\0')) - return priv->alias; - - return purple_chat_get_name_only(chat); -} - -const char *purple_chat_get_name_only(PurpleChat *chat) -{ - char *ret = NULL; - PurpleProtocol *protocol = NULL; - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - - g_return_val_if_fail(priv != NULL, NULL); - - protocol = purple_protocols_find(purple_account_get_protocol_id(priv->account)); - - if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, CHAT_IFACE, info)) { - PurpleProtocolChatEntry *pce; - GList *parts = purple_protocol_chat_iface_info(protocol, purple_account_get_connection(priv->account)); - pce = parts->data; - ret = g_hash_table_lookup(priv->components, pce->identifier); - g_list_foreach(parts, (GFunc)g_free, NULL); - g_list_free(parts); - } - - return ret; -} - -void -purple_chat_set_alias(PurpleChat *chat, const char *alias) -{ - PurpleBlistUiOps *ops = purple_blist_get_ui_ops(); - char *old_alias; - char *new_alias = NULL; - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - - g_return_if_fail(priv != NULL); - - if ((alias != NULL) && (*alias != '\0')) - new_alias = purple_utf8_strip_unprintables(alias); - - if (!purple_strings_are_different(priv->alias, new_alias)) { - g_free(new_alias); - return; - } - - old_alias = priv->alias; - - if ((new_alias != NULL) && (*new_alias != '\0')) - priv->alias = new_alias; - else { - priv->alias = NULL; - g_free(new_alias); /* could be "\0" */ - } - - g_object_notify_by_pspec(G_OBJECT(chat), ch_properties[CHAT_PROP_ALIAS]); - - if (ops) { - if (ops->save_node) - ops->save_node(PURPLE_BLIST_NODE(chat)); - if (ops->update) - ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(chat)); - } - - purple_signal_emit(purple_blist_get_handle(), "blist-node-aliased", - chat, old_alias); - g_free(old_alias); -} - -PurpleGroup * -purple_chat_get_group(PurpleChat *chat) -{ - g_return_val_if_fail(PURPLE_IS_CHAT(chat), NULL); - - return PURPLE_GROUP(PURPLE_BLIST_NODE(chat)->parent); -} - -PurpleAccount * -purple_chat_get_account(PurpleChat *chat) -{ - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - - g_return_val_if_fail(priv != NULL, NULL); - - return priv->account; -} - -GHashTable * -purple_chat_get_components(PurpleChat *chat) -{ - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - - g_return_val_if_fail(priv != NULL, NULL); - - return priv->components; -} - -/************************************************************************** - * GObject code for PurpleChat - **************************************************************************/ - -/* Set method for GObject properties */ -static void -purple_chat_set_property(GObject *obj, guint param_id, const GValue *value, - GParamSpec *pspec) -{ - PurpleChat *chat = PURPLE_CHAT(obj); - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - - switch (param_id) { - case CHAT_PROP_ALIAS: - if (priv->is_constructed) - purple_chat_set_alias(chat, g_value_get_string(value)); - else - priv->alias = - purple_utf8_strip_unprintables(g_value_get_string(value)); - break; - case CHAT_PROP_ACCOUNT: - priv->account = g_value_get_object(value); - break; - case CHAT_PROP_COMPONENTS: - priv->components = 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_chat_get_property(GObject *obj, guint param_id, GValue *value, - GParamSpec *pspec) -{ - PurpleChat *chat = PURPLE_CHAT(obj); - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - - switch (param_id) { - case CHAT_PROP_ALIAS: - g_value_set_string(value, priv->alias); - break; - case CHAT_PROP_ACCOUNT: - g_value_set_object(value, purple_chat_get_account(chat)); - break; - case CHAT_PROP_COMPONENTS: - g_value_set_pointer(value, purple_chat_get_components(chat)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); - break; - } -} - -/* GObject initialization function */ -static void -purple_chat_init(GTypeInstance *instance, gpointer klass) -{ - PURPLE_DBUS_REGISTER_POINTER(PURPLE_CHAT(instance), PurpleChat); -} - -/* Called when done constructing */ -static void -purple_chat_constructed(GObject *object) -{ - PurpleChat *chat = PURPLE_CHAT(object); - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat); - PurpleBlistUiOps *ops = purple_blist_get_ui_ops(); - - G_OBJECT_CLASS(blistnode_parent_class)->constructed(object); - - if (ops != NULL && ops->new_node != NULL) - ops->new_node(PURPLE_BLIST_NODE(chat)); - - priv->is_constructed = TRUE; -} - -/* GObject finalize function */ -static void -purple_chat_finalize(GObject *object) -{ - PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(object); - - g_free(priv->alias); - g_hash_table_destroy(priv->components); - - PURPLE_DBUS_UNREGISTER_POINTER(object); - - G_OBJECT_CLASS(blistnode_parent_class)->finalize(object); -} - -/* Class initializer function */ -static void purple_chat_class_init(PurpleChatClass *klass) -{ - GObjectClass *obj_class = G_OBJECT_CLASS(klass); - - blistnode_parent_class = g_type_class_peek_parent(klass); - - obj_class->finalize = purple_chat_finalize; - - /* Setup properties */ - obj_class->get_property = purple_chat_get_property; - obj_class->set_property = purple_chat_set_property; - obj_class->constructed = purple_chat_constructed; - - g_type_class_add_private(klass, sizeof(PurpleChatPrivate)); - - ch_properties[CHAT_PROP_ALIAS] = g_param_spec_string("alias", "Alias", - "The alias for the chat.", NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); - - ch_properties[CHAT_PROP_ACCOUNT] = g_param_spec_object("account", "Account", - "The account that the chat belongs to.", PURPLE_TYPE_ACCOUNT, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS); - - ch_properties[CHAT_PROP_COMPONENTS] = g_param_spec_pointer("components", - "Components", - "The protocol components of the chat.", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS); - - g_object_class_install_properties(obj_class, CHAT_PROP_LAST, ch_properties); -} - -GType -purple_chat_get_type(void) -{ - static GType type = 0; - - if(type == 0) { - static const GTypeInfo info = { - sizeof(PurpleChatClass), - NULL, - NULL, - (GClassInitFunc)purple_chat_class_init, - NULL, - NULL, - sizeof(PurpleChat), - 0, - (GInstanceInitFunc)purple_chat_init, - NULL, - }; - - type = g_type_register_static(PURPLE_TYPE_BLIST_NODE, - "PurpleChat", - &info, 0); - } - - return type; -} - -PurpleChat * -purple_chat_new(PurpleAccount *account, const char *alias, GHashTable *components) -{ - g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL); - g_return_val_if_fail(components != NULL, NULL); - - return g_object_new(PURPLE_TYPE_CHAT, - "account", account, - "alias", alias, - "components", components, - NULL); -} -