]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/engine/HtmlEntry.java
Add text to all RuntimeExceptions.
[Dictionary.git] / src / com / hughes / android / dictionary / engine / HtmlEntry.java
index ca582073fe3eafe8330ab6f46018d1ca4d20a0a9..f5ea520992e5521e1e810f781432a2edbc677514 100644 (file)
@@ -1,21 +1,21 @@
 
 package com.hughes.android.dictionary.engine;
 
-import com.hughes.android.dictionary.C;
 import com.hughes.util.StringUtil;
 import com.hughes.util.raf.RAFListSerializer;
-import com.hughes.util.raf.RAFSerializable;
 import com.ibm.icu.text.Transliterator;
 
+import java.io.DataInput;
+import java.io.DataOutput;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.io.RandomAccessFile;
+import java.io.UnsupportedEncodingException;
 import java.lang.ref.SoftReference;
 import java.util.List;
 import java.util.regex.Pattern;
 
-public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntry>,
-        Comparable<HtmlEntry> {
+public class HtmlEntry extends AbstractEntry implements Comparable<HtmlEntry> {
 
     // Title is not HTML escaped.
     public final String title;
@@ -28,24 +28,30 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
         lazyHtmlLoader = null;
     }
 
-    public HtmlEntry(Dictionary dictionary, RandomAccessFile raf, final int index)
+    public HtmlEntry(Dictionary dictionary, DataInput raf, final int index)
             throws IOException {
         super(dictionary, raf, index);
         title = raf.readUTF();
-        lazyHtmlLoader = new LazyHtmlLoader(raf);
+        lazyHtmlLoader = new LazyHtmlLoader(raf, dictionary.htmlData, index);
         html = null;
     }
 
-    @Override
-    public void write(RandomAccessFile raf) throws IOException {
+    public void writeBase(DataOutput raf) throws IOException {
         super.write(raf);
         raf.writeUTF(title);
+    }
 
+    public void writeData(DataOutput raf) throws IOException {
         final byte[] bytes = getHtml().getBytes("UTF-8");
-        final byte[] zipBytes = StringUtil.zipBytes(bytes);
-        raf.writeInt(bytes.length);
-        raf.writeInt(zipBytes.length);
-        raf.write(zipBytes);
+        StringUtil.writeVarInt(raf, bytes.length);
+        raf.write(bytes);
+    }
+
+    public static byte[] readData(DataInput raf) throws IOException {
+        int len = StringUtil.readVarInt(raf);
+        final byte[] bytes = new byte[len];
+        raf.readFully(bytes);
+        return bytes;
     }
 
     String getHtml() {
@@ -73,13 +79,38 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
         }
 
         @Override
-        public HtmlEntry read(RandomAccessFile raf, final int index) throws IOException {
+        public HtmlEntry read(DataInput raf, final int index) throws IOException {
             return new HtmlEntry(dictionary, raf, index);
         }
 
         @Override
-        public void write(RandomAccessFile raf, HtmlEntry t) throws IOException {
-            t.write(raf);
+        public void write(DataOutput raf, HtmlEntry t) throws IOException {
+            t.writeBase(raf);
+        }
+    }
+
+    static final class DataSerializer implements RAFListSerializer<HtmlEntry> {
+        @Override
+        public HtmlEntry read(DataInput raf, final int index) throws IOException {
+            assert false;
+            return null;
+        }
+
+        @Override
+        public void write(DataOutput raf, HtmlEntry t) throws IOException {
+            t.writeData(raf);
+        }
+    }
+
+    static final class DataDeserializer implements RAFListSerializer<byte[]> {
+        @Override
+        public byte[] read(DataInput raf, final int index) throws IOException {
+            return HtmlEntry.readData(raf);
+        }
+
+        @Override
+        public void write(DataOutput raf, byte[] t) throws IOException {
+            assert false;
         }
     }
 
@@ -106,9 +137,9 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
 
         boolean isExpanded = false;
 
-        Row(final RandomAccessFile raf, final int thisRowIndex,
-                final Index index) throws IOException {
-            super(raf, thisRowIndex, index);
+        Row(final DataInput raf, final int thisRowIndex,
+                final Index index, int extra) throws IOException {
+            super(raf, thisRowIndex, index, extra);
         }
 
         Row(final int referenceIndex, final int thisRowIndex,
@@ -183,12 +214,23 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
         final long offset;
         final int numBytes;
         final int numZipBytes;
+        final List<byte[]> data;
+        final int index;
 
         // Not sure this volatile is right, but oh well.
         volatile SoftReference<String> htmlRef = new SoftReference<String>(null);
 
-        private LazyHtmlLoader(final RandomAccessFile raf) throws IOException {
-            this.raf = raf;
+        private LazyHtmlLoader(final DataInput inp, List<byte[]> data, int index) throws IOException {
+            this.data = data;
+            this.index = index;
+            if (data != null) {
+                this.raf = null;
+                this.offset = 0;
+                this.numBytes = -1;
+                this.numZipBytes = -1;
+                return;
+            }
+            raf = (RandomAccessFile)inp;
             numBytes = raf.readInt();
             numZipBytes = raf.readInt();
             offset = raf.getFilePointer();
@@ -200,23 +242,31 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
             if (html != null) {
                 return html;
             }
+            if (data != null) {
+                try {
+                    html = new String(data.get(index), "UTF-8");
+                } catch (UnsupportedEncodingException e) {
+                    throw new RuntimeException("Dictionary HTML data corrupted", e);
+                }
+                htmlRef = new SoftReference<String>(html);
+                return html;
+            }
             System.out.println("Loading Html: numBytes=" + numBytes + ", numZipBytes="
                     + numZipBytes);
-            final byte[] bytes = new byte[numBytes];
             final byte[] zipBytes = new byte[numZipBytes];
             synchronized (raf) {
                 try {
                     raf.seek(offset);
                     raf.read(zipBytes);
                 } catch (IOException e) {
-                    throw new RuntimeException(e);
+                    throw new RuntimeException("Failed to read HTML data from dictionary", e);
                 }
             }
             try {
-                StringUtil.unzipFully(zipBytes, bytes);
+                final byte[] bytes = StringUtil.unzipFully(zipBytes, numBytes);
                 html = new String(bytes, "UTF-8");
             } catch (IOException e) {
-                throw new RuntimeException(e);
+                throw new RuntimeException("Dictionary HTML data corrupted", e);
             }
             htmlRef = new SoftReference<String>(html);
             return html;