diff --git a/arduino-core/src/cc/arduino/contributions/packages/DownloadableContributionsDownloader.java b/arduino-core/src/cc/arduino/contributions/packages/DownloadableContributionsDownloader.java index 1a963254b30..2b8898619c4 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/DownloadableContributionsDownloader.java +++ b/arduino-core/src/cc/arduino/contributions/packages/DownloadableContributionsDownloader.java @@ -57,17 +57,18 @@ public File download(DownloadableContribution contribution, // Ensure the existence of staging folder stagingFolder.mkdirs(); - // Need to download or resume downloading? - if (!outputFile.isFile() || (outputFile.length() < contribution.getSize())) { - download(url, outputFile, progress, statusText); + if (fileAlreadyDownloaded(outputFile, contribution)) { + contribution.setDownloaded(true); + contribution.setDownloadedFile(outputFile); + return outputFile; } + download(url, outputFile, progress, statusText); + // Test checksum progress.setStatus(_("Verifying archive integrity...")); onProgress(progress); - String checksum = contribution.getChecksum(); - String algo = checksum.split(":")[0]; - if (!FileHash.hash(outputFile, algo).equals(checksum)) { + if (checksumMatches(outputFile, contribution)) { throw new Exception(_("CRC doesn't match. File is corrupted.")); } @@ -76,6 +77,29 @@ public File download(DownloadableContribution contribution, return outputFile; } + private boolean checksumMatches(File outputFile, + DownloadableContribution contribution) + throws Exception { + final String checksum = contribution.getChecksum(); + final String algo = checksum.split(":")[0]; + + return FileHash.hash(outputFile, algo).equals(checksum); + } + + private boolean fileAlreadyDownloaded + (File outputFile, + DownloadableContribution contribution) throws Exception { + if (!outputFile.isFile()) { + return false; + } + + if (outputFile.length() != contribution.getSize()) { + return false; + } + + return checksumMatches(outputFile, contribution); + } + public void download(URL url, File tmpFile, final Progress progress, final String statusText) throws Exception { FileDownloader downloader = new FileDownloader(url, tmpFile);