static void request_own_user_display(MsnUser *user) { PurpleAccount *account; MsnSession *session; MsnObject *my_obj = NULL; gconstpointer data = NULL; const char *info = NULL; size_t len = 0; if (purple_debug_is_verbose()) purple_debug_info("msn", "Requesting our own user display\n"); session = user->userlist->session; account = session->account; my_obj = msn_user_get_object(user); if (my_obj != NULL) { PurpleStoredImage *img = msn_object_get_image(my_obj); data = purple_imgstore_get_data(img); len = purple_imgstore_get_size(img); info = msn_object_get_sha1(my_obj); } purple_buddy_icons_set_for_user(account, user->passport, g_memdup(data, len), len, info); /* Free one window slot */ session->userlist->buddy_icon_window++; if (purple_debug_is_verbose()) purple_debug_info("msn", "msn_request_user_display(): buddy_icon_window++ yields =%d\n", session->userlist->buddy_icon_window); msn_release_buddy_icon_request(session->userlist); }
void msn_request_user_display(MsnUser *user) { PurpleAccount *account; MsnSession *session; MsnSlpLink *slplink; MsnObject *obj; const char *info; session = user->userlist->session; account = session->account; slplink = msn_session_get_slplink(session, user->passport); obj = msn_user_get_object(user); info = msn_object_get_sha1(obj); if (g_ascii_strcasecmp(user->passport, purple_account_get_username(account))) { const char *url = msn_object_get_url1(obj); if (url) { PurpleHttpRequest *req; MsnFetchUserDisplayData *data = g_new0(MsnFetchUserDisplayData, 1); data->session = session; data->remote_user = user->passport; data->sha1 = info; req = purple_http_request_new(url); purple_http_request_set_max_len(req, 200*1024); purple_http_connection_set_add(session->http_reqs, purple_http_request(NULL, req, fetched_user_display, data)); purple_http_request_unref(req); } else { msn_slplink_request_object(slplink, info, got_user_display, end_user_display, obj); } } else request_own_user_display(user); }
void msn_user_set_buddy_icon(MsnUser *user, const char *filename) { struct stat st; FILE *fp; MsnObject *msnobj = msn_user_get_object(user); g_return_if_fail(user != NULL); if (filename == NULL || g_stat(filename, &st) == -1) { msn_user_set_object(user, NULL); } else if ((fp = g_fopen(filename, "rb")) != NULL) { unsigned char *buf; SHA_CTX ctx; gsize len; char *base64; unsigned char digest[20]; if (msnobj == NULL) { msnobj = msn_object_new(TRUE); msn_object_set_local(msnobj); msn_object_set_type(msnobj, MSN_OBJECT_USERTILE); msn_object_set_location(msnobj, "TFR2C2.tmp"); msn_object_set_creator(msnobj, msn_user_get_passport(user)); msn_user_set_object(user, msnobj); } msn_object_set_real_location(msnobj, filename); buf = g_malloc(st.st_size); len = fread(buf, 1, st.st_size, fp); fclose(fp); /* Compute the SHA1D field. */ memset(digest, 0, sizeof(digest)); shaInit(&ctx); shaUpdate(&ctx, buf, st.st_size); shaFinal(&ctx, digest); g_free(buf); base64 = gaim_base64_encode(digest, sizeof(digest)); msn_object_set_sha1d(msnobj, base64); g_free(base64); msn_object_set_size(msnobj, st.st_size); /* Compute the SHA1C field. */ buf = g_strdup_printf( "Creator%sSize%dType%dLocation%sFriendly%sSHA1D%s", msn_object_get_creator(msnobj), msn_object_get_size(msnobj), msn_object_get_type(msnobj), msn_object_get_location(msnobj), msn_object_get_friendly(msnobj), msn_object_get_sha1d(msnobj)); memset(digest, 0, sizeof(digest)); shaInit(&ctx); shaUpdate(&ctx, buf, strlen(buf)); shaFinal(&ctx, digest); g_free(buf); base64 = gaim_base64_encode(digest, sizeof(digest)); msn_object_set_sha1c(msnobj, base64); g_free(base64); } else { gaim_debug_error("msn", "Unable to open buddy icon %s!\n", filename); msn_user_set_object(user, NULL); } }
void msn_change_status(MsnSession *session) { PurpleAccount *account; MsnCmdProc *cmdproc; MsnTransaction *trans; MsnUser *user; MsnObject *msnobj; const char *state_text; GHashTable *ui_info = purple_core_get_ui_info(); MsnClientCaps caps = MSN_CLIENT_ID; g_return_if_fail(session != NULL); g_return_if_fail(session->notification != NULL); /* set client caps based on what the UI tells us it is... */ if (ui_info) { const gchar *client_type = g_hash_table_lookup(ui_info, "client_type"); if (client_type) { if (strcmp(client_type, "phone") == 0 || strcmp(client_type, "handheld") == 0) { caps |= MSN_CAP_VIA_MOBILE; } else if (strcmp(client_type, "web") == 0) { caps |= MSN_CAP_VIA_WEBIM; } else if (strcmp(client_type, "bot") == 0) { caps |= MSN_CAP_BOT; } /* MSN doesn't a "console" type... What, they have no ncurses UI? :-) */ } } account = session->account; cmdproc = session->notification->cmdproc; user = session->user; state_text = msn_state_get_text(msn_state_from_account(account)); /* If we're not logged in yet, don't send the status to the server, * it will be sent when login completes */ if (!session->logged_in) return; msn_set_psm(session); msnobj = msn_user_get_object(user); if (msnobj == NULL) { trans = msn_transaction_new(cmdproc, "CHG", "%s %u:%02u 0", state_text, caps, MSN_CLIENT_ID_EXT_CAPS); } else { char *msnobj_str; msnobj_str = msn_object_to_string(msnobj); trans = msn_transaction_new(cmdproc, "CHG", "%s %u:%02u %s", state_text, caps, MSN_CLIENT_ID_EXT_CAPS, purple_url_encode(msnobj_str)); g_free(msnobj_str); } msn_cmdproc_send_trans(cmdproc, trans); }