public byte[] byteData() { try { final InputStream stream = myFile.getInputStream(); if (stream == null) { return new byte[0]; } stream.skip(myOffset); byte[] targetBuffer = new byte[65535]; final int size = DocDecompressor.decompress(stream, targetBuffer, myCompressedSize); if (size > 0 && size != 65535) { byte[] buffer = new byte[size]; System.arraycopy(targetBuffer, 0, buffer, 0, size); return buffer; } return targetBuffer; } catch (IOException e) { } return new byte[0]; }
private void readRecord(int recordSize) throws IOException { int uid = PdbUtil.readShort(myStream); if (uid == 1) { myCompressionVersion = (short) PdbUtil.readShort(myStream); } else { int paragraphs = PdbUtil.readShort(myStream); int size = PdbUtil.readShort(myStream); // TODO ?????? int type = myStream.read(); int flags = myStream.read(); switch (type) { case 0: // text (TODO: found sample file and test this code) case 1: // compressed text { ArrayList /*<Integer>*/ pars = new ArrayList(); for (int i = 0; i < paragraphs; ++i) { int pSize = PdbUtil.readShort(myStream); pars.add(pSize); myStream.skip(2); } boolean doProcess = false; if (type == 0) { // ? byte[] buf = new byte[size]; doProcess = myStream.read(buf, 0, (int) size) == size; if (doProcess) { // TODO: use encoding!!!! // TODO: don't create any new objects!!!! myCharBuffer = new String(buf).toCharArray(); } } else if (myCompressionVersion == 1) { byte[] buf = new byte[size]; doProcess = DocDecompressor.decompress(myStream, buf, recordSize - 8 - 4 * paragraphs) == size; if (doProcess) { myCharBuffer = new String(buf).toCharArray(); } } else if (myCompressionVersion == 2) { byte input[] = new byte[(int) (recordSize - 10 - 4 * paragraphs)]; final int inputSize = myStream.read(input); Inflater decompressor = new Inflater(); decompressor.setInput(input, 0, inputSize); byte output[] = new byte[size]; try { doProcess = decompressor.inflate(output) == size; decompressor.end(); myCharBuffer = new String(output, 0, size).toCharArray(); } catch (DataFormatException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println(e.getMessage()); } // doProcess = // ZLZDecompressor(recordSize - 10 - 4 * paragraphs). // decompress(myStream, myCharBuffer, size) == size; } if (doProcess) { addHyperlinkLabel(fromNumber(uid)); myParagraphMap.put(uid, new ArrayList()); myParagraphVector = (ArrayList) myParagraphMap.get(uid); processTextRecord(size, pars); if ((flags & 0x1) == 0) { // insertEndOfTextParagraph(); // setNewTextModel(); } } break; } case 2: // image case 3: // compressed image { final String mime = "image/palm"; ZLImage image = null; if (type == 2) { System.out.println("non-compressed image"); image = new PluckerFileImage(mime, myFile, myStream.offset(), recordSize - 8); } else if (myCompressionVersion == 1) { System.out.println("DocCompressedImage"); image = new DocCompressedFileImage(mime, myFile, myStream.offset(), recordSize - 8); } else if (myCompressionVersion == 2) { System.out.println("ZCompressedImage"); image = new ZCompressedFileImage(mime, myFile, myStream.offset() + 2, recordSize - 10); } if (image != null) { addImage(fromNumber(uid), image); } break; } case 9: // category record is ignored break; case 10: short typeCode = (short) PdbUtil.readShort(myStream); break; case 11: // style sheet record is ignored break; case 12: // font page record is ignored break; case 13: // TODO: process tables case 14: // TODO: process tables break; case 15: // multiimage { short columns = (short) PdbUtil.readShort(myStream); short rows = (short) PdbUtil.readShort(myStream); System.out.println("multiimage"); /*PluckerMultiImage image = new PluckerMultiImage(rows, columns, Model.getImageMap()); for (int i = 0; i < size / 2 - 2; ++i) { short us = (short)myStream.read(); PdbUtil.readShort(myStream, us); image.addId(fromNumber(us)); } addImage(fromNumber(uid), image); */ break; } default: // std::cerr << "type = " << (int)type << "\n"; break; } } }