From d32a8e041f2b166d87f85934ae701eb88b2e32d2 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Tue, 17 May 2011 02:38:48 +0400 Subject: [PATCH] Multi thread image downloading. Fixed Issue 18. --- Mage.Client/plugins/mage-card-plugin.jar | Bin 309005 -> 309642 bytes .../plugins/card/images/DownloadPictures.java | 160 ++++++++++-------- 2 files changed, 87 insertions(+), 73 deletions(-) diff --git a/Mage.Client/plugins/mage-card-plugin.jar b/Mage.Client/plugins/mage-card-plugin.jar index 1a4874d6d579987e4673bf2f1549241477083537..84043998e4e765da81543b6788f0c62501ddc2ff 100644 GIT binary patch delta 20495 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 delta 19697 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 ignoreUrls = SettingsManager.getIntance().getIgnoreUrls(); - for (update(0); (checkBox.isSelected() ? cardIndex < cardsInGame.size() : cardIndex < cards.size()) && !cancel; update(cardIndex + 1)) { + update(0); + for (int i = 0; (checkBox.isSelected() ? i < cardsInGame.size() : i < cards.size()) && !cancel; i++) { try { - CardUrl card = checkBox.isSelected() ? cardsInGame.get(cardIndex) : cards.get(cardIndex); + CardUrl card = checkBox.isSelected() ? cardsInGame.get(i) : cards.get(i); log.info("Downloading card: " + card.name + " (" + card.set + ")"); URL url = new URL(CardImageUtils.generateURL(card.collector, card.set)); if (ignoreUrls.contains(card.set) || card.token) { - // we have card in scripts, but we should ignore - // downloading image for it - // (e.g. for cards from custom or not released yet sets - // such urls should come from card-pictures files - // instead if (card.collector != 0) { continue; } url = new URL(card.url); } - in = new BufferedInputStream(url.openConnection(p).getInputStream()); - - createDirForCard(card); - - boolean withCollectorId = false; - if (card.name.equals("Forest") || card.name.equals("Mountain") || card.name.equals("Swamp") - || card.name.equals("Island") || card.name.equals("Plains")) { - withCollectorId = true; - } - File fileOut = new File(CardImageUtils.getImagePath(card, withCollectorId)); - - out = new BufferedOutputStream(new FileOutputStream(fileOut)); - - while ((len = in.read(buf)) != -1) { - // user cancelled - if (cancel) { - in.close(); - out.flush(); - out.close(); - - // delete what was written so far - fileOut.delete(); - - return; - } - - out.write(buf, 0, len); - } - - in.close(); - out.flush(); - out.close(); + + Runnable task = new DownloadTask(card, url); + executor.execute(task); } catch (Exception ex) { log.error(ex, ex); - /* - * int more = JOptionPane.showConfirmDialog(null, - * "Some error occured. Continue downloading pictures?", - * "Error", JOptionPane.YES_NO_OPTION); if (more == - * JOptionPane.NO_OPTION) { break; } - */ } } + executor.shutdown(); + while (!executor.isTerminated()) { + try { + Thread.sleep(1000); + } catch (InterruptedException ie) {} + } } close.setText("Close"); } + + private final class DownloadTask implements Runnable { + private CardUrl card; + private URL url; + + public DownloadTask(CardUrl card, URL url) { + this.card = card; + this.url = url; + } + + public void run() { + try { + BufferedInputStream in = new BufferedInputStream(url.openConnection(p).getInputStream()); + + createDirForCard(card); + + boolean withCollectorId = false; + if (card.name.equals("Forest") || card.name.equals("Mountain") || card.name.equals("Swamp") + || card.name.equals("Island") || card.name.equals("Plains")) { + withCollectorId = true; + } + File fileOut = new File(CardImageUtils.getImagePath(card, withCollectorId)); + + BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileOut)); + + byte[] buf = new byte[1024]; + int len = 0; + while ((len = in.read(buf)) != -1) { + // user cancelled + if (cancel) { + in.close(); + out.flush(); + out.close(); + // delete what was written so far + fileOut.delete(); + } + out.write(buf, 0, len); + } + + in.close(); + out.flush(); + out.close(); + + synchronized (sync) { + update(cardIndex + 1); + } + } catch (Exception e) { + log.error(e, e); + } + + } + } private static File createDirForCard(CardUrl card) throws Exception { File setDir = new File(CardImageUtils.getImageDir(card)); @@ -491,32 +516,21 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab private void update(int card) { this.cardIndex = card; - final class Worker implements Runnable { - private int card; - - Worker(int card) { - this.card = card; - } - - public void run() { - fireStateChanged(); - if (checkBox.isSelected()) { - int count = DownloadPictures.this.cardsInGame.size(); - int countLeft = count - card; - float mb = (countLeft * 70.0f) / 1024; - bar.setString(String.format(this.card == count ? "%d of %d cards finished! Please close!" - : "%d of %d cards finished! Please wait! [%.1f Mb]", this.card, count, mb)); - } else { - int count = DownloadPictures.this.cards.size(); - int countLeft = count - card; - float mb = (countLeft * 70.0f) / 1024; - bar.setString(String.format(cardIndex == count ? "%d of %d cards finished! Please close!" - : "%d of %d cards finished! Please wait! [%.1f Mb]", this.card, count, mb)); - } - } + if (checkBox.isSelected()) { + int count = DownloadPictures.this.cardsInGame.size(); + int countLeft = count - card; + float mb = (countLeft * 70.0f) / 1024; + bar.setString(String.format(card == count ? "%d of %d cards finished! Please close!" + : "%d of %d cards finished! Please wait! [%.1f Mb]", + card, count, mb)); + } else { + int count = DownloadPictures.this.cards.size(); + int countLeft = count - card; + float mb = (countLeft * 70.0f) / 1024; + bar.setString(String.format(cardIndex == count ? "%d of %d cards finished! Please close!" + : "%d of %d cards finished! Please wait! [%.1f Mb]", + card, count, mb)); } - - EventQueue.invokeLater(new Worker(card)); } private static final Logger log = Logger.getLogger(DownloadPictures.class);