comparison libpurple/protocols/msn/xfer.c @ 31558:ce968e115c95

propagate from branch 'im.pidgin.cpw.masca.p2p' (head 33ca865dacb9e5bcf763d06f6a42cbaca337cc64) to branch 'im.pidgin.pidgin' (head 92f47f4e8b0cbb107fd97e1ab814d1cedbf109ad)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 06 May 2011 06:25:14 +0000
parents 9ccbd0302bb2
children 92711688c245 3828a61c44da
comparison
equal deleted inserted replaced
31557:f021d93a1f9b 31558:ce968e115c95
160 purple_xfer_set_completed(xfer, TRUE); 160 purple_xfer_set_completed(xfer, TRUE);
161 purple_xfer_end(xfer); 161 purple_xfer_end(xfer);
162 } 162 }
163 163
164 gchar * 164 gchar *
165 msn_file_context_to_wire(MsnFileContext *header) 165 msn_file_context_to_wire(MsnFileContext *context)
166 { 166 {
167 gchar *ret, *tmp; 167 gchar *ret, *tmp;
168 168
169 tmp = ret = g_new(gchar, MSN_FILE_CONTEXT_SIZE + header->preview_len + 1); 169 tmp = ret = g_new(gchar, MSN_FILE_CONTEXT_SIZE + context->preview_len + 1);
170 170
171 msn_push32le(tmp, header->length); 171 msn_push32le(tmp, context->length);
172 msn_push32le(tmp, header->version); 172 msn_push32le(tmp, context->version);
173 msn_push64le(tmp, header->file_size); 173 msn_push64le(tmp, context->file_size);
174 msn_push32le(tmp, header->type); 174 msn_push32le(tmp, context->type);
175 memcpy(tmp, header->file_name, MAX_FILE_NAME_LEN * 2); 175 memcpy(tmp, context->file_name, MAX_FILE_NAME_LEN * 2);
176 tmp += MAX_FILE_NAME_LEN * 2; 176 tmp += MAX_FILE_NAME_LEN * 2;
177 memcpy(tmp, header->unknown1, sizeof(header->unknown1)); 177 memcpy(tmp, context->unknown1, sizeof(context->unknown1));
178 tmp += sizeof(header->unknown1); 178 tmp += sizeof(context->unknown1);
179 msn_push32le(tmp, header->unknown2); 179 msn_push32le(tmp, context->unknown2);
180 if (header->preview) { 180 if (context->preview) {
181 memcpy(tmp, header->preview, header->preview_len); 181 memcpy(tmp, context->preview, context->preview_len);
182 } 182 }
183 tmp[header->preview_len] = '\0'; 183 tmp[context->preview_len] = '\0';
184 184
185 return ret; 185 return ret;
186 } 186 }
187 187
188 MsnFileContext * 188 MsnFileContext *
189 msn_file_context_from_wire(const char *buf, gsize len) 189 msn_file_context_from_wire(const char *buf, gsize len)
190 { 190 {
191 MsnFileContext *header; 191 MsnFileContext *context;
192 192
193 if (!buf || len < MSN_FILE_CONTEXT_SIZE) 193 if (!buf || len < MSN_FILE_CONTEXT_SIZE)
194 return NULL; 194 return NULL;
195 195
196 header = g_new(MsnFileContext, 1); 196 context = g_new(MsnFileContext, 1);
197 197
198 header->length = msn_pop32le(buf); 198 context->length = msn_pop32le(buf);
199 header->version = msn_pop32le(buf); 199 context->version = msn_pop32le(buf);
200 if (header->version == 2) { 200 if (context->version == 2) {
201 /* The length field is broken for this version. No check. */ 201 /* The length field is broken for this version. No check. */
202 header->length = MSN_FILE_CONTEXT_SIZE; 202 context->length = MSN_FILE_CONTEXT_SIZE;
203 } else if (header->version == 3) { 203 } else if (context->version == 3) {
204 if (header->length != MSN_FILE_CONTEXT_SIZE + 63) { 204 if (context->length != MSN_FILE_CONTEXT_SIZE + 63) {
205 g_free(header); 205 g_free(context);
206 return NULL; 206 return NULL;
207 } else if (len < MSN_FILE_CONTEXT_SIZE + 63) { 207 } else if (len < MSN_FILE_CONTEXT_SIZE + 63) {
208 g_free(header); 208 g_free(context);
209 return NULL; 209 return NULL;
210 } 210 }
211 } else { 211 } else {
212 purple_debug_warning("msn", "Received MsnFileContext with unknown version: %d\n", header->version); 212 purple_debug_warning("msn", "Received MsnFileContext with unknown version: %d\n", context->version);
213 g_free(header); 213 g_free(context);
214 return NULL; 214 return NULL;
215 } 215 }
216 216
217 header->file_size = msn_pop64le(buf); 217 context->file_size = msn_pop64le(buf);
218 header->type = msn_pop32le(buf); 218 context->type = msn_pop32le(buf);
219 memcpy(header->file_name, buf, MAX_FILE_NAME_LEN * 2); 219 memcpy(context->file_name, buf, MAX_FILE_NAME_LEN * 2);
220 buf += MAX_FILE_NAME_LEN * 2; 220 buf += MAX_FILE_NAME_LEN * 2;
221 memcpy(header->unknown1, buf, sizeof(header->unknown1)); 221 memcpy(context->unknown1, buf, sizeof(context->unknown1));
222 buf += sizeof(header->unknown1); 222 buf += sizeof(context->unknown1);
223 header->unknown2 = msn_pop32le(buf); 223 context->unknown2 = msn_pop32le(buf);
224 224
225 if (header->type == 0 && len > header->length) { 225 if (context->type == 0 && len > context->length) {
226 header->preview_len = len - header->length; 226 context->preview_len = len - context->length;
227 header->preview = g_memdup(buf, header->preview_len); 227 context->preview = g_memdup(buf, context->preview_len);
228 } else { 228 } else {
229 header->preview_len = 0; 229 context->preview_len = 0;
230 header->preview = NULL; 230 context->preview = NULL;
231 } 231 }
232 232
233 return header; 233 return context;
234 } 234 }
235 235