Add support for file transfers in encrypted chats

This commit is contained in:
mjentsch 2015-03-13 00:18:01 +01:00
parent 077edc19d5
commit 0590862151
4 changed files with 42 additions and 15 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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.");

View file

@ -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 {