Allow cancelling a file transfer

Tue, 23 Oct 2012 14:03:00 +0200

author
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
date
Tue, 23 Oct 2012 14:03:00 +0200
changeset 34391
31dc448fa178
parent 34390
bd5b690b5b95
child 34392
e5268a401d65

Allow cancelling a file transfer

libpurple/protocols/gg/edisc.c file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/gg/edisc.c	Tue Oct 23 13:40:25 2012 +0200
+++ b/libpurple/protocols/gg/edisc.c	Tue Oct 23 14:03:00 2012 +0200
@@ -140,6 +140,7 @@
 		return;
 
 	g_free(edisc_xfer->filename);
+	purple_http_conn_cancel(edisc_xfer->hc);
 
 	sdata = ggp_edisc_get_sdata(edisc_xfer->gc);
 	if (edisc_xfer->ticket_id != NULL)
@@ -153,6 +154,8 @@
 
 static void ggp_edisc_xfer_error(PurpleXfer *xfer, const gchar *msg)
 {
+	if (purple_xfer_is_cancelled(xfer))
+		g_return_if_reached();
 	purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_CANCEL_REMOTE);
 	purple_xfer_conversation_write(xfer, msg, TRUE);
 	purple_xfer_error(
@@ -214,6 +217,9 @@
 	ggp_edisc_xfer *edisc_xfer = purple_xfer_get_protocol_data(xfer);
 	gchar *data;
 
+	if (purple_xfer_is_cancelled(xfer))
+		return;
+
 	if (!success) {
 		ggp_edisc_xfer_error(xfer, _("Authentication failed"));
 		return;
@@ -255,6 +261,9 @@
 	JsonParser *parser;
 	JsonObject *ticket;
 
+	if (purple_xfer_is_cancelled(xfer))
+		return;
+
 	edisc_xfer->hc = NULL;
 
 	if (!purple_http_response_is_successfull(response)) {
@@ -374,7 +383,11 @@
 		return;
 	}
 
-	stored = fread(buffer, 1, length, xfer->dest_fp);
+	if (xfer->dest_fp == NULL)
+		stored = -1;
+	else
+		stored = fread(buffer, 1, length, xfer->dest_fp);
+
 	if (stored < 0)
 		success = FALSE;
 	else {
@@ -468,6 +481,9 @@
 	JsonObject *result;
 	int result_status;
 
+	if (purple_xfer_is_cancelled(xfer))
+		return;
+
 	g_return_if_fail(edisc_xfer != NULL);
 
 	edisc_xfer->hc = NULL;
@@ -498,26 +514,7 @@
 {
 	g_return_if_fail(xfer != NULL);
 
-	if (purple_xfer_get_type(xfer) != PURPLE_XFER_SEND) {
-		purple_debug_error("gg", "ggp_edisc_xfer_start: "
-			"Not yet implemented\n");
-		return;
-	}
-
-	purple_debug_info("gg", "ggp_edisc_xfer_cancel(%p)\n", xfer);
-}
-
-static void ggp_edisc_xfer_end(PurpleXfer *xfer)
-{
-	g_return_if_fail(xfer != NULL);
-
-	if (purple_xfer_get_type(xfer) != PURPLE_XFER_SEND) {
-		purple_debug_error("gg", "ggp_edisc_xfer_start: "
-			"Not yet implemented\n");
-		return;
-	}
-
-	purple_debug_info("gg", "ggp_edisc_xfer_end(%p)\n", xfer);
+	ggp_edisc_xfer_free(xfer);
 }
 
 PurpleXfer * ggp_edisc_xfer_new(PurpleConnection *gc, const char *who)
@@ -537,9 +534,7 @@
 
 	purple_xfer_set_init_fnc(xfer, ggp_edisc_xfer_init);
 	purple_xfer_set_start_fnc(xfer, ggp_edisc_xfer_start);
-
 	purple_xfer_set_cancel_send_fnc(xfer, ggp_edisc_xfer_cancel);
-	purple_xfer_set_end_fnc(xfer, ggp_edisc_xfer_end);
 
 	return xfer;
 }

mercurial