From e84af512729cafa43ed831540d4406e1bb913689 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 15 Nov 2016 15:43:04 +0100 Subject: [PATCH] distinguish between general i/o error and write exception when copying files --- .../http/HttpDownloadConnection.java | 11 +++----- .../persistance/FileBackend.java | 25 ++++++++++++++----- .../utils/FileWriterException.java | 4 +++ 3 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 src/main/java/eu/siacs/conversations/utils/FileWriterException.java diff --git a/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java b/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java index a9bffe3ee..87f627061 100644 --- a/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java +++ b/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java @@ -25,6 +25,7 @@ import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.services.AbstractConnectionManager; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.CryptoHelper; +import eu.siacs.conversations.utils.FileWriterException; public class HttpDownloadConnection implements Transferable { @@ -141,16 +142,12 @@ public class HttpDownloadConnection implements Transferable { mXmppConnectionService.updateConversationUi(); } - private class WriteException extends IOException { - - } - private void showToastForException(Exception e) { if (e instanceof java.net.UnknownHostException) { mXmppConnectionService.showErrorToastInUi(R.string.download_failed_server_not_found); } else if (e instanceof java.net.ConnectException) { mXmppConnectionService.showErrorToastInUi(R.string.download_failed_could_not_connect); - } else if (e instanceof WriteException) { + } else if (e instanceof FileWriterException) { mXmppConnectionService.showErrorToastInUi(R.string.download_failed_could_not_write_file); } else if (!(e instanceof CancellationException)) { mXmppConnectionService.showErrorToastInUi(R.string.download_failed_file_not_found); @@ -305,7 +302,7 @@ public class HttpDownloadConnection implements Transferable { try { os.write(buffer, 0, count); } catch (IOException e) { - throw new WriteException(); + throw new FileWriterException(); } updateProgress((int) ((((double) transmitted) / expected) * 100)); if (canceled) { @@ -315,7 +312,7 @@ public class HttpDownloadConnection implements Transferable { try { os.flush(); } catch (IOException e) { - throw new WriteException(); + throw new FileWriterException(); } } catch (CancellationException | IOException e) { throw e; diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index bc919788d..1886d3c09 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -54,6 +54,7 @@ import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.ExifHelper; import eu.siacs.conversations.utils.FileUtils; +import eu.siacs.conversations.utils.FileWriterException; import eu.siacs.conversations.xmpp.pep.Avatar; public class FileBackend { @@ -238,11 +239,21 @@ public class FileBackend { byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { - os.write(buffer, 0, length); + try { + os.write(buffer, 0, length); + } catch (IOException e) { + throw new FileWriterException(); + } + } + try { + os.flush(); + } catch (IOException e) { + throw new FileWriterException(); } - os.flush(); } catch(FileNotFoundException e) { throw new FileCopyException(R.string.error_file_not_found); + } catch(FileWriterException e) { + throw new FileCopyException(R.string.error_unable_to_create_temporary_file); } catch (IOException e) { e.printStackTrace(); throw new FileCopyException(R.string.error_io_exception); @@ -287,8 +298,13 @@ public class FileBackend { InputStream is = null; OutputStream os = null; try { - file.createNewFile(); + if (!file.exists() && !file.createNewFile()) { + throw new FileCopyException(R.string.error_unable_to_create_temporary_file); + } is = mXmppConnectionService.getContentResolver().openInputStream(image); + if (is == null) { + throw new FileCopyException(R.string.error_not_an_image_file); + } Bitmap originalBitmap; BitmapFactory.Options options = new BitmapFactory.Options(); int inSampleSize = (int) Math.pow(2, sampleSize); @@ -315,7 +331,6 @@ public class FileBackend { quality -= 5; } scaledBitmap.recycle(); - return; } catch (FileNotFoundException e) { throw new FileCopyException(R.string.error_file_not_found); } catch (IOException e) { @@ -330,8 +345,6 @@ public class FileBackend { } else { throw new FileCopyException(R.string.error_out_of_memory); } - } catch (NullPointerException e) { - throw new FileCopyException(R.string.error_io_exception); } finally { close(os); close(is); diff --git a/src/main/java/eu/siacs/conversations/utils/FileWriterException.java b/src/main/java/eu/siacs/conversations/utils/FileWriterException.java new file mode 100644 index 000000000..f406f4197 --- /dev/null +++ b/src/main/java/eu/siacs/conversations/utils/FileWriterException.java @@ -0,0 +1,4 @@ +package eu.siacs.conversations.utils; + +public class FileWriterException extends Exception { +}