diff --git a/tgp-ft.c b/tgp-ft.c index 7b617f7..85acdeb 100644 --- a/tgp-ft.c +++ b/tgp-ft.c @@ -128,7 +128,13 @@ static void tgprpl_xfer_recv_init (PurpleXfer *X) { tgl_peer_t *P = find_peer_by_name (data->conn->TLS, who); if (P) { - tgl_do_load_document (data->conn->TLS, data->document, tgprpl_xfer_recv_on_finished, data); + if (data->document) { + tgl_do_load_document (data->conn->TLS, data->document, tgprpl_xfer_recv_on_finished, data); + } + else if (data->encr_document) { + tgl_do_load_encr_document (data->conn->TLS, data->encr_document, + tgprpl_xfer_recv_on_finished, data); + } } else { warning ("User not found, not downloading..."); } @@ -154,12 +160,13 @@ static void tgprpl_xfer_send_init (PurpleXfer *X) { data->timer = purple_timeout_add (100, tgprpl_xfer_upload_progress, X); } -static void tgprpl_xfer_init_data (PurpleXfer *X, connection_data *conn, struct tgl_document *D) { +static void tgprpl_xfer_init_data (PurpleXfer *X, connection_data *conn, struct tgl_document *D, struct tgl_encr_document *ED) { if (!X->data) { struct tgp_xfer_send_data *data = g_malloc0 (sizeof (struct tgp_xfer_send_data)); data->xfer = X; data->conn = conn; data->document = D; + data->encr_document = ED; X->data = data; } } @@ -192,23 +199,37 @@ PurpleXfer *tgprpl_new_xfer (PurpleConnection * gc, const char *who) { if (X) { purple_xfer_set_init_fnc (X, tgprpl_xfer_send_init); purple_xfer_set_cancel_send_fnc (X, tgprpl_xfer_canceled); - tgprpl_xfer_init_data (X, purple_connection_get_protocol_data (gc), NULL); + tgprpl_xfer_init_data (X, purple_connection_get_protocol_data (gc), NULL, NULL); } return (PurpleXfer *)X; } -void tgprpl_recv_file (PurpleConnection * gc, const char *who, struct tgl_document *D) { - debug ("tgprpl_recv_file()"); +static PurpleXfer *tgprpl_new_xfer_recv (PurpleConnection * gc, const char *who) { connection_data *conn = purple_connection_get_protocol_data (gc); - - PurpleXfer *X = purple_xfer_new (conn->pa, PURPLE_XFER_RECEIVE, who); - purple_xfer_set_filename (X, D->caption ? D->caption : D->mime_type); + PurpleXfer *X = purple_xfer_new (conn->pa, PURPLE_XFER_RECEIVE, who); purple_xfer_set_init_fnc (X, tgprpl_xfer_recv_init); purple_xfer_set_cancel_recv_fnc (X, tgprpl_xfer_canceled); - tgprpl_xfer_init_data (X, purple_connection_get_protocol_data (gc), D); + return X; +} + +void tgprpl_recv_file (PurpleConnection * gc, const char *who, struct tgl_document *D) { + debug ("tgprpl_recv_file()"); + PurpleXfer *X = tgprpl_new_xfer_recv (gc, who); + + purple_xfer_set_filename (X, D->caption ? D->caption : D->mime_type); + tgprpl_xfer_init_data (X, purple_connection_get_protocol_data (gc), D, NULL); + purple_xfer_request (X); +} + +void tgprpl_recv_encr_file (PurpleConnection * gc, const char *who, struct tgl_encr_document *D) { + debug ("tgprpl_recv_encr_file()"); + PurpleXfer *X = tgprpl_new_xfer_recv (gc, who); + + purple_xfer_set_filename (X, D->caption ? D->caption : D->mime_type); + tgprpl_xfer_init_data (X, purple_connection_get_protocol_data (gc), NULL, D); purple_xfer_request (X); } diff --git a/tgp-ft.h b/tgp-ft.h index 09e336c..ba32bcc 100644 --- a/tgp-ft.h +++ b/tgp-ft.h @@ -29,6 +29,7 @@ PurpleXfer *tgprpl_new_xfer (PurpleConnection * gc, const char *who); void tgprpl_send_file (PurpleConnection * gc, const char *who, const char *file); void tgprpl_recv_file (PurpleConnection * gc, const char *who, struct tgl_document *D); +void tgprpl_recv_encr_file (PurpleConnection * gc, const char *who, struct tgl_encr_document *D); void tgprpl_xfer_free_all (connection_data *conn); #endif diff --git a/tgp-msg.c b/tgp-msg.c index 4481d3e..28cbdab 100644 --- a/tgp-msg.c +++ b/tgp-msg.c @@ -129,11 +129,7 @@ static char *format_document_desc (char *type, char *caption, gint64 size) { } static char *format_message (struct tgl_message *M) { - switch (M->media.type) { - case tgl_message_media_document_encr: - return format_document_desc ("DOCUMENT", M->media.encr_document.caption, M->media.encr_document.size); - break; case tgl_message_media_photo_encr: return format_document_desc ("ENCRYPTED PHOTO", "(not yet supported)", M->media.encr_photo.size); break; @@ -289,13 +285,21 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) { } else if (M->media.type == tgl_message_media_document) { char *who = p2tgl_peer_strdup_id (M->from_id); - tgprpl_recv_file (conn->gc, who, &M->media.document); + if (! out_msg(TLS, M)) { + tgprpl_recv_file (conn->gc, who, &M->media.document); + } g_free (who); return; } + else if (M->media.type == tgl_message_media_document_encr) { + char *who = p2tgl_peer_strdup_id (M->from_id); + if (! out_msg(TLS, M)) { + tgprpl_recv_encr_file (conn->gc, who, &M->media.encr_document); + } + g_free (who); + } else if (M->media.type == tgl_message_media_photo) { char *filename = C->data; - int imgStoreId = p2tgl_imgstore_add_with_id (filename); if (imgStoreId <= 0) { failure ("Cannot display picture message, adding to imgstore failed."); diff --git a/tgp-structs.h b/tgp-structs.h index 15c3330..b6fd044 100755 --- a/tgp-structs.h +++ b/tgp-structs.h @@ -51,6 +51,7 @@ struct tgp_xfer_send_data { PurpleXfer *xfer; connection_data *conn; struct tgl_document *document; + struct tgl_encr_document *encr_document; }; struct download_desc {