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;