5
#include "slpmsg_part.h"
7
MsnSlpMessagePart *msn_slpmsgpart_new(MsnP2PHeader *header, MsnP2PFooter *footer)
9
MsnSlpMessagePart *part;
11
part = g_new0(MsnSlpMessagePart, 1);
14
part->header = g_memdup(header, P2P_PACKET_HEADER_SIZE);
16
part->footer = g_memdup(footer, P2P_PACKET_FOOTER_SIZE);
18
part->ack_cb = msn_slpmsgpart_ack;
19
part->nak_cb = msn_slpmsgpart_nak;
21
return msn_slpmsgpart_ref(part);
24
MsnSlpMessagePart *msn_slpmsgpart_new_from_data(const char *data, size_t data_len)
26
MsnSlpMessagePart *part;
31
if (data_len < sizeof(*header)) {
35
part = msn_slpmsgpart_new(NULL, NULL);
38
/* Extract the binary SLP header */
39
part->header = msn_p2p_header_from_wire((MsnP2PHeader*)tmp);
40
tmp += P2P_PACKET_HEADER_SIZE;
42
/* Extract the body */
43
body_len = data_len - P2P_PACKET_HEADER_SIZE - P2P_PACKET_FOOTER_SIZE;
44
/* msg->body_len = msg->msnslp_header.length; */
47
part->size = body_len;
48
part->buffer = g_malloc(body_len);
49
memcpy(part->buffer, tmp, body_len);
53
/* Extract the footer */
55
part->footer = msn_p2p_footer_from_wire((MsnP2PFooter*)tmp);
60
void msn_slpmsgpart_destroy(MsnSlpMessagePart *part)
65
if (part->ref_count > 0) {
66
msn_slpmsgpart_unref(part);
78
MsnSlpMessagePart *msn_slpmsgpart_ref(MsnSlpMessagePart *part)
80
g_return_val_if_fail(part != NULL, NULL);
83
if (purple_debug_is_verbose())
84
purple_debug_info("msn", "part ref (%p)[%d]\n", part, part->ref_count);
89
MsnSlpMessagePart *msn_slpmsgpart_unref(MsnSlpMessagePart *part)
91
g_return_val_if_fail(part != NULL, NULL);
92
g_return_val_if_fail(part->ref_count > 0, NULL);
96
if (purple_debug_is_verbose())
97
purple_debug_info("msn", "part unref (%p)[%d]\n", part, part->ref_count);
99
if (part->ref_count == 0) {
100
msn_slpmsgpart_destroy(part);
108
void msn_slpmsgpart_set_bin_data(MsnSlpMessagePart *part, const void *data, size_t len)
110
g_return_if_fail(part != NULL);
112
g_free(part->buffer);
114
if (data != NULL && len > 0) {
115
part->buffer = g_malloc(len + 1);
116
memcpy(part->buffer, data, len);
117
part->buffer[len] = '\0';
126
char *msn_slpmsgpart_serialize(MsnSlpMessagePart *part, size_t *ret_size)
128
MsnP2PHeader *header;
129
MsnP2PFooter *footer;
134
base = g_malloc(P2P_PACKET_HEADER_SIZE + part->size + sizeof(MsnP2PFooter));
137
header = msn_p2p_header_to_wire(part->header);
138
footer = msn_p2p_footer_to_wire(part->footer);
140
siz = sizeof(MsnP2PHeader);
142
memcpy(tmp, (char*)header, siz);
146
memcpy(tmp, part->buffer, part->size);
150
siz = sizeof(MsnP2PFooter);
151
memcpy(tmp, (char*)footer, siz);
154
*ret_size = tmp - base;
161
/* We have received the message ack */
163
msn_slpmsgpart_ack(MsnSlpMessagePart *part, void *data)
165
MsnSlpMessage *slpmsg;
170
real_size = (slpmsg->header->flags == P2P_ACK) ? 0 : slpmsg->size;
172
slpmsg->header->offset += part->header->length;
174
slpmsg->parts = g_list_remove(slpmsg->parts, part);
176
if (slpmsg->header->offset < real_size)
178
if (slpmsg->slpcall->xfer && purple_xfer_get_status(slpmsg->slpcall->xfer) == PURPLE_XFER_STATUS_STARTED)
180
slpmsg->slpcall->xfer_msg = slpmsg;
181
purple_xfer_prpl_ready(slpmsg->slpcall->xfer);
184
msn_slplink_send_msgpart(slpmsg->slplink, slpmsg);
188
/* The whole message has been sent */
189
if (msn_p2p_msg_is_data(slpmsg->header->flags))
191
if (slpmsg->slpcall != NULL)
193
if (slpmsg->slpcall->cb)
194
slpmsg->slpcall->cb(slpmsg->slpcall,
201
/* We have received the message nak. */
203
msn_slpmsgpart_nak(MsnSlpMessagePart *part, void *data)
205
MsnSlpMessage *slpmsg;
209
msn_slplink_send_msgpart(slpmsg->slplink, slpmsg);
211
slpmsg->parts = g_list_remove(slpmsg->parts, part);