diff --git a/src/org/geometerplus/fbreader/book/BookCollection.java b/src/org/geometerplus/fbreader/book/BookCollection.java index 589de6eec..719d9fc74 100644 --- a/src/org/geometerplus/fbreader/book/BookCollection.java +++ b/src/org/geometerplus/fbreader/book/BookCollection.java @@ -19,14 +19,12 @@ package org.geometerplus.fbreader.book; -import java.io.*; +import java.io.File; import java.util.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.filesystem.ZLPhysicalFile; import org.geometerplus.zlibrary.core.image.ZLImage; -import org.geometerplus.zlibrary.core.image.ZLLoadableImage; -import org.geometerplus.zlibrary.core.image.ZLSingleImage; import org.geometerplus.zlibrary.text.view.ZLTextPosition; import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData; @@ -618,64 +616,22 @@ public class BookCollection extends AbstractBookCollection { @Override public boolean saveCover(Book book, String url) { - if (getBookById(book.getId()) == null) { return false; } - + final ZLImage image = BookUtil.getCover(book); if (image == null) { return false; } - - if (image instanceof ZLLoadableImage) { - final ZLLoadableImage loadableImage = (ZLLoadableImage)image; - if (!loadableImage.isSynchronized()) { - loadableImage.synchronize(); - } - } + final ZLAndroidImageData data = ((ZLAndroidImageManager)ZLAndroidImageManager.Instance()).getImageData(image); if (data == null) { return false; } - final InputStream inputStream = ((ZLSingleImage)image).inputStream(); - if (inputStream == null) { - return false; - } - - OutputStream outputStream = null; - final File file = new File(url); - final File parent = file.getParentFile(); - parent.mkdirs(); - try { - outputStream = new FileOutputStream(file); - int read = 0; - byte[] bytes = new byte[1024]; - while ((read = inputStream.read(bytes)) != -1) { - outputStream.write(bytes, 0, read); - } - } catch (IOException e) { - e.printStackTrace(); - return false; - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (outputStream != null) { - try { - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return true; + return image.saveToFile(url); } public List bookmarks(BookmarkQuery query) { diff --git a/src/org/geometerplus/zlibrary/core/image/ZLImage.java b/src/org/geometerplus/zlibrary/core/image/ZLImage.java index 72a1ab7de..82d5ea666 100644 --- a/src/org/geometerplus/zlibrary/core/image/ZLImage.java +++ b/src/org/geometerplus/zlibrary/core/image/ZLImage.java @@ -21,4 +21,5 @@ package org.geometerplus.zlibrary.core.image; public interface ZLImage { String getURI(); + boolean saveToFile(String url); } diff --git a/src/org/geometerplus/zlibrary/core/image/ZLLoadableImage.java b/src/org/geometerplus/zlibrary/core/image/ZLLoadableImage.java index 2e1e8141d..03aa4bfa7 100644 --- a/src/org/geometerplus/zlibrary/core/image/ZLLoadableImage.java +++ b/src/org/geometerplus/zlibrary/core/image/ZLLoadableImage.java @@ -49,4 +49,12 @@ public abstract class ZLLoadableImage extends ZLSingleImage { public abstract void synchronize(); public abstract void synchronizeFast(); public abstract String getId(); + + @Override + public boolean saveToFile(String url) { + if (!isSynchronized()) { + synchronize(); + } + return super.saveToFile(url); + } } diff --git a/src/org/geometerplus/zlibrary/core/image/ZLSingleImage.java b/src/org/geometerplus/zlibrary/core/image/ZLSingleImage.java index 26999ccdb..b3e783746 100644 --- a/src/org/geometerplus/zlibrary/core/image/ZLSingleImage.java +++ b/src/org/geometerplus/zlibrary/core/image/ZLSingleImage.java @@ -19,7 +19,7 @@ package org.geometerplus.zlibrary.core.image; -import java.io.InputStream; +import java.io.*; import org.geometerplus.zlibrary.core.util.MimeType; @@ -35,4 +35,44 @@ public abstract class ZLSingleImage implements ZLImage { public final MimeType mimeType() { return myMimeType; } + + @Override + public boolean saveToFile(String url) { + final InputStream inputStream = inputStream(); + if (inputStream == null) { + return false; + } + + OutputStream outputStream = null; + final File file = new File(url); + final File parent = file.getParentFile(); + parent.mkdirs(); + try { + outputStream = new FileOutputStream(file); + int read = 0; + byte[] bytes = new byte[1024]; + while ((read = inputStream.read(bytes)) != -1) { + outputStream.write(bytes, 0, read); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return true; + } }