昨天我们的移植工作进行了一大半,还留下两个重要的部分没有完成:1.没有移植的 ZLTextView,2.FormatPlugin相关的类。
第一个问题我们放在后面解决,下面先解决格式插件的问题。
我们可以看出来,FBReader格式插件这一部分的设计是相当的牛X的,至少以我目前的水平看。我们来看看它插件的结构 使用tree命令
D:WORKSTEXTLAYOUTFBREADERJSRCORGGEOMETERPLUSFBREADERFORMATS
│ FormatPlugin.java
│ JavaFormatPlugin.java
│ NativeFormatPlugin.java
│ PluginCollection.java
│
├─fb2
│ Base64EncodedImage.java
│ FB2AnnotationReader.java
│ FB2CoverImage.java
│ FB2CoverReader.java
│ FB2MetaInfoReader.java
│ FB2NativePlugin.java
│ FB2Plugin.java
│ FB2Reader.java
│ FB2Tag.java
│ FB2TagManager.java
│ FB2Util.java
│
├─html
│ HtmlReader.java
│ HtmlTag.java
│
├─oeb
│ ContainerFileReader.java
│ NCXReader.java
│ OEBAnnotationReader.java
│ OEBBookReader.java
│ OEBCoverBackgroundReader.java
│ OEBCoverReader.java
│ OEBMetaInfoReader.java
│ OEBNativePlugin.java
│ OEBPlugin.java
│ XHTMLImageFinder.java
│
├─pdb
│ DocDecompressor.java
│ HuffdicDecompressor.java
│ MobipocketHtmlBookReader.java
│ MobipocketPlugin.java
│ MobipocketStream.java
│ PalmDocLikeStream.java
│ PdbHeader.java
│ PdbStream.java
│ PdbUtil.java
│
├─util
│ MiscUtil.java
│
└─xhtml
XHTMLReader.java
XHTMLTagAction.java
XHTMLTagBodyAction.java
XHTMLTagControlAction.java
XHTMLTagHyperlinkAction.java
XHTMLTagImageAction.java
XHTMLTagItemAction.java
XHTMLTagParagraphAction.java
XHTMLTagParagraphWithControlAction.java
XHTMLTagPreAction.java
XHTMLTagRestartParagraphAction.java
我们可以看出formats下有四个格式文件夹,分别支持了各自的文件格式,而根目录下的四个文件很清楚的解释了它的插件管理方法,每种格式的插件分为Java实现和Native实现,并且这两种实现是可以切换的,插件都存储在PluginCollection这个类里,这个类可以根据文件类型去查找可用的插件,使用插件来进行解析。
那么,我们按照原样把这一部分代码拷贝到我们的工程对应的目录下。
现在,我们有了解析格式的利器了,是时候解决最后一个问题了,ZLTextView带来的关联问题,ZLTextView是解析与排版直接的连接枢纽,引入这个文件,我们就要开始进入排版代码了,因此我觉得先使用一个适配器来代替ZLTextView,是我们的代码内聚在现有的模块内,起码先使其可以运行,所以创建了一个ZLTextView的抽象子类MyViewAdapter。
好了,现在我们的代码看上去是这个样子了:
文件夹 PATH 列表
卷序列号为 00000002 9EB8:DA5D D:WORKSTEXTLAYOUTNEWREADERSESRC ├─com │ └─yueang │ ├─atest │ │ TestEngine.java │ │ │ ├─log │ │ MyLog.java │ │ MyUtils.java │ │ │ ├─newreader │ │ │ Paths.java │ │ │ │ │ ├─book │ │ │ Author.java │ │ │ Book.java │ │ │ Bookmark.java │ │ │ BookmarkQuery.java │ │ │ BooksDatabase.java │ │ │ BookUtil.java │ │ │ FileInfo.java │ │ │ FileInfoSet.java │ │ │ HighlightingStyle.java │ │ │ Series.java │ │ │ SeriesInfo.java │ │ │ Tag.java │ │ │ UID.java │ │ │ │ │ ├─bookmodel │ │ │ BookModel.java │ │ │ BookModelImpl.java │ │ │ BookReader.java │ │ │ BookReadingException.java │ │ │ FBHyperlinkType.java │ │ │ FBTextKind.java │ │ │ JavaBookModel.java │ │ │ NativeBookModel.java │ │ │ TOCTree.java │ │ │ │ │ ├─formats │ │ │ │ FormatPlugin.java │ │ │ │ JavaFormatPlugin.java │ │ │ │ NativeFormatPlugin.java │ │ │ │ PluginCollection.java │ │ │ │ │ │ │ ├─fb2 │ │ │ │ Base64EncodedImage.java │ │ │ │ FB2AnnotationReader.java │ │ │ │ FB2CoverImage.java │ │ │ │ FB2CoverReader.java │ │ │ │ FB2MetaInfoReader.java │ │ │ │ FB2NativePlugin.java │ │ │ │ FB2Plugin.java │ │ │ │ FB2Reader.java │ │ │ │ FB2Tag.java │ │ │ │ FB2TagManager.java │ │ │ │ FB2Util.java │ │ │ │ │ │ │ ├─html │ │ │ │ HtmlReader.java │ │ │ │ HtmlTag.java │ │ │ │ │ │ │ ├─oeb │ │ │ │ ContainerFileReader.java │ │ │ │ NCXReader.java │ │ │ │ OEBAnnotationReader.java │ │ │ │ OEBBookReader.java │ │ │ │ OEBCoverBackgroundReader.java │ │ │ │ OEBCoverReader.java │ │ │ │ OEBMetaInfoReader.java │ │ │ │ OEBNativePlugin.java │ │ │ │ OEBPlugin.java │ │ │ │ XHTMLImageFinder.java │ │ │ │ │ │ │ ├─pdb │ │ │ │ DocDecompressor.java │ │ │ │ MobipocketHtmlBookReader.java │ │ │ │ MobipocketPlugin.java │ │ │ │ MobipocketStream.java │ │ │ │ PalmDocLikeStream.java │ │ │ │ PdbHeader.java │ │ │ │ PdbStream.java │ │ │ │ PdbUtil.java │ │ │ │ │ │ │ ├─util │ │ │ │ MiscUtil.java │ │ │ │ │ │ │ └─xhtml │ │ │ XHTMLReader.java │ │ │ XHTMLTagAction.java │ │ │ XHTMLTagBodyAction.java │ │ │ XHTMLTagControlAction.java │ │ │ XHTMLTagHyperlinkAction.java │ │ │ XHTMLTagImageAction.java │ │ │ XHTMLTagItemAction.java │ │ │ XHTMLTagParagraphAction.java │ │ │ XHTMLTagParagraphWithControlAction.java │ │ │ XHTMLTagPreAction.java │ │ │ XHTMLTagRestartParagraphAction.java │ │ │ │ │ ├─network │ │ │ Base64EncodedImage.java │ │ │ │ │ └─sort │ │ TitledEntity.java │ │ │ ├─support │ │ Environment.java │ │ MyAssetFile.java │ │ MyViewAdapter.java │ │ MyZLibrary.java │ │ ZLSELibrary.java │ │ │ └─zlibrary │ ├─core │ │ ├─config │ │ │ ZLConfig.java │ │ │ │ │ ├─constants │ │ │ XMLNamespaces.java │ │ │ │ │ ├─encoding │ │ │ AutoEncodingCollection.java │ │ │ Encoding.java │ │ │ EncodingCollection.java │ │ │ EncodingConverter.java │ │ │ FilteredEncodingCollection.java │ │ │ JavaEncodingCollection.java │ │ │ │ │ ├─filesystem │ │ │ │ ZLArchiveEntryFile.java │ │ │ │ ZLFile.java │ │ │ │ ZLPhysicalFile.java │ │ │ │ ZLResourceFile.java │ │ │ │ ZLZipEntryFile.java │ │ │ │ │ │ │ └─tar │ │ │ ZLTarEntryFile.java │ │ │ ZLTarHeader.java │ │ │ ZLTarInputStream.java │ │ │ │ │ ├─filetypes │ │ │ FileType.java │ │ │ FileTypeCollection.java │ │ │ FileTypeDjVu.java │ │ │ FileTypeEpub.java │ │ │ FileTypeFB2.java │ │ │ FileTypeHtml.java │ │ │ FileTypeMobipocket.java │ │ │ FileTypePalm.java │ │ │ SimpleFileType.java │ │ │ │ │ ├─html │ │ │ ZLByteBuffer.java │ │ │ ZLHtmlAttributeMap.java │ │ │ ZLHtmlParser.java │ │ │ ZLHtmlProcessor.java │ │ │ ZLHtmlReader.java │ │ │ │ │ ├─image │ │ │ ZLBase64EncodedImage.java │ │ │ ZLFileImage.java │ │ │ ZLImage.java │ │ │ ZLImageData.java │ │ │ ZLImageManager.java │ │ │ ZLImageProxy.java │ │ │ ZLLoadableImage.java │ │ │ ZLSingleImage.java │ │ │ │ │ ├─language │ │ │ Language.java │ │ │ ZLLanguageUtil.java │ │ │ │ │ ├─library │ │ │ ZLibrary.java │ │ │ │ │ ├─options │ │ │ ZLOption.java │ │ │ ZLStringOption.java │ │ │ │ │ ├─resources │ │ │ ZLMissingResource.java │ │ │ ZLResource.java │ │ │ ZLTreeResource.java │ │ │ │ │ ├─tree │ │ │ ZLTree.java │ │ │ │ │ ├─util │ │ │ Base64InputStream.java │ │ │ HexInputStream.java │ │ │ MergedInputStream.java │ │ │ MimeType.java │ │ │ MiscUtil.java │ │ │ SliceInputStream.java │ │ │ ZLArrayUtils.java │ │ │ ZLBoolean3.java │ │ │ ZLColor.java │ │ │ ZLInputStreamWithOffset.java │ │ │ ZLSearchPattern.java │ │ │ ZLSearchUtil.java │ │ │ │ │ └─xml │ │ ZLDTDParser.java │ │ ZLMutableString.java │ │ ZLStringMap.java │ │ ZLXMLParser.java │ │ ZLXMLProcessor.java │ │ ZLXMLReader.java │ │ ZLXMLReaderAdapter.java │ │ │ └─text │ ├─model │ │ CachedCharStorage.java │ │ CachedCharStorageBase.java │ │ CachedCharStorageException.java │ │ CachedCharStorageRO.java │ │ CharStorage.java │ │ ZLImageEntry.java │ │ ZLTextCSSStyleEntry.java │ │ ZLTextMark.java │ │ ZLTextMetrics.java │ │ ZLTextModel.java │ │ ZLTextNativeModel.java │ │ ZLTextOtherStyleEntry.java │ │ ZLTextParagraph.java │ │ ZLTextParagraphImpl.java │ │ ZLTextPlainModel.java │ │ ZLTextSpecialParagraphImpl.java │ │ ZLTextStyleEntry.java │ │ ZLTextWritableModel.java │ │ ZLTextWritablePlainModel.java │ │ │ └─view │ ZLPaintContext.java │ ZLTextControlElement.java │ ZLTextElement.java │ ZLTextFixedHSpaceElement.java │ ZLTextFixedPosition.java │ ZLTextHyperlink.java │ ZLTextHyperlinkControlElement.java │ ZLTextImageElement.java │ ZLTextParagraphCursor.java │ ZLTextParagraphCursorCache.java │ ZLTextPosition.java │ ZLTextStyleElement.java │ ZLTextWord.java │ ZLTextWordCursor.java │ └─org ├─amse │ └─ys │ └─zip │ Decompressor.java │ DeflatingDecompressor.java │ LocalFileHeader.java │ MyBufferedInputStream.java │ NoCompressionDecompressor.java │ ZipException.java │ ZipFile.java │ ZipInputStream.java │ └─vimgadgets └─linebreak LineBreaker.java
atest包是我们测测试程序入口,Log包下是自定义的Log类
运行TestEngine,出现UnsatisfyLinkError, 查了一下原来是没有实现org.amse.ys.zip.DeflatingDecompressor类中的本地方法,下载win32版的 zlib库,创建VS工程,加入jni/DeflatingDecompressor/DeflatingDecompressor.cpp文件,编译出dll, 然后把FBReaderJ/assets 文件夹也拷贝到工程里,实现我们自己的MyAssetFile extends ZLResrourceFile类,使用该类来读取assets文件下的文件。
至此,我们移植了解析部分。
庆祝一下~~