diff --git a/src/org/geometerplus/android/fbreader/api/ApiServerImplementation.java b/src/org/geometerplus/android/fbreader/api/ApiServerImplementation.java index 7bf26280c..17fe8c7fc 100644 --- a/src/org/geometerplus/android/fbreader/api/ApiServerImplementation.java +++ b/src/org/geometerplus/android/fbreader/api/ApiServerImplementation.java @@ -186,8 +186,7 @@ public class ApiServerImplementation extends ApiInterface.Stub implements Api, A } public String getBookHash() { - // TODO: implement - return null; + return myReader.Model.Book.getContentHashCode(); } // page information diff --git a/src/org/geometerplus/fbreader/library/Book.java b/src/org/geometerplus/fbreader/library/Book.java index 63deb87f9..fd76f5c76 100644 --- a/src/org/geometerplus/fbreader/library/Book.java +++ b/src/org/geometerplus/fbreader/library/Book.java @@ -20,6 +20,10 @@ package org.geometerplus.fbreader.library; import java.util.*; +import java.io.InputStream; +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import org.geometerplus.zlibrary.core.util.ZLMiscUtil; import org.geometerplus.zlibrary.core.filesystem.*; @@ -415,6 +419,41 @@ public class Book { } } + public String getContentHashCode() { + InputStream stream = null; + + try { + final MessageDigest hash = MessageDigest.getInstance("SHA-256"); + stream = File.getInputStream(); + + final byte[] buffer = new byte[2048]; + while (true) { + final int nread = stream.read(buffer); + if (nread == -1) { + break; + } + hash.update(buffer, 0, nread); + } + + final Formatter f = new Formatter(); + for (byte b : hash.digest()) { + f.format("%02X", b & 0xFF); + } + return f.toString(); + } catch (IOException e) { + return null; + } catch (NoSuchAlgorithmException e) { + return null; + } finally { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + } + } + } + } + @Override public int hashCode() { return (int)myId;