MsnSession * msn_session_new(PurpleAccount *account) { MsnSession *session; g_return_val_if_fail(account != NULL, NULL); session = g_new0(MsnSession, 1); session->http_reqs = purple_http_connection_set_new(); session->account = account; session->notification = msn_notification_new(session); session->userlist = msn_userlist_new(session); session->user = msn_user_new(session->userlist, purple_account_get_username(account), NULL); msn_userlist_add_user(session->userlist, session->user); session->oim = msn_oim_new(session); session->protocol_ver = 0; session->enable_mpop = TRUE; /* Default only */ session->guid = rand_guid(); session->soap = msn_soap_service_new(session); return session; }
MsnUser * msn_userlist_find_add_user(MsnUserList *userlist,const char *passport,const char *userName) { MsnUser *user; user = msn_userlist_find_user(userlist, passport); if (user == NULL) { user = msn_user_new(userlist, passport, userName); msn_userlist_add_user(userlist, user); } else { msn_user_set_friendly_name(user, userName); } return user; }
MsnSession * msn_session_new(PurpleAccount *account) { MsnSession *session; g_return_val_if_fail(account != NULL, NULL); session = g_new0(MsnSession, 1); session->account = account; session->notification = msn_notification_new(session); session->userlist = msn_userlist_new(session); session->user = msn_user_new(session->userlist, purple_account_get_username(account), NULL); session->protocol_ver = 9; return session; }
static void add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnSession *session; MsnUser *user; const char *list; const char *passport; const char *friendly; MsnListId list_id; int group_id; list = cmd->params[1]; passport = cmd->params[3]; friendly = gaim_url_decode(cmd->params[4]); session = cmdproc->session; user = msn_userlist_find_user(session->userlist, passport); if (user == NULL) { user = msn_user_new(session->userlist, passport, friendly); msn_userlist_add_user(session->userlist, user); } else msn_user_set_friendly_name(user, friendly); list_id = msn_get_list_id(list); if (cmd->param_count >= 6) group_id = atoi(cmd->params[5]); else group_id = -1; msn_got_add_user(session, user, list_id, group_id); msn_user_update(user); }
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"); } }