Mercurial > pidgin
comparison libpurple/ft.c @ 29344:10eaca0bf01a
propagate from branch 'im.pidgin.pidgin' (head 8f0a3e68547fbc66188357edbf6694bd8dd2d557)
to branch 'im.pidgin.pidgin.next.minor' (head 63bbded7257d603ff4c002350caa652f85d2ff9e)
author | John Bailey <rekkanoryo@rekkanoryo.org> |
---|---|
date | Fri, 25 Dec 2009 22:08:46 +0000 |
parents | 1e19c439fa7a 16dfa8df7dd1 |
children | ba8577b87d2e |
comparison
equal
deleted
inserted
replaced
29343:bf4a33bd020b | 29344:10eaca0bf01a |
---|---|
118 | 118 |
119 if (ui_ops != NULL && ui_ops->new_xfer != NULL) | 119 if (ui_ops != NULL && ui_ops->new_xfer != NULL) |
120 ui_ops->new_xfer(xfer); | 120 ui_ops->new_xfer(xfer); |
121 | 121 |
122 xfers = g_list_prepend(xfers, xfer); | 122 xfers = g_list_prepend(xfers, xfer); |
123 | |
124 if (purple_debug_is_verbose()) | |
125 purple_debug_info("xfer", "new %p [%d]\n", xfer, xfer->ref); | |
126 | |
123 return xfer; | 127 return xfer; |
124 } | 128 } |
125 | 129 |
126 static void | 130 static void |
127 purple_xfer_destroy(PurpleXfer *xfer) | 131 purple_xfer_destroy(PurpleXfer *xfer) |
128 { | 132 { |
129 PurpleXferUiOps *ui_ops; | 133 PurpleXferUiOps *ui_ops; |
130 PurpleXferPrivData *priv; | 134 PurpleXferPrivData *priv; |
131 | 135 |
132 g_return_if_fail(xfer != NULL); | 136 g_return_if_fail(xfer != NULL); |
133 | |
134 priv = g_hash_table_lookup(xfers_data, xfer); | |
135 | 137 |
136 /* Close the file browser, if it's open */ | 138 /* Close the file browser, if it's open */ |
137 purple_request_close_with_handle(xfer); | 139 purple_request_close_with_handle(xfer); |
138 | 140 |
139 if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_STARTED) | 141 if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_STARTED) |
160 purple_xfer_ref(PurpleXfer *xfer) | 162 purple_xfer_ref(PurpleXfer *xfer) |
161 { | 163 { |
162 g_return_if_fail(xfer != NULL); | 164 g_return_if_fail(xfer != NULL); |
163 | 165 |
164 xfer->ref++; | 166 xfer->ref++; |
167 | |
168 if (purple_debug_is_verbose()) | |
169 purple_debug_info("xfer", "ref'd %p [%d]\n", xfer, xfer->ref); | |
165 } | 170 } |
166 | 171 |
167 void | 172 void |
168 purple_xfer_unref(PurpleXfer *xfer) | 173 purple_xfer_unref(PurpleXfer *xfer) |
169 { | 174 { |
170 g_return_if_fail(xfer != NULL); | 175 g_return_if_fail(xfer != NULL); |
171 g_return_if_fail(xfer->ref > 0); | 176 g_return_if_fail(xfer->ref > 0); |
172 | 177 |
173 xfer->ref--; | 178 xfer->ref--; |
179 | |
180 if (purple_debug_is_verbose()) | |
181 purple_debug_info("xfer", "unref'd %p [%d]\n", xfer, xfer->ref); | |
174 | 182 |
175 if (xfer->ref == 0) | 183 if (xfer->ref == 0) |
176 purple_xfer_destroy(xfer); | 184 purple_xfer_destroy(xfer); |
177 } | 185 } |
178 | 186 |
280 | 288 |
281 static void | 289 static void |
282 purple_xfer_choose_file_ok_cb(void *user_data, const char *filename) | 290 purple_xfer_choose_file_ok_cb(void *user_data, const char *filename) |
283 { | 291 { |
284 PurpleXfer *xfer; | 292 PurpleXfer *xfer; |
293 PurpleXferType type; | |
285 struct stat st; | 294 struct stat st; |
286 gchar *dir; | 295 gchar *dir; |
287 | 296 |
288 xfer = (PurpleXfer *)user_data; | 297 xfer = (PurpleXfer *)user_data; |
298 type = purple_xfer_get_type(xfer); | |
289 | 299 |
290 if (g_stat(filename, &st) != 0) { | 300 if (g_stat(filename, &st) != 0) { |
291 /* File not found. */ | 301 /* File not found. */ |
292 if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) { | 302 if (type == PURPLE_XFER_RECEIVE) { |
293 #ifndef _WIN32 | 303 #ifndef _WIN32 |
294 int mode = W_OK; | 304 int mode = W_OK; |
295 #else | 305 #else |
296 int mode = F_OK; | 306 int mode = F_OK; |
297 #endif | 307 #endif |
309 | 319 |
310 g_free(dir); | 320 g_free(dir); |
311 } | 321 } |
312 else { | 322 else { |
313 purple_xfer_show_file_error(xfer, filename); | 323 purple_xfer_show_file_error(xfer, filename); |
314 purple_xfer_request_denied(xfer); | 324 purple_xfer_cancel_local(xfer); |
315 } | 325 } |
316 } | 326 } |
317 else if ((purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) && | 327 else if ((type == PURPLE_XFER_SEND) && (st.st_size == 0)) { |
318 (st.st_size == 0)) { | |
319 | 328 |
320 purple_notify_error(NULL, NULL, | 329 purple_notify_error(NULL, NULL, |
321 _("Cannot send a file of 0 bytes."), NULL); | 330 _("Cannot send a file of 0 bytes."), NULL); |
322 | 331 |
323 purple_xfer_request_denied(xfer); | 332 purple_xfer_cancel_local(xfer); |
324 } | 333 } |
325 else if ((purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) && | 334 else if ((type == PURPLE_XFER_SEND) && S_ISDIR(st.st_mode)) { |
326 S_ISDIR(st.st_mode)) { | |
327 /* | 335 /* |
328 * XXX - Sending a directory should be valid for some protocols. | 336 * XXX - Sending a directory should be valid for some protocols. |
329 */ | 337 */ |
330 purple_notify_error(NULL, NULL, | 338 purple_notify_error(NULL, NULL, |
331 _("Cannot send a directory."), NULL); | 339 _("Cannot send a directory."), NULL); |
332 | 340 |
333 purple_xfer_request_denied(xfer); | 341 purple_xfer_cancel_local(xfer); |
334 } | 342 } |
335 else if ((purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) && | 343 else if ((type == PURPLE_XFER_RECEIVE) && S_ISDIR(st.st_mode)) { |
336 S_ISDIR(st.st_mode)) { | |
337 char *msg, *utf8; | 344 char *msg, *utf8; |
338 utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL); | 345 utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL); |
339 msg = g_strdup_printf( | 346 msg = g_strdup_printf( |
340 _("%s is not a regular file. Cowardly refusing to overwrite it.\n"), utf8); | 347 _("%s is not a regular file. Cowardly refusing to overwrite it.\n"), utf8); |
341 g_free(utf8); | 348 g_free(utf8); |
342 purple_notify_error(NULL, NULL, msg, NULL); | 349 purple_notify_error(NULL, NULL, msg, NULL); |
343 g_free(msg); | 350 g_free(msg); |
344 purple_xfer_request_denied(xfer); | 351 purple_xfer_request_denied(xfer); |
345 } | 352 } |
353 else if (type == PURPLE_XFER_SEND) { | |
354 #ifndef _WIN32 | |
355 int mode = R_OK; | |
356 #else | |
357 int mode = F_OK; | |
358 #endif | |
359 | |
360 if (g_access(filename, mode) == 0) { | |
361 purple_xfer_request_accepted(xfer, filename); | |
362 } else { | |
363 purple_xfer_ref(xfer); | |
364 purple_notify_message( | |
365 NULL, PURPLE_NOTIFY_MSG_ERROR, NULL, | |
366 _("File is not readable."), NULL, | |
367 (PurpleNotifyCloseCallback)purple_xfer_choose_file, xfer); | |
368 } | |
369 } | |
346 else { | 370 else { |
347 purple_xfer_request_accepted(xfer, filename); | 371 purple_xfer_request_accepted(xfer, filename); |
348 } | 372 } |
349 | 373 |
350 purple_xfer_unref(xfer); | 374 purple_xfer_unref(xfer); |
354 purple_xfer_choose_file_cancel_cb(void *user_data, const char *filename) | 378 purple_xfer_choose_file_cancel_cb(void *user_data, const char *filename) |
355 { | 379 { |
356 PurpleXfer *xfer = (PurpleXfer *)user_data; | 380 PurpleXfer *xfer = (PurpleXfer *)user_data; |
357 | 381 |
358 purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_CANCEL_LOCAL); | 382 purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_CANCEL_LOCAL); |
359 purple_xfer_request_denied(xfer); | 383 if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) |
384 purple_xfer_cancel_local(xfer); | |
385 else | |
386 purple_xfer_request_denied(xfer); | |
387 purple_xfer_unref(xfer); | |
360 } | 388 } |
361 | 389 |
362 static int | 390 static int |
363 purple_xfer_choose_file(PurpleXfer *xfer) | 391 purple_xfer_choose_file(PurpleXfer *xfer) |
364 { | 392 { |
979 r = (xfer->ops.write)(buffer, s, xfer); | 1007 r = (xfer->ops.write)(buffer, s, xfer); |
980 } else { | 1008 } else { |
981 r = write(xfer->fd, buffer, s); | 1009 r = write(xfer->fd, buffer, s); |
982 if (r < 0 && errno == EAGAIN) | 1010 if (r < 0 && errno == EAGAIN) |
983 r = 0; | 1011 r = 0; |
1012 if ((purple_xfer_get_bytes_sent(xfer)+r) >= purple_xfer_get_size(xfer)) | |
1013 purple_xfer_set_completed(xfer, TRUE); | |
984 } | 1014 } |
985 | 1015 |
986 return r; | 1016 return r; |
987 } | 1017 } |
988 | 1018 |
1009 purple_xfer_cancel_local(xfer); | 1039 purple_xfer_cancel_local(xfer); |
1010 g_free(buffer); | 1040 g_free(buffer); |
1011 return; | 1041 return; |
1012 } | 1042 } |
1013 | 1043 |
1044 if ((purple_xfer_get_size(xfer) > 0) && | |
1045 ((purple_xfer_get_bytes_sent(xfer)+r) >= purple_xfer_get_size(xfer))) | |
1046 purple_xfer_set_completed(xfer, TRUE); | |
1014 } else if(r < 0) { | 1047 } else if(r < 0) { |
1015 purple_xfer_cancel_remote(xfer); | 1048 purple_xfer_cancel_remote(xfer); |
1016 g_free(buffer); | 1049 g_free(buffer); |
1017 return; | 1050 return; |
1018 } | 1051 } |
1046 if (xfer->watcher != 0) { | 1079 if (xfer->watcher != 0) { |
1047 purple_input_remove(xfer->watcher); | 1080 purple_input_remove(xfer->watcher); |
1048 xfer->watcher = 0; | 1081 xfer->watcher = 0; |
1049 } | 1082 } |
1050 /* | 1083 /* |
1051 * if we requested 0 bytes it's only normal that en up here | 1084 * if we requested 0 bytes it's only normal that end up here |
1052 * we shouldn't return as we still have something to | 1085 * we shouldn't return as we still have something to |
1053 * write in priv->buffer | 1086 * write in priv->buffer |
1054 */ | 1087 */ |
1055 if (s != 0) | 1088 if (s != 0) |
1056 return; | 1089 return; |