Mercurial > pidgin
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 |