7
void msn_sbconn_send_part(MsnSlpLink *slplink, MsnSlpMessagePart *part)
14
msg = msn_message_new_msnslp();
16
passport = purple_normalize(slplink->session->account, slplink->remote_user);
17
msn_message_set_header(msg, "P2P-Dest", passport);
19
msg->part = msn_slpmsgpart_ref(part);
20
data = msn_slpmsgpart_serialize(part, &size);
21
msn_message_set_bin_data(msg, data, size);
24
if (slplink->swboard == NULL)
26
slplink->swboard = msn_session_get_swboard(slplink->session,
27
slplink->remote_user, MSN_SB_FLAG_FT);
29
g_return_if_fail(slplink->swboard != NULL);
31
/* If swboard is destroyed we will be too */
32
slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink);
35
msn_switchboard_send_msg(slplink->swboard, msg, TRUE);
36
msn_message_destroy(msg);
39
/** Called when a message times out. */
41
msg_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans)
47
msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_TIMEOUT);
51
release_msg(MsnSwitchBoard *swboard, MsnMessage *msg)
54
MsnTransaction *trans;
59
g_return_if_fail(swboard != NULL);
60
g_return_if_fail(msg != NULL);
62
cmdproc = swboard->cmdproc;
64
payload = msn_message_gen_payload(msg, &payload_len);
66
if (purple_debug_is_verbose()) {
67
purple_debug_info("msn", "SB length:{%" G_GSIZE_FORMAT "}\n", payload_len);
68
msn_message_show_readable(msg, "SB SEND", FALSE);
71
flag = msn_message_get_flag(msg);
72
trans = msn_transaction_new(cmdproc, "MSG", "%c %" G_GSIZE_FORMAT,
75
/* Data for callbacks */
76
msn_transaction_set_data(trans, msg);
79
if (msg->type == MSN_MSG_TEXT)
83
swboard->ack_list = g_list_append(swboard->ack_list, msg);
84
msn_transaction_set_timeout_cb(trans, msg_timeout);
86
else if (msg->type == MSN_MSG_SLP)
90
swboard->ack_list = g_list_append(swboard->ack_list, msg);
91
msn_transaction_set_timeout_cb(trans, msg_timeout);
93
if (msg->ack_cb != NULL)
95
msn_transaction_add_cb(trans, "ACK", msg_ack);
96
msn_transaction_add_cb(trans, "NAK", msg_nak);
102
trans->payload = payload;
103
trans->payload_len = payload_len;
107
msn_cmdproc_send_trans(cmdproc, trans);
111
queue_msg(MsnSwitchBoard *swboard, MsnMessage *msg)
113
g_return_if_fail(swboard != NULL);
114
g_return_if_fail(msg != NULL);
116
purple_debug_info("msn", "Appending message to queue.\n");
118
g_queue_push_tail(swboard->msg_queue, msg);
120
msn_message_ref(msg);
124
msn_sbconn_process_queue(MsnSwitchBoard *swboard)
128
g_return_if_fail(swboard != NULL);
130
purple_debug_info("msn", "Processing queue\n");
132
while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL)
134
purple_debug_info("msn", "Sending message\n");
135
release_msg(swboard, msg);
136
msn_message_unref(msg);
141
msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg,
144
g_return_if_fail(swboard != NULL);
145
g_return_if_fail(msg != NULL);
147
purple_debug_info("msn", "switchboard send msg..\n");
148
if (msn_switchboard_can_send(swboard))
149
release_msg(swboard, msg);
151
queue_msg(swboard, msg);