static void chatroom_manager_observe_channel_cb (EmpathyDispatcher *dispatcher, EmpathyDispatchOperation *operation, gpointer manager) { EmpathyChatroomManagerPriv *priv = GET_PRIV (manager); EmpathyChatroom *chatroom; TpChannel *channel; EmpathyTpChat *chat; const gchar *roomname; GQuark channel_type; TpHandleType handle_type; EmpathyAccount *account; TpConnection *connection; channel_type = empathy_dispatch_operation_get_channel_type_id (operation); /* Observe Text channels to rooms only */ if (channel_type != TP_IFACE_QUARK_CHANNEL_TYPE_TEXT) return; channel = empathy_dispatch_operation_get_channel (operation); tp_channel_get_handle (channel, &handle_type); if (handle_type != TP_HANDLE_TYPE_ROOM) return; chat = EMPATHY_TP_CHAT ( empathy_dispatch_operation_get_channel_wrapper (operation)); connection = empathy_tp_chat_get_connection (chat); account = empathy_account_manager_get_account_for_connection ( priv->account_manager, connection); roomname = empathy_tp_chat_get_id (chat); chatroom = empathy_chatroom_manager_find (manager, account, roomname); if (chatroom == NULL) { chatroom = empathy_chatroom_new_full (account, roomname, roomname, FALSE); empathy_chatroom_set_tp_chat (chatroom, chat); empathy_chatroom_manager_add (manager, chatroom); g_object_unref (chatroom); } else { empathy_chatroom_set_tp_chat (chatroom, chat); } /* A TpChat is always destroyed as it only gets unreffed after the channel * has been invalidated in the dispatcher.. */ g_signal_connect (chat, "destroy", G_CALLBACK (chatroom_manager_chat_destroyed_cb), manager); }
static void observe_channels_cb (TpSimpleObserver *observer, TpAccount *account, TpConnection *connection, GList *channels, TpChannelDispatchOperation *dispatch_operation, GList *requests, TpObserveChannelsContext *context, gpointer user_data) { EmpathyChatroomManager *self = user_data; GList *l; for (l = channels; l != NULL; l = g_list_next (l)) { EmpathyTpChat *tp_chat = l->data; const gchar *roomname; EmpathyChatroom *chatroom; if (tp_proxy_get_invalidated ((TpChannel *) tp_chat) != NULL) continue; if (!EMPATHY_IS_TP_CHAT (tp_chat)) continue; roomname = empathy_tp_chat_get_id (tp_chat); chatroom = empathy_chatroom_manager_find (self, account, roomname); if (chatroom == NULL) { chatroom = empathy_chatroom_new_full (account, roomname, roomname, FALSE); empathy_chatroom_manager_add (self, chatroom); g_object_unref (chatroom); } empathy_chatroom_set_tp_chat (chatroom, tp_chat); g_signal_connect (tp_chat, "invalidated", G_CALLBACK (chatroom_manager_chat_invalidated_cb), self); } tp_observe_channels_context_accept (context); }
EmpathyChatroom * empathy_chatroom_manager_ensure_chatroom (EmpathyChatroomManager *manager, TpAccount *account, const gchar *room, const gchar *name) { EmpathyChatroom *chatroom; chatroom = empathy_chatroom_manager_find (manager, account, room); if (chatroom) { return g_object_ref (chatroom); } else { chatroom = empathy_chatroom_new_full (account, room, name, FALSE); empathy_chatroom_manager_add (manager, chatroom); return chatroom; } }
END_TEST START_TEST (test_empathy_chatroom_manager_change_favorite) { EmpathyChatroomManager *mgr; gchar *file; EmpathyAccount *account; EmpathyAccountManager *account_manager; struct chatroom_t chatrooms[] = { { "name1", "room1", TRUE, TRUE }, { "name2", "room2", FALSE, FALSE }}; EmpathyChatroom *chatroom; account_manager = empathy_account_manager_dup_singleton (); account = get_test_account (); copy_xml_file (CHATROOM_SAMPLE, CHATROOM_FILE); file = get_user_xml_file (CHATROOM_FILE); /* change the chatrooms XML file to use the account we just created */ fail_unless (change_account_name_in_file (account, file)); mgr = empathy_chatroom_manager_dup_singleton (file); /* room2 is not favorite anymore */ chatroom = empathy_chatroom_manager_find (mgr, account, "room2"); fail_if (chatroom == NULL); g_object_set (chatroom, "favorite", FALSE, NULL); check_chatrooms_list (mgr, account, chatrooms, 2); /* reload chatrooms file */ g_object_unref (mgr); mgr = empathy_chatroom_manager_dup_singleton (file); /* room2 is not present in the XML file anymore as it's not a favorite */ check_chatrooms_list (mgr, account, chatrooms, 1); /* re-add room2 */ chatroom = empathy_chatroom_new_full (account, "room2", "name2", FALSE); empathy_chatroom_manager_add (mgr, chatroom); check_chatrooms_list (mgr, account, chatrooms, 2); /* set room2 as favorite */ g_object_set (chatroom, "favorite", TRUE, NULL); chatrooms[1].favorite = TRUE; check_chatrooms_list (mgr, account, chatrooms, 2); /* reload chatrooms file */ g_object_unref (mgr); mgr = empathy_chatroom_manager_dup_singleton (file); /* room2 is back in the XML file now */ check_chatrooms_list (mgr, account, chatrooms, 2); g_object_unref (mgr); g_object_unref (chatroom); g_free (file); g_object_unref (account_manager); g_object_unref (account); }
END_TEST START_TEST (test_empathy_chatroom_manager_add) { EmpathyChatroomManager *mgr; gchar *file; EmpathyAccount *account; EmpathyAccountManager *account_manager; struct chatroom_t chatrooms[] = { { "name1", "room1", TRUE, TRUE }, { "name2", "room2", FALSE, TRUE }, { "name3", "room3", FALSE, TRUE }, { "name4", "room4", FALSE, FALSE }}; EmpathyChatroom *chatroom; account_manager = empathy_account_manager_dup_singleton (); account = get_test_account (); copy_xml_file (CHATROOM_SAMPLE, CHATROOM_FILE); file = get_user_xml_file (CHATROOM_FILE); /* change the chatrooms XML file to use the account we just created */ fail_unless (change_account_name_in_file (account, file)); mgr = empathy_chatroom_manager_dup_singleton (file); /* add a favorite chatroom */ chatroom = empathy_chatroom_new_full (account, "room3", "name3", FALSE); g_object_set (chatroom, "favorite", TRUE, NULL); empathy_chatroom_manager_add (mgr, chatroom); g_object_unref (chatroom); check_chatrooms_list (mgr, account, chatrooms, 3); /* reload chatrooms file */ g_object_unref (mgr); mgr = empathy_chatroom_manager_dup_singleton (file); /* chatroom has been added to the XML file as it's a favorite */ check_chatrooms_list (mgr, account, chatrooms, 3); /* add a non favorite chatroom */ chatroom = empathy_chatroom_new_full (account, "room4", "name4", FALSE); g_object_set (chatroom, "favorite", FALSE, NULL); empathy_chatroom_manager_add (mgr, chatroom); g_object_unref (chatroom); check_chatrooms_list (mgr, account, chatrooms, 4); /* reload chatrooms file */ g_object_unref (mgr); mgr = empathy_chatroom_manager_dup_singleton (file); /* chatrooms has not been added to the XML file */ check_chatrooms_list (mgr, account, chatrooms, 3); g_object_unref (mgr); g_free (file); g_object_unref (account_manager); g_object_unref (account); }