Merge branch 'master' into dev-1.3.0
Conflicts: rpm/purple-telegram.spec tgl tgp-ft.c
This commit is contained in:
commit
1e78c9685c
8 changed files with 165 additions and 97 deletions
|
@ -106,6 +106,8 @@ install: $(PRPL_LIBNAME) $(LOCALE_MOS)
|
|||
install -m $(FILE_PERM) $(PRPL_LIBNAME) $(DESTDIR)$(PLUGIN_DIR_PURPLE)/$(PRPL_NAME)
|
||||
mkdir -m $(DIR_PERM) -p $(DESTDIR)/etc/telegram-purple
|
||||
install -m $(FILE_PERM) tg-server.tglpub $(DESTDIR)/etc/telegram-purple/server.tglpub
|
||||
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(datarootdir)/appdata
|
||||
install -m $(FILE_PERM) telegram-purple.metainfo.xml $(DESTDIR)$(datarootdir)/appdata/telegram-purple.metainfo.xml
|
||||
ifeq ($(COPY_ICONS),no)
|
||||
@echo "Not copying icons due to configure-option --disable-icons."
|
||||
@echo " If you're using Finch, Empathy, or Telepathy, then this is a good idea."
|
||||
|
@ -133,6 +135,7 @@ uninstall:
|
|||
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/16/telegram.png
|
||||
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/22/telegram.png
|
||||
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/48/telegram.png
|
||||
rm -f $(DESTDIR)$(datarootdir)/appdata/telegram-purple.metainfo.xml
|
||||
# TODO: Delete all installed .mo's, no matter what LINGUAS says.
|
||||
@for lang in $(LOCALES); do \
|
||||
echo "removing $(localedir)/$$lang/LC_MESSAGES/$(gettext_package).mo"; \
|
||||
|
|
21
README.md
21
README.md
|
@ -17,7 +17,7 @@ If your plattform is not supported or you want to contribute by testing or devel
|
|||
|
||||
#### OSX (Adium)
|
||||
|
||||
1. Download and execute the [Telegram-Adium bundle] (https://github.com/majn/telegram-purple/releases/download/v1.2.3/telegram-adium-1.2.3.zip)
|
||||
1. Download and execute the [Telegram-Adium bundle] (https://github.com/majn/telegram-purple/releases/download/v1.2.4/telegram-adium-1.2.4.AdiumLibpurplePlugin.zip)
|
||||
2. Restart Adium
|
||||
|
||||
#### Windows
|
||||
|
@ -35,15 +35,6 @@ The package is available in the Fedora 22 and 23 testing repositories:
|
|||
dnf install purple-telegram
|
||||
|
||||
|
||||
#### Ubuntu/Mint PPA
|
||||
|
||||
Webupd8 provides PPAs for installation, see the [article](http://www.webupd8.org/2014/11/add-telegram-support-to-pidgin-with.html) for additional instructions:
|
||||
|
||||
sudo add-apt-repository ppa:nilarimogard/webupd8
|
||||
sudo apt-get update
|
||||
sudo apt-get install telegram-purple
|
||||
|
||||
|
||||
#### Arch Linux (AUR)
|
||||
|
||||
https://aur.archlinux.org/packages/telegram-purple/
|
||||
|
@ -70,7 +61,7 @@ This repository has submodules, so you need to clone recursively.
|
|||
sudo dnf install gcc gettext libgcrypt-devel libwebp-devel libpurple-devel zlib-devel
|
||||
|
||||
|
||||
###### Debian / Ubuntu
|
||||
##### Debian / Ubuntu
|
||||
|
||||
We are working on a Debian package! Please first check if it's already available to you: `sudo apt-get install telegram-purple`
|
||||
|
||||
|
@ -80,7 +71,7 @@ If the above fails: Don't worry, just continue building it by yourself. Next you
|
|||
|
||||
sudo apt-get install libgcrypt20-dev libpurple-dev libwebp-dev
|
||||
|
||||
###### OpenSUSE
|
||||
##### OpenSUSE
|
||||
|
||||
sudo zypper install gcc glib glib-devel libpurple libpurple-devel zlib-devel libwebp-devel
|
||||
|
||||
|
@ -104,6 +95,7 @@ This repository contains submodules, and a simple pull just won't be enough to u
|
|||
|
||||
|
||||
git pull
|
||||
git submodule sync # just in case the configuration has changed
|
||||
git submodule update --recursive
|
||||
|
||||
|
||||
|
@ -225,6 +217,11 @@ and `.dsc` files, do this:
|
|||
|
||||
Note that the parenthesis are important.
|
||||
|
||||
1.2.4
|
||||
-----
|
||||
|
||||
- Fix crash on unknown media type
|
||||
- Fix crash on logout after cancelling a file transfer
|
||||
|
||||
1.2.3
|
||||
-----
|
||||
|
|
18
configure
vendored
18
configure
vendored
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for telegram-purple 1.2.3.
|
||||
# Generated by GNU Autoconf 2.69 for telegram-purple 1.2.4.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
|
||||
|
@ -577,8 +577,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='telegram-purple'
|
||||
PACKAGE_TARNAME='telegram-purple'
|
||||
PACKAGE_VERSION='1.2.3'
|
||||
PACKAGE_STRING='telegram-purple 1.2.3'
|
||||
PACKAGE_VERSION='1.2.4'
|
||||
PACKAGE_STRING='telegram-purple 1.2.4'
|
||||
PACKAGE_BUGREPORT=''
|
||||
PACKAGE_URL=''
|
||||
|
||||
|
@ -1250,7 +1250,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures telegram-purple 1.2.3 to adapt to many kinds of systems.
|
||||
\`configure' configures telegram-purple 1.2.4 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -1311,7 +1311,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of telegram-purple 1.2.3:";;
|
||||
short | recursive ) echo "Configuration of telegram-purple 1.2.4:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -1421,7 +1421,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
telegram-purple configure 1.2.3
|
||||
telegram-purple configure 1.2.4
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
|
@ -1840,7 +1840,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by telegram-purple $as_me 1.2.3, which was
|
||||
It was created by telegram-purple $as_me 1.2.4, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
|
@ -5106,7 +5106,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by telegram-purple $as_me 1.2.3, which was
|
||||
This file was extended by telegram-purple $as_me 1.2.4, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -5168,7 +5168,7 @@ _ACEOF
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
telegram-purple config.status 1.2.3
|
||||
telegram-purple config.status 1.2.4
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([telegram-purple], [1.2.3])
|
||||
AC_INIT([telegram-purple], [1.2.4])
|
||||
AC_CONFIG_SRCDIR([config.h.in])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
Name: purple-telegram
|
||||
Version: 1.3.0
|
||||
Release: 1%{?dist}
|
||||
Summary: Adds support for Libpurple based messengers
|
||||
Group: Applications/Internet
|
||||
License: GPLv2+
|
||||
URL: https://github.com/majn/telegram-purple
|
||||
Source0: https://codeload.github.com/majn/telegram-purple/tar.gz/v%{version}.tar.gz
|
||||
Name: purple-telegram
|
||||
Version: 1.3.0
|
||||
Release: 1%{?dist}
|
||||
Summary: Adds support for Libpurple based messengers
|
||||
Group: Applications/Internet
|
||||
License: GPLv2+
|
||||
URL: https://github.com/majn/telegram-purple
|
||||
Source0: https://codeload.github.com/majn/telegram-purple/tar.gz/v%{version}.tar.gz
|
||||
|
||||
BuildRequires: gettext, libgcrypt-devel >= 1.6, pkgconfig(zlib), pkgconfig(purple), pkgconfig(libwebp)
|
||||
BuildRequires: gettext, libgcrypt-devel >= 1.6, pkgconfig(zlib), pkgconfig(purple), pkgconfig(libwebp)
|
||||
BuildRequires: pkgconfig(appstream-glib)
|
||||
|
||||
%description
|
||||
Adds support for Telegram to Pidgin, Adium, Finch
|
||||
Adds support for Telegram to Pidgin, Adium, Finch
|
||||
and other Libpurple based messengers.
|
||||
|
||||
%prep
|
||||
|
@ -25,10 +26,14 @@ make %{?_smp_mflags}
|
|||
chmod 755 %{buildroot}/%{_libdir}/purple-2/telegram-purple.so
|
||||
%find_lang telegram-purple
|
||||
|
||||
%check
|
||||
appstream-util validate-relax --nonet %{buildroot}/%{_datadir}/appdata/telegram-purple.metainfo.xml
|
||||
|
||||
%files -f telegram-purple.lang
|
||||
%doc README* CHANGELOG*
|
||||
%doc README* CHANGELOG*
|
||||
%{_libdir}/purple-2/telegram-purple.so
|
||||
%config %{_sysconfdir}/telegram-purple/*
|
||||
%{_datadir}/appdata/telegram-purple.metainfo.xml
|
||||
%{_datadir}/pixmaps/pidgin/protocols/16/telegram.png
|
||||
%{_datadir}/pixmaps/pidgin/protocols/22/telegram.png
|
||||
%{_datadir}/pixmaps/pidgin/protocols/48/telegram.png
|
||||
|
@ -37,8 +42,11 @@ chmod 755 %{buildroot}/%{_libdir}/purple-2/telegram-purple.so
|
|||
* Thu Dec 10 2015 tuxmaster 1.3.0
|
||||
- Build for 1.3.0
|
||||
|
||||
* Thu Dec 10 2015 tuxmaster 1.2.4-2
|
||||
- Fix build for appdata.
|
||||
|
||||
* Wed Nov 18 2015 tuxmaster 1.2.2-3
|
||||
- Add required version for libgcrypt.
|
||||
- Add required version for libgcrypt.
|
||||
|
||||
* Wed Oct 14 2015 tuxmaster 1.2.2-2
|
||||
- Use the better pkconfig for build requires.
|
||||
|
@ -47,4 +55,3 @@ chmod 755 %{buildroot}/%{_libdir}/purple-2/telegram-purple.so
|
|||
|
||||
* Wed Oct 07 2015 mjentsch 1.2.2-1
|
||||
- update version to 1.2.2
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.2.3</string>
|
||||
<string>1.2.4</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>AdIM</string>
|
||||
<key>CFBundleVersion</key>
|
||||
|
|
181
tgp-ft.c
181
tgp-ft.c
|
@ -1,20 +1,20 @@
|
|||
/*
|
||||
This file is part of telegram-purple
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
||||
|
||||
|
||||
Copyright Matthias Jentsch 2014-2015
|
||||
*/
|
||||
|
||||
|
@ -25,7 +25,8 @@
|
|||
static void tgprpl_xfer_free_data (struct tgp_xfer_send_data *data);
|
||||
|
||||
static char *tgp_strdup_determine_filename (const char *mime, const char *caption,
|
||||
int flags, long long hash) {
|
||||
int flags, long long hash) {
|
||||
|
||||
if (caption) {
|
||||
return g_strdup (caption);
|
||||
}
|
||||
|
@ -61,21 +62,30 @@ static char *tgp_strdup_determine_filename (const char *mime, const char *captio
|
|||
static void tgprpl_xfer_recv_on_finished (struct tgl_state *TLS, void *_data, int success, const char *filename) {
|
||||
debug ("tgprpl_xfer_recv_on_finished()");
|
||||
struct tgp_xfer_send_data *data = _data;
|
||||
char *selected = g_strdup(purple_xfer_get_local_filename (data->xfer));
|
||||
char *selected = g_strdup (purple_xfer_get_local_filename (data->xfer));
|
||||
|
||||
if (success) {
|
||||
if (!data->done) {
|
||||
debug ("purple_xfer_set_completed");
|
||||
purple_xfer_set_bytes_sent (data->xfer, purple_xfer_get_size (data->xfer));
|
||||
purple_xfer_set_completed (data->xfer, TRUE);
|
||||
debug ("purple_xfer_set_completed");
|
||||
|
||||
// always completed the file transfer to avoid a warning dialogue when closing (Adium)
|
||||
purple_xfer_set_bytes_sent (data->xfer, purple_xfer_get_size (data->xfer));
|
||||
purple_xfer_set_completed (data->xfer, TRUE);
|
||||
|
||||
if (! purple_xfer_is_canceled (data->xfer)) {
|
||||
purple_xfer_end (data->xfer);
|
||||
}
|
||||
} else {
|
||||
tgp_notify_on_error_gw (TLS, NULL, success);
|
||||
failure ("ERROR xfer failed");
|
||||
if (! purple_xfer_is_canceled (data->xfer)) {
|
||||
purple_xfer_cancel_remote (data->xfer);
|
||||
}
|
||||
failure ("recv xfer failed");
|
||||
}
|
||||
|
||||
data->loading = FALSE;
|
||||
|
||||
data->xfer->data = NULL;
|
||||
purple_xfer_unref (data->xfer);
|
||||
tgprpl_xfer_free_data (data);
|
||||
|
||||
debug ("moving transferred file from tgl directory %s to selected target %s", selected, filename);
|
||||
|
@ -84,63 +94,77 @@ static void tgprpl_xfer_recv_on_finished (struct tgl_state *TLS, void *_data, in
|
|||
g_free (selected);
|
||||
}
|
||||
|
||||
static void tgprpl_xfer_on_finished (struct tgl_state *TLS, void *_data, int success, struct tgl_message *M) {
|
||||
static void tgprpl_xfer_send_on_finished (struct tgl_state *TLS, void *_data, int success, struct tgl_message *M) {
|
||||
debug ("tgprpl_xfer_on_finished()");
|
||||
struct tgp_xfer_send_data *data = _data;
|
||||
|
||||
|
||||
if (success) {
|
||||
if (!data->done) {
|
||||
if (! purple_xfer_is_canceled (data->xfer)) {
|
||||
debug ("purple_xfer_set_completed");
|
||||
purple_xfer_set_bytes_sent (data->xfer, purple_xfer_get_size (data->xfer));
|
||||
purple_xfer_set_completed (data->xfer, TRUE);
|
||||
purple_xfer_end(data->xfer);
|
||||
purple_xfer_end (data->xfer);
|
||||
}
|
||||
write_secret_chat_file (TLS);
|
||||
} else {
|
||||
tgp_notify_on_error_gw (TLS, NULL, success);
|
||||
failure ("ERROR xfer failed");
|
||||
if (! purple_xfer_is_canceled (data->xfer)) {
|
||||
purple_xfer_cancel_remote (data->xfer);
|
||||
}
|
||||
failure ("send xfer failed");
|
||||
}
|
||||
|
||||
|
||||
data->loading = FALSE;
|
||||
|
||||
data->xfer->data = NULL;
|
||||
purple_xfer_unref (data->xfer);
|
||||
tgprpl_xfer_free_data (data);
|
||||
}
|
||||
|
||||
static void tgprpl_xfer_canceled (PurpleXfer *X) {
|
||||
debug ("tgprpl_xfer_canceled()");
|
||||
struct tgp_xfer_send_data *data = X->data;
|
||||
tgprpl_xfer_free_data (data);
|
||||
|
||||
// the xfer data must not be freed when the transfer is still running, since there is no way to cancel
|
||||
// the running transfer and the callback still needs the xfer data. In that case transfer data will
|
||||
// be freed once the transfer finished or the account goes offline and all loading transfers are aborted.
|
||||
if (! data->loading) {
|
||||
data->xfer->data = NULL;
|
||||
tgprpl_xfer_free_data (data);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean tgprpl_xfer_upload_progress (gpointer _data) {
|
||||
PurpleXfer *X = _data;
|
||||
struct tgp_xfer_send_data *data = X->data;
|
||||
connection_data *conn = data->conn;
|
||||
|
||||
PurpleXferType type = purple_xfer_get_type(X);
|
||||
|
||||
PurpleXferType type = purple_xfer_get_type (X);
|
||||
switch (type) {
|
||||
case PURPLE_XFER_SEND:
|
||||
purple_xfer_set_size (X, conn->TLS->cur_uploading_bytes);
|
||||
purple_xfer_set_bytes_sent (X, conn->TLS->cur_uploaded_bytes);
|
||||
purple_xfer_update_progress (X);
|
||||
|
||||
|
||||
debug ("PURPLE_XFER_SEND progress %d / %d", conn->TLS->cur_uploaded_bytes, conn->TLS->cur_uploading_bytes);
|
||||
if (conn->TLS->cur_uploaded_bytes == conn->TLS->cur_uploading_bytes) {
|
||||
data->timer = 0;
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case PURPLE_XFER_RECEIVE:
|
||||
purple_xfer_set_size (X, conn->TLS->cur_downloading_bytes);
|
||||
purple_xfer_set_bytes_sent (X, conn->TLS->cur_downloaded_bytes);
|
||||
purple_xfer_update_progress (X);
|
||||
|
||||
|
||||
debug ("PURPLE_XFER_RECEIVE progress %d / %d", conn->TLS->cur_downloaded_bytes, conn->TLS->cur_downloading_bytes);
|
||||
if (conn->TLS->cur_downloading_bytes == conn->TLS->cur_downloaded_bytes) {
|
||||
data->timer = 0;
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
case PURPLE_XFER_UNKNOWN:
|
||||
failure ("ERROR: tgprpl_xfer_upload_progress xfer type PURPLE_XFER_UNKNOWN.");
|
||||
|
@ -151,52 +175,59 @@ static gboolean tgprpl_xfer_upload_progress (gpointer _data) {
|
|||
}
|
||||
|
||||
static void tgprpl_xfer_recv_init (PurpleXfer *X) {
|
||||
debug ("tgprpl_xfer_recv_init");
|
||||
debug ("tgprpl_xfer_recv_init(): receiving xfer accepted.");
|
||||
|
||||
struct tgp_xfer_send_data *data = X->data;
|
||||
struct tgl_state *TLS = data->conn->TLS;
|
||||
struct tgl_message *M = data->msg;
|
||||
struct tgl_document *D = M->media.document;
|
||||
tgl_peer_t *P = NULL;
|
||||
|
||||
|
||||
purple_xfer_start (X, -1, NULL, 0);
|
||||
const char *who = purple_xfer_get_remote_user (X);
|
||||
P = tgp_blist_lookup_peer_get (TLS, who);
|
||||
if (P) {
|
||||
switch (M->media.type) {
|
||||
case tgl_message_media_document:
|
||||
tgl_do_load_document (TLS, D, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
|
||||
case tgl_message_media_document_encr:
|
||||
tgl_do_load_encr_document (TLS, M->media.encr_document, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
|
||||
case tgl_message_media_audio:
|
||||
tgl_do_load_audio (TLS, D, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
|
||||
case tgl_message_media_video:
|
||||
tgl_do_load_video (TLS, D, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
g_return_if_fail(P);
|
||||
|
||||
default:
|
||||
failure ("Unknown message media type: %d, XFER not possible.", M->media.type);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
warning ("User not found, not downloading...");
|
||||
switch (M->media.type) {
|
||||
case tgl_message_media_document:
|
||||
tgl_do_load_document (TLS, D, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
|
||||
case tgl_message_media_document_encr:
|
||||
tgl_do_load_encr_document (TLS, M->media.encr_document, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
|
||||
case tgl_message_media_audio:
|
||||
tgl_do_load_audio (TLS, D, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
|
||||
case tgl_message_media_video:
|
||||
tgl_do_load_video (TLS, D, tgprpl_xfer_recv_on_finished, data);
|
||||
break;
|
||||
|
||||
default:
|
||||
failure ("Unknown message media type: %d, XFER not possible.", M->media.type);
|
||||
return;
|
||||
}
|
||||
|
||||
// Prevent the xfer data from getting freed after cancelling to allow the file transfer to complete
|
||||
// without crashing. This is necessary cause loading the file in libtgl cannot be aborted once started.
|
||||
purple_xfer_ref (X);
|
||||
|
||||
data->timer = purple_timeout_add (100, tgprpl_xfer_upload_progress, X);
|
||||
data->loading = TRUE;
|
||||
}
|
||||
|
||||
static void tgprpl_xfer_send_init (PurpleXfer *X) {
|
||||
debug ("tgprpl_xfer_send_init(): sending xfer accepted.");
|
||||
|
||||
struct tgp_xfer_send_data *data;
|
||||
const char *file, *localfile, *who;
|
||||
tgl_peer_t *P;
|
||||
|
||||
data = X->data;
|
||||
purple_xfer_start (X, -1, NULL, 0);
|
||||
|
||||
|
||||
file = purple_xfer_get_filename (X);
|
||||
localfile = purple_xfer_get_local_filename (X);
|
||||
who = purple_xfer_get_remote_user (X);
|
||||
|
@ -208,6 +239,7 @@ static void tgprpl_xfer_send_init (PurpleXfer *X) {
|
|||
if (tgl_get_peer_type (P->id) == TGL_PEER_ENCR_CHAT) {
|
||||
purple_xfer_error (PURPLE_XFER_SEND, data->conn->pa, who,
|
||||
_("Sorry, sending documents to encrypted chats not yet supported."));
|
||||
purple_xfer_cancel_local (X);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -216,8 +248,14 @@ static void tgprpl_xfer_send_init (PurpleXfer *X) {
|
|||
flags |= TGLMF_POST_AS_CHANNEL;
|
||||
}
|
||||
|
||||
tgl_do_send_document (data->conn->TLS, P->id, (char*) localfile, NULL, 0, flags, tgprpl_xfer_on_finished, data);
|
||||
tgl_do_send_document (data->conn->TLS, P->id, (char*) localfile, NULL, 0,
|
||||
flags, tgprpl_xfer_send_on_finished, data);
|
||||
|
||||
// see comment in tgprpl_xfer_recv_init()
|
||||
purple_xfer_ref (X);
|
||||
|
||||
data->timer = purple_timeout_add (100, tgprpl_xfer_upload_progress, X);
|
||||
data->loading = TRUE;
|
||||
}
|
||||
|
||||
static void tgprpl_xfer_init_data (PurpleXfer *X, connection_data *conn, struct tgl_message *msg) {
|
||||
|
@ -232,33 +270,55 @@ static void tgprpl_xfer_init_data (PurpleXfer *X, connection_data *conn, struct
|
|||
|
||||
static void tgprpl_xfer_free_data (struct tgp_xfer_send_data *data) {
|
||||
if (data->timer) {
|
||||
purple_input_remove(data->timer);
|
||||
purple_input_remove (data->timer);
|
||||
}
|
||||
data->timer = 0;
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
void tgprpl_xfer_free_all (connection_data *conn) {
|
||||
GList *xfers = purple_xfers_get_all();
|
||||
GList *xfers = purple_xfers_get_all ();
|
||||
while (xfers) {
|
||||
PurpleXfer *xfer = xfers->data;
|
||||
struct tgp_xfer_send_data *data = xfer->data;
|
||||
|
||||
if (data) {
|
||||
purple_xfer_cancel_local (xfer);
|
||||
|
||||
if (purple_xfer_get_account (xfer) == conn->pa) {
|
||||
debug ("xfer: %s", xfer->filename);
|
||||
|
||||
// cancel all non-completed file tranfsers to avoid them from being called
|
||||
// in future sessions, as they still contain references to already freed data.
|
||||
if (! purple_xfer_is_canceled (xfer) && ! purple_xfer_is_completed (xfer)) {
|
||||
purple_xfer_cancel_local (xfer);
|
||||
}
|
||||
|
||||
// if a file transfer is still running while going offline, it will be canceled when
|
||||
// cleaning up libtgl memory. Since canceled file transfers are being kept (see
|
||||
// tgprpl_xfer_canceled() and tgprpl_xfer_recv_init()) those need to be freed now.
|
||||
struct tgp_xfer_send_data *data = xfer->data;
|
||||
if (data) {
|
||||
if (data->loading) {
|
||||
tgprpl_xfer_free_data (data);
|
||||
xfer->data = NULL;
|
||||
purple_xfer_unref (xfer);
|
||||
} else {
|
||||
g_warn_if_reached();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xfers = g_list_next(xfers);
|
||||
}
|
||||
}
|
||||
|
||||
PurpleXfer *tgprpl_new_xfer (PurpleConnection *gc, const char *who) {
|
||||
debug ("tgprpl_new_xfer()");
|
||||
|
||||
PurpleXfer *X = purple_xfer_new (purple_connection_get_account (gc), PURPLE_XFER_SEND, 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);
|
||||
}
|
||||
|
||||
return X;
|
||||
}
|
||||
|
||||
|
@ -266,18 +326,19 @@ static PurpleXfer *tgprpl_new_xfer_recv (PurpleConnection *gc, const char *who)
|
|||
PurpleXfer *X = purple_xfer_new (purple_connection_get_account (gc), PURPLE_XFER_RECEIVE, who);
|
||||
purple_xfer_set_init_fnc (X, tgprpl_xfer_recv_init);
|
||||
purple_xfer_set_cancel_recv_fnc (X, tgprpl_xfer_canceled);
|
||||
|
||||
return X;
|
||||
}
|
||||
|
||||
void tgprpl_recv_file (PurpleConnection *gc, const char *who, struct tgl_message *M) {
|
||||
debug ("tgprpl_recv_file()");
|
||||
g_return_if_fail (who);
|
||||
|
||||
|
||||
PurpleXfer *X = tgprpl_new_xfer_recv (gc, who);
|
||||
const char *mime_type, *caption;
|
||||
long long access_hash;
|
||||
int flags, size;
|
||||
|
||||
|
||||
if (M->media.type == tgl_message_media_document_encr) {
|
||||
mime_type = M->media.encr_document->mime_type;
|
||||
caption = M->media.encr_document->caption;
|
||||
|
@ -295,7 +356,7 @@ void tgprpl_recv_file (PurpleConnection *gc, const char *who, struct tgl_message
|
|||
char *filename = tgp_strdup_determine_filename (mime_type, caption, flags, access_hash);
|
||||
purple_xfer_set_filename (X, filename);
|
||||
g_free (filename);
|
||||
|
||||
|
||||
purple_xfer_set_size (X, size);
|
||||
tgprpl_xfer_init_data (X, purple_connection_get_protocol_data (gc), M);
|
||||
purple_xfer_request (X);
|
||||
|
|
|
@ -57,7 +57,7 @@ typedef struct {
|
|||
|
||||
struct tgp_xfer_send_data {
|
||||
int timer;
|
||||
int done;
|
||||
int loading;
|
||||
PurpleXfer *xfer;
|
||||
connection_data *conn;
|
||||
struct tgl_message *msg;
|
||||
|
|
Loading…
Add table
Reference in a new issue