diff --git a/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java b/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java --- a/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java +++ b/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java @@ -272,7 +272,7 @@ if (socket instanceof SSLSocket) { payloadSocket = SslHelper.convertToSslSocket(context, payloadSocket, getDeviceId(), true, true); } - np.setPayload(payloadSocket.getInputStream(), np.getPayloadSize()); + np.setPayloadSocket(payloadSocket, np.getPayloadSize()); } catch (Exception e) { try { payloadSocket.close(); } catch(Exception ignored) { } e.printStackTrace(); diff --git a/src/org/kde/kdeconnect/NetworkPacket.java b/src/org/kde/kdeconnect/NetworkPacket.java --- a/src/org/kde/kdeconnect/NetworkPacket.java +++ b/src/org/kde/kdeconnect/NetworkPacket.java @@ -30,7 +30,9 @@ import org.kde.kdeconnect.Plugins.PluginFactory; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStream; +import java.net.Socket; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -54,6 +56,7 @@ String mType; private JSONObject mBody; private InputStream mPayload; + private Socket mPayloadSocket; private JSONObject mPayloadTransferInfo; private long mPayloadSize; @@ -296,13 +299,20 @@ mPayloadSize = size; } - /*public void setPayload(InputStream stream) { - setPayload(stream, -1); + public void setPayloadSocket(Socket socket, long size) throws IOException { + mPayloadSocket = socket; + mPayload = socket.getInputStream(); + mPayloadSize = size; + } + + /*public void setPayloadSocket(InputStream stream) { + setPayloadSocket(stream, -1); }*/ public InputStream getPayload() { return mPayload; } + public Socket getPayloadSocket() { return mPayloadSocket; } public long getPayloadSize() { return mPayloadSize; diff --git a/src/org/kde/kdeconnect/Plugins/MprisPlugin/AlbumArtCache.java b/src/org/kde/kdeconnect/Plugins/MprisPlugin/AlbumArtCache.java --- a/src/org/kde/kdeconnect/Plugins/MprisPlugin/AlbumArtCache.java +++ b/src/org/kde/kdeconnect/Plugins/MprisPlugin/AlbumArtCache.java @@ -39,6 +39,7 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; +import java.net.Socket; import java.net.URL; import java.net.URLDecoder; import java.security.MessageDigest; @@ -244,6 +245,7 @@ private static final class FetchURLTask extends AsyncTask { private final URL url; private InputStream input; + private Socket payloadSocket; private final DiskLruCache.Editor cacheItem; private OutputStream output; @@ -254,9 +256,10 @@ * @param payloadInput A payload input stream (if from the connected device). null if fetched from http(s) * @param cacheItem The disk cache item to edit */ - FetchURLTask(URL url, InputStream payloadInput, DiskLruCache.Editor cacheItem) throws IOException { + FetchURLTask(URL url, InputStream payloadInput, Socket payloadSocket, DiskLruCache.Editor cacheItem) throws IOException { this.url = url; this.input = payloadInput; + this.payloadSocket = payloadSocket; this.cacheItem = cacheItem; output = cacheItem.newOutputStream(0); } @@ -321,6 +324,15 @@ return true; } catch (IOException e) { return false; + } finally { + try { + input.close(); + } catch (Exception ignored) {} + try { + if (payloadSocket != null) { + payloadSocket.close(); + } + } catch (Exception ignored) {} } } @@ -389,7 +401,7 @@ } //Do the actual fetch in the background - new FetchURLTask(url, null, cacheItem).execute(); + new FetchURLTask(url, null, null, cacheItem).execute(); } catch (IOException e) { Log.e("KDE/Mpris/AlbumArtCache", "Problems with the disk cache", e); --numFetching; @@ -425,16 +437,20 @@ * @param albumUrl The url of the album art (should be a file:// url) * @param payload The payload input stream */ - static void payloadToDiskCache(String albumUrl, InputStream payload) { + static void payloadToDiskCache(String albumUrl, InputStream payload, Socket payloadSocket) { //We need the disk cache for this + if (payload == null) { + return; + } + if (diskCache == null) { Log.e("KDE/Mpris/AlbumArtCache", "The disk cache is not intialized!"); try { payload.close(); } catch (IOException ignored) {} - return; - } - if (payload == null) { + try { + payloadSocket.close(); + } catch (IOException ignored) {} return; } @@ -494,11 +510,14 @@ try { payload.close(); } catch (IOException ignored) {} + try { + payloadSocket.close(); + } catch (IOException ignored) {} return; } //Do the actual fetch in the background - new FetchURLTask(url, payload, cacheItem).execute(); + new FetchURLTask(url, payload, payloadSocket, cacheItem).execute(); } catch (IOException e) { Log.e("KDE/Mpris/AlbumArtCache", "Problems with the disk cache", e); --numFetching; diff --git a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java --- a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java +++ b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisPlugin.java @@ -267,7 +267,7 @@ @Override public boolean onPacketReceived(NetworkPacket np) { if (np.getBoolean("transferringAlbumArt", false)) { - AlbumArtCache.payloadToDiskCache(np.getString("albumArtUrl"), np.getPayload()); + AlbumArtCache.payloadToDiskCache(np.getString("albumArtUrl"), np.getPayload(), np.getPayloadSocket()); return true; } diff --git a/src/org/kde/kdeconnect/Plugins/ReceiveNotificationsPlugin/ReceiveNotificationsPlugin.java b/src/org/kde/kdeconnect/Plugins/ReceiveNotificationsPlugin/ReceiveNotificationsPlugin.java --- a/src/org/kde/kdeconnect/Plugins/ReceiveNotificationsPlugin/ReceiveNotificationsPlugin.java +++ b/src/org/kde/kdeconnect/Plugins/ReceiveNotificationsPlugin/ReceiveNotificationsPlugin.java @@ -87,10 +87,15 @@ width = context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_width); height = context.getResources().getDimensionPixelSize(android.R.dimen.notification_large_icon_height); final InputStream input = np.getPayload(); - largeIcon = BitmapFactory.decodeStream(np.getPayload()); + largeIcon = BitmapFactory.decodeStream(input); try { input.close(); } catch (Exception e) { + } + try { + np.getPayloadSocket().close(); + } catch (Exception e) { + } if (largeIcon != null) { //Log.i("NotificationsPlugin", "hasPayload: size=" + largeIcon.getWidth() + "/" + largeIcon.getHeight() + " opti=" + width + "/" + height); @@ -131,5 +136,4 @@ public String[] getOutgoingPacketTypes() { return new String[]{PACKET_TYPE_NOTIFICATION_REQUEST}; } - } diff --git a/src/org/kde/kdeconnect/Plugins/SharePlugin/ReceiveFileRunnable.java b/src/org/kde/kdeconnect/Plugins/SharePlugin/ReceiveFileRunnable.java --- a/src/org/kde/kdeconnect/Plugins/SharePlugin/ReceiveFileRunnable.java +++ b/src/org/kde/kdeconnect/Plugins/SharePlugin/ReceiveFileRunnable.java @@ -81,12 +81,13 @@ } finally { try { info.inputStream.close(); - } catch (IOException e) { - } + } catch (IOException ignored) {} + try { + info.inputSocket.close(); + } catch (IOException ignored) {} try { info.outputStream.close(); - } catch (IOException e) { - } + } catch (IOException ignored) {} } } } diff --git a/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareInfo.java b/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareInfo.java --- a/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareInfo.java +++ b/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareInfo.java @@ -24,12 +24,14 @@ import java.io.InputStream; import java.io.OutputStream; +import java.net.Socket; class ShareInfo { String fileName; long fileSize; int currentFileNumber; DocumentFile fileDocument; + Socket inputSocket; InputStream inputStream; OutputStream outputStream; boolean shouldOpen; diff --git a/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java b/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java --- a/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java +++ b/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java @@ -204,6 +204,7 @@ ShareInfo info = new ShareInfo(); info.currentFileNumber = currentShareInfo == null ? 1 : currentShareInfo.currentFileNumber + 1; + info.inputSocket = np.getPayloadSocket(); info.inputStream = np.getPayload(); info.fileSize = np.getPayloadSize(); info.fileName = np.getString("filename", Long.toString(System.currentTimeMillis()));