FBReader移植日记 第二天

昨天我们的移植工作进行了一大半,还留下两个重要的部分没有完成: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文件下的文件。
至此,我们移植了解析部分。
庆祝一下~~
原文地址:https://www.cnblogs.com/yueang/p/3191347.html