void msn_sbconn_send_part(MsnSlpLink *slplink, MsnSlpMessagePart *part) { MsnMessage *msg; const char *passport; char *data; size_t size; msg = msn_message_new_msnslp(); passport = purple_normalize(slplink->session->account, slplink->remote_user); msn_message_set_header(msg, "P2P-Dest", passport); msg->part = msn_slpmsgpart_ref(part); data = msn_slpmsgpart_serialize(part, &size); msn_message_set_bin_data(msg, data, size); g_free(data); if (slplink->swboard == NULL) { slplink->swboard = msn_session_get_swboard(slplink->session, slplink->remote_user, MSN_SB_FLAG_FT); g_return_if_fail(slplink->swboard != NULL); /* If swboard is destroyed we will be too */ slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); } msn_switchboard_send_msg(slplink->swboard, msg, TRUE); msn_message_unref(msg); }
static void msn_slplink_release_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) { MsnMessage *msg; const char *passport; slpmsg->msg = msg = msn_message_new_msnslp(); if (slpmsg->flags == 0x0) { msg->msnslp_header.session_id = slpmsg->session_id; msg->msnslp_header.ack_id = rand() % 0xFFFFFF00; } else if (slpmsg->flags == 0x2) { msg->msnslp_header.session_id = slpmsg->session_id; msg->msnslp_header.ack_id = slpmsg->ack_id; msg->msnslp_header.ack_size = slpmsg->ack_size; msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id; } else if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000020 || slpmsg->flags == 0x1000030) { MsnSlpCall *slpcall; slpcall = slpmsg->slpcall; g_return_if_fail(slpcall != NULL); msg->msnslp_header.session_id = slpcall->session_id; msg->msnslp_footer.value = slpcall->app_id; msg->msnslp_header.ack_id = rand() % 0xFFFFFF00; } else if (slpmsg->flags == 0x100) { msg->msnslp_header.ack_id = slpmsg->ack_id; msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id; msg->msnslp_header.ack_size = slpmsg->ack_size; } msg->msnslp_header.id = slpmsg->id; msg->msnslp_header.flags = slpmsg->flags; msg->msnslp_header.total_size = slpmsg->size; passport = purple_normalize(slplink->session->account, slplink->remote_user); msn_message_set_attr(msg, "P2P-Dest", passport); msg->ack_cb = msg_ack; msg->nak_cb = msg_nak; msg->ack_data = slpmsg; msn_slplink_send_msgpart(slplink, slpmsg); msn_message_destroy(msg); }
void msn_slplink_release_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) { MsnMessage *msg; slpmsg->msg = msg = msn_message_new_msnslp(); if (slpmsg->flags == 0x0) { msg->msnslp_header.session_id = slpmsg->session_id; msg->msnslp_header.ack_id = rand() % 0xFFFFFF00; } else if (slpmsg->flags == 0x2) { msg->msnslp_header.session_id = slpmsg->session_id; msg->msnslp_header.ack_id = slpmsg->ack_id; msg->msnslp_header.ack_size = slpmsg->ack_size; msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id; } else if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) { MsnSlpSession *slpsession; slpsession = slpmsg->slpsession; g_return_if_fail(slpsession != NULL); msg->msnslp_header.session_id = slpsession->id; msg->msnslp_footer.value = slpsession->app_id; msg->msnslp_header.ack_id = rand() % 0xFFFFFF00; } else if (slpmsg->flags == 0x100) { msg->msnslp_header.ack_id = slpmsg->ack_id; msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id; msg->msnslp_header.ack_size = slpmsg->ack_size; } msg->msnslp_header.id = slpmsg->id; msg->msnslp_header.flags = slpmsg->flags; msg->msnslp_header.total_size = slpmsg->size; msn_message_set_attr(msg, "P2P-Dest", slplink->remote_user); msg->ack_cb = msg_ack; msg->nak_cb = msg_nak; msg->ack_data = slpmsg; msn_slplink_send_msgpart(slplink, slpmsg); msn_message_destroy(msg); }
static void read_cb(gpointer data, gint source, GaimInputCondition cond) { MsnDirectConn* directconn; char *body; size_t len, body_len; gaim_debug_info("msn", "read_cb: %d, %d\n", source, cond); directconn = data; /* Let's read the length of the data. */ len = read(directconn->fd, &body_len, sizeof(body_len)); if (len <= 0) { /* ERROR */ gaim_debug_error("msn", "error reading\n"); msn_directconn_destroy(directconn); return; } body_len = GUINT32_FROM_LE(body_len); gaim_debug_info("msn", "body_len=%d\n", body_len); if (body_len <= 0) { /* ERROR */ gaim_debug_error("msn", "error reading\n"); msn_directconn_destroy(directconn); return; } body = g_try_malloc(body_len); if (body != NULL) { /* Let's read the data. */ len = read(directconn->fd, body, body_len); gaim_debug_info("msn", "len=%d\n", len); } else { gaim_debug_error("msn", "Failed to allocate memory for read\n"); len = 0; } if (len > 0) { MsnMessage *msg; #ifdef DEBUG_DC str = g_strdup_printf("/home/revo/msntest/r%.4d.bin", directconn->c); FILE *tf = g_fopen(str, "w"); fwrite(body, 1, len, tf); fclose(tf); g_free(str); #endif directconn->c++; msg = msn_message_new_msnslp(); msn_message_parse_slp_body(msg, body, body_len); msn_directconn_process_msg(directconn, msg); } else { /* ERROR */ gaim_debug_error("msn", "error reading\n"); msn_directconn_destroy(directconn); } }
void msn_slp_session_request_user_display(MsnSlpSession *slpsession, MsnUser *local_user, MsnUser *remote_user, const MsnObject *obj) { MsnMessage *invite_msg; long session_id; char *msnobj_data; char *msnobj_base64; char *branch; char *content; char *body; g_return_if_fail(slpsession != NULL); g_return_if_fail(local_user != NULL); g_return_if_fail(remote_user != NULL); g_return_if_fail(obj != NULL); msnobj_data = msn_object_to_string(obj); msnobj_base64 = tobase64(msnobj_data, strlen(msnobj_data)); g_free(msnobj_data); #if 0 if ((c = strchr(msnobj_base64, '=')) != NULL) *c = '\0'; #endif session_id = rand() % 0xFFFFFF00 + 4; branch = g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X", rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111); slpsession->call_id = g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X", rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111, rand() % 0xAAFF + 0x1111); content = g_strdup_printf( "EUF-GUID: {A4268EEC-FEC5-49E5-95C3-F126696BDBF6}\r\n" "SessionID: %lu\r\n" "AppID: 1\r\n" "Context: %s", session_id, msnobj_base64); g_free(msnobj_base64); body = g_strdup_printf( "INVITE MSNMSGR:%s MSNSLP/1.0\r\n" "To: <msnmsgr:%s>\r\n" "From: <msnmsgr:%s>\r\n" "Via: MSNSLP/1.0/TLP ;branch={%s}\r\n" "CSeq: 0\r\n" "Call-ID: {%s}\r\n" "Max-Forwards: 0\r\n" "Content-Type: application/x-msnmsgr-sessionreqbody\r\n" "Content-Length: %d\r\n" "\r\n" "%s" "\r\n\r\n", msn_user_get_passport(remote_user), msn_user_get_passport(remote_user), msn_user_get_passport(local_user), branch, slpsession->call_id, strlen(content) + 5, content); g_free(content); g_free(branch); gaim_debug_misc("msn", "Message = {%s}\n", body); invite_msg = msn_message_new_msnslp(); msn_message_set_sender(invite_msg, local_user); msn_message_set_receiver(invite_msg, remote_user); msn_message_set_body(invite_msg, body); g_free(body); msn_slp_session_send_msg(slpsession, invite_msg); msn_message_destroy(invite_msg); }