comparison libpurple/protocols/msn/xfer.c @ 30832:eabeba9c823f

Move msn_xfer code to it's own module aiming to simplify slp code.
author masca@cpw.pidgin.im
date Tue, 29 Jun 2010 22:18:22 +0000
parents
children 72e6fa6caecc
comparison
equal deleted inserted replaced
30831:210feb895031 30832:eabeba9c823f
1 #include "internal.h"
2 #include "debug.h"
3
4 #include "sbconn.h"
5 #include "xfer.h"
6
7 /**************************************************************************
8 * Xfer
9 **************************************************************************/
10
11 void
12 msn_xfer_init(PurpleXfer *xfer)
13 {
14 MsnSlpCall *slpcall;
15 /* MsnSlpLink *slplink; */
16 char *content;
17
18 purple_debug_info("msn", "xfer_init\n");
19
20 slpcall = xfer->data;
21
22 /* Send Ok */
23 content = g_strdup_printf("SessionID: %lu\r\n\r\n",
24 slpcall->session_id);
25
26 msn_slp_send_ok(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody",
27 content);
28
29 g_free(content);
30 msn_slplink_send_queued_slpmsgs(slpcall->slplink);
31 }
32
33 void
34 msn_xfer_cancel(PurpleXfer *xfer)
35 {
36 MsnSlpCall *slpcall;
37 char *content;
38
39 g_return_if_fail(xfer != NULL);
40 g_return_if_fail(xfer->data != NULL);
41
42 slpcall = xfer->data;
43
44 if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL)
45 {
46 if (slpcall->started)
47 {
48 msn_slpcall_close(slpcall);
49 }
50 else
51 {
52 content = g_strdup_printf("SessionID: %lu\r\n\r\n",
53 slpcall->session_id);
54
55 msn_slp_send_decline(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody",
56 content);
57
58 g_free(content);
59 msn_slplink_send_queued_slpmsgs(slpcall->slplink);
60
61 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND)
62 slpcall->wasted = TRUE;
63 else
64 msn_slpcall_destroy(slpcall);
65 }
66 }
67 }
68
69 gssize
70 msn_xfer_write(const guchar *data, gsize len, PurpleXfer *xfer)
71 {
72 MsnSlpCall *slpcall;
73
74 g_return_val_if_fail(xfer != NULL, -1);
75 g_return_val_if_fail(data != NULL, -1);
76 g_return_val_if_fail(len > 0, -1);
77
78 g_return_val_if_fail(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND, -1);
79
80 slpcall = xfer->data;
81 /* Not sure I trust it'll be there */
82 g_return_val_if_fail(slpcall != NULL, -1);
83
84 g_return_val_if_fail(slpcall->xfer_msg != NULL, -1);
85
86 slpcall->u.outgoing.len = len;
87 slpcall->u.outgoing.data = data;
88 msn_slplink_send_msgpart(slpcall->slplink, slpcall->xfer_msg);
89
90 return MIN(MSN_SBCONN_MAX_SIZE, len);
91 }
92
93 gssize
94 msn_xfer_read(guchar **data, PurpleXfer *xfer)
95 {
96 MsnSlpCall *slpcall;
97 gsize len;
98
99 g_return_val_if_fail(xfer != NULL, -1);
100 g_return_val_if_fail(data != NULL, -1);
101
102 g_return_val_if_fail(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE, -1);
103
104 slpcall = xfer->data;
105 /* Not sure I trust it'll be there */
106 g_return_val_if_fail(slpcall != NULL, -1);
107
108 /* Just pass up the whole GByteArray. We'll make another. */
109 *data = slpcall->u.incoming_data->data;
110 len = slpcall->u.incoming_data->len;
111
112 g_byte_array_free(slpcall->u.incoming_data, FALSE);
113 slpcall->u.incoming_data = g_byte_array_new();
114
115 return len;
116 }
117
118 void
119 msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session)
120 {
121 if ((purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_DONE) &&
122 (purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_CANCEL_REMOTE) &&
123 (purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_CANCEL_LOCAL))
124 {
125 purple_xfer_cancel_remote(slpcall->xfer);
126 }
127 }
128
129 void
130 msn_xfer_completed_cb(MsnSlpCall *slpcall, const guchar *body,
131 gsize size)
132 {
133 PurpleXfer *xfer = slpcall->xfer;
134
135 purple_xfer_set_completed(xfer, TRUE);
136 purple_xfer_end(xfer);
137 }
138