/****************************************************************************** * Helpers *****************************************************************************/ static gboolean irssi_window_close_cb(PurpleConversation *c) { /* this gets called from a conversation since the conversation must exist * until all of the commands are processed, and the output is output. */ purple_conversation_destroy(c); return FALSE; }
static inline void stress_close_convs(PurpleAccount *account, const gchar *name) { PurpleConversation *conv = NULL; conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, name, account); if(conv) purple_conversation_destroy(conv); }
struct groupchat *purple_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password, set_t **sets) { struct purple_data *pd = ic->proto_data; PurplePlugin *prpl = purple_plugins_find_with_id(pd->account->protocol_id); PurplePluginProtocolInfo *pi = prpl->info->extra_info; GHashTable *chat_hash; PurpleConversation *conv; GList *info, *l; if (!pi->chat_info || !pi->chat_info_defaults || !(info = pi->chat_info(purple_account_get_connection(pd->account)))) { imcb_error(ic, "Joining chatrooms not supported by this protocol"); return NULL; } if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, room, pd->account))) { purple_conversation_destroy(conv); } chat_hash = pi->chat_info_defaults( purple_account_get_connection(pd->account), room ); for (l = info; l; l = l->next) { struct proto_chat_entry *pce = l->data; if (strcmp(pce->identifier, "handle") == 0) { g_hash_table_replace(chat_hash, "handle", g_strdup(nick)); } else if (strcmp(pce->identifier, "password") == 0) { g_hash_table_replace(chat_hash, "password", g_strdup(password)); } else if (strcmp(pce->identifier, "passwd") == 0) { g_hash_table_replace(chat_hash, "passwd", g_strdup(password)); } g_free(pce); } g_list_free(info); serv_join_chat(purple_account_get_connection(pd->account), chat_hash); g_hash_table_destroy(chat_hash); return imcb_chat_new(ic, room); }
static void stroke_close(GtkWidget *widget, void *data) { PurpleConversation *conv; PidginConversation *gtkconv; conv = (PurpleConversation *)data; /* Double-check */ if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) return; gtkconv = PIDGIN_CONVERSATION(conv); gstroke_cleanup(gtkconv->imhtml); purple_conversation_destroy(conv); }
bool PurpleIMChat::closeSessionCbk(void * dataIn) { Mutex::ScopedLock lock(PurpleIMChat::_mutex); PurpleIMChatCallbackData* cbData = (PurpleIMChatCallbackData*) dataIn; IMChatSession* chatSession = cbData->getIMChatSession(); mConvInfo_t *mConv = FindChatStructById(chatSession->getId()); PurpleConversation *gConv = mConv->purple_conv_session; //VOXOX - JRT - 2009.07.09 if (mConv != NULL) { purple_conversation_destroy(gConv); RemoveChatSessionFromList(chatSession->getId()); } timeoutRemove( cbData ); delete cbData; return TRUE; }
void AccountCollector::collectNow(PurpleAccount *account, bool remove) { if (account->ui_data == NULL) { Log("AccountCollector","freeing account " << purple_account_get_username(account)); if (remove) g_hash_table_remove(m_accounts, purple_account_get_username(account)); purple_account_set_enabled(account, purple_core_get_ui(), FALSE); purple_notify_close_with_handle(account); purple_request_close_with_handle(account); purple_accounts_remove(account); GSList *buddies = purple_find_buddies(account, NULL); while(buddies) { PurpleBuddy *b = (PurpleBuddy *) buddies->data; purple_blist_remove_buddy(b); buddies = g_slist_delete_link(buddies, buddies); } /* Remove any open conversation for this account */ for (GList *it = purple_get_conversations(); it; ) { PurpleConversation *conv = (PurpleConversation *) it->data; it = it->next; if (purple_conversation_get_account(conv) == account) purple_conversation_destroy(conv); } /* Remove this account's pounces */ // purple_pounce_destroy_all_by_account(account); /* This will cause the deletion of an old buddy icon. */ purple_buddy_icons_set_account_icon(account, NULL, 0); purple_account_destroy(account); // VALGRIND_DO_LEAK_CHECK; } }
static void msn_switchboard_add_user(MsnSwitchBoard *swboard, const char *user) { MsnCmdProc *cmdproc; PurpleAccount *account; g_return_if_fail(swboard != NULL); cmdproc = swboard->cmdproc; account = cmdproc->session->account; swboard->users = g_list_prepend(swboard->users, g_strdup(user)); swboard->current_users++; swboard->empty = FALSE; if (purple_debug_is_verbose()) purple_debug_info("msn", "user=[%s], total=%d\n", user, swboard->current_users); if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL)) { /* This is a helper switchboard. */ purple_debug_error("msn", "switchboard_add_user: conv != NULL\n"); return; } if ((swboard->conv != NULL) && (purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) { purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL, PURPLE_CBFLAGS_NONE, TRUE); msn_servconn_set_idle_timeout(swboard->servconn, 0); } else if (swboard->current_users > 1 || swboard->total_users > 1) { msn_servconn_set_idle_timeout(swboard->servconn, 0); if (swboard->conv == NULL || purple_conversation_get_type(swboard->conv) != PURPLE_CONV_TYPE_CHAT) { GList *l; #if 0 /* this is bad - it causes msn_switchboard_close to be called on the * switchboard we're in the middle of using :( */ if (swboard->conv != NULL) purple_conversation_destroy(swboard->conv); #endif swboard->chat_id = msn_switchboard_get_chat_id(); swboard->flag |= MSN_SB_FLAG_IM; swboard->conv = serv_got_joined_chat(account->gc, swboard->chat_id, "MSN Chat"); for (l = swboard->users; l != NULL; l = l->next) { const char *tmp_user; tmp_user = l->data; purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), tmp_user, NULL, PURPLE_CBFLAGS_NONE, TRUE); } purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), purple_account_get_username(account), NULL, PURPLE_CBFLAGS_NONE, TRUE); g_free(swboard->im_user); swboard->im_user = NULL; } } else if (swboard->conv == NULL) { swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, user, account); } else { purple_debug_warning("msn", "switchboard_add_user: This should not happen!\n"); } }
void purple_chat_leave( struct groupchat *gc ) { PurpleConversation *pc = gc->data; purple_conversation_destroy( pc ); }
static void msn_switchboard_add_user(MsnSwitchBoard *swboard, const char *user) { MsnCmdProc *cmdproc; PurpleAccount *account; MsnUserList *userlist; MsnUser *msnuser; char *semicolon; char *passport; g_return_if_fail(swboard != NULL); cmdproc = swboard->cmdproc; account = cmdproc->session->account; semicolon = strchr(user, ';'); /* We don't really care about the machine ID. */ if (semicolon) passport = g_strndup(user, semicolon - user); else passport = g_strdup(user); userlist = swboard->session->userlist; msnuser = msn_userlist_find_user(userlist, passport); /* Don't add multiple endpoints to the conversation. */ if (g_list_find_custom(swboard->users, passport, (GCompareFunc)msn_user_passport_cmp)) { g_free(passport); return; } /* Don't add ourselves either... */ if (g_str_equal(passport, purple_account_get_username(account))) { g_free(passport); return; } if (!msnuser) { purple_debug_info("msn","User %s is not on our list.\n", passport); msnuser = msn_user_new(userlist, passport, NULL); } else msn_user_ref(msnuser); g_free(passport); swboard->users = g_list_prepend(swboard->users, msnuser); swboard->current_users++; swboard->empty = FALSE; if (purple_debug_is_verbose()) purple_debug_info("msn", "user=[%s], total=%d\n", user, swboard->current_users); if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL)) { /* This is a helper switchboard. */ purple_debug_error("msn", "switchboard_add_user: conv != NULL\n"); return; } if ((swboard->conv != NULL) && (purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) { purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), msnuser->passport, NULL, PURPLE_CBFLAGS_NONE, TRUE); msn_servconn_set_idle_timeout(swboard->servconn, 0); } else if (swboard->current_users > 1) { msn_servconn_set_idle_timeout(swboard->servconn, 0); if (swboard->conv == NULL || purple_conversation_get_type(swboard->conv) != PURPLE_CONV_TYPE_CHAT) { GList *l; #if 0 /* this is bad - it causes msn_switchboard_close to be called on the * switchboard we're in the middle of using :( */ if (swboard->conv != NULL) purple_conversation_destroy(swboard->conv); #endif swboard->chat_id = msn_switchboard_get_chat_id(); swboard->flag |= MSN_SB_FLAG_IM; swboard->conv = serv_got_joined_chat(account->gc, swboard->chat_id, "MSN Chat"); for (l = swboard->users; l != NULL; l = l->next) { const char *tmp_user; tmp_user = ((MsnUser*)l->data)->passport; purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), tmp_user, NULL, PURPLE_CBFLAGS_NONE, TRUE); } purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), purple_account_get_username(account), NULL, PURPLE_CBFLAGS_NONE, TRUE); g_free(swboard->im_user); swboard->im_user = NULL; } } else if (swboard->conv == NULL) { swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, msnuser->passport, account); } else { purple_debug_warning("msn", "switchboard_add_user: This should not happen!\n"); } }
static gboolean close_already(gpointer data) { purple_conversation_destroy(data); return FALSE; }
void PurpleChatMngr::CreateConversationCbk(PurpleConversation *conv, bool userCreated) { PurpleAccount* gAccount = purple_conversation_get_account(conv); PurpleConversationType chatType = purple_conversation_get_type(conv); const char* gPrclId = purple_account_get_protocol_id(gAccount); IMAccount* account = _accountMngr->FindIMAccount(purple_account_get_username(gAccount), PurpleIMPrcl::GetEnumIMProtocol(gPrclId)); //VOXOX - JRT - 2009.07.20 - We seem to get a lot of crashes through here, via skype_find_chat. I suspect account is not being found. if ( account == NULL ) { std::string username = purple_account_get_username(gAccount); LOG_ERROR(" account == NULL for " + username + "\n"); } PurpleIMChat* mChat = FindIMChat(*account); mConvInfo_t* mConv = NULL; if (chatType == PURPLE_CONV_TYPE_IM) { IMChatSession *chatSession = NULL; // Check if it's a jabber contact, remove the resource std::string contactId = cleanContactId(std::string(purple_conversation_get_name(conv)), PurpleIMPrcl::GetEnumIMProtocol(gPrclId)); IMContact imContact(*account, contactId); mConv = mChat->CreateChatSession(userCreated, *mChat); mConv->purple_conv_session = conv; conv->ui_data = mConv; // chatSession = (IMChatSession *) mConv->conv_session; chatSession = mConv->conv_session; //VOXOX - JRT - 2009.07.09 - changed def from void* to IMChatSession* ((IMContactSet &) chatSession->getIMContactSet()).insert(imContact); //VOXOX CHANGE CJC - validate if message don't have to be sent automatically if(userCreated) { if(mChat->getAutoMessage() != "") { mChat->newIMChatAndSendMessageSessionCreatedEvent(*mChat, *((IMChatSession *)(mConv->conv_session)),mChat->getAutoMessage(),true); } else { switch( mChat->getIMChatType() ) { case IMChat::ChatToEmail: mChat->newIMChatToEmailSessionCreatedEvent(*mChat, *(mConv->conv_session)); //VOXOX - JRT - 2009.07.09 mChat->contactAddedEvent(*mChat, *chatSession, imContact); break; case IMChat::ChatToSMS: mChat->newIMChatToSMSSessionCreatedEvent(*mChat, *(mConv->conv_session)); //VOXOX - JRT - 2009.07.09 mChat->contactAddedEvent(*mChat, *chatSession, imContact); break; case IMChat::Chat: case IMChat::ChatGroup: //VOXOX - JRT - 2009.06.15 - we don't really expect this type. mChat->newIMChatSessionCreatedEvent(*mChat, *chatSession); mChat->contactAddedEvent(*mChat, *chatSession, imContact); break; default: assert(false); //New IMChatType? } } } else { mChat->newIMChatSessionCreatedEvent(*mChat, *chatSession); mChat->contactAddedEvent(*mChat, *chatSession, imContact); } } else if (chatType == PURPLE_CONV_TYPE_CHAT) { // int id = GetPurpleConversationId(purple_conversation_get_name(conv)); //VOXOX - JRT - 2009.06.16 - This does not work because it relies on CR name having ID as part of name. // int id = mChat->getGroupChatInfo().getId(); // if ((mConv = mChat->FindChatStructById(id)) == NULL) if ((mConv = mChat->FindChatStructByName( conv->name )) == NULL) { mConv = mChat->CreateChatSession(userCreated, *mChat); IMChatSession* chatSession = mConv->conv_session; //VOXOX - JRT - 2009.07.09 if ( chatSession ) { chatSession->setIMChatType( IMChat::ChatGroup ); // GroupChatInfo& gcInfo = chatSession->getIMChat().getGroupChatInfo(); GroupChatInfo& gcInfo = chatSession->getGroupChatInfo(); gcInfo.setId ( mConv->conv_id ); gcInfo.setChatRoom( conv->name ); } } if (mConv->purple_conv_session) purple_conversation_destroy(mConv->purple_conv_session); //VOXOX - JRT - 2009.07.09 mConv->purple_conv_session = conv; conv->ui_data = mConv; } }