Blob Blame History Raw
From 5690c18cb2de1bf4f3cce3da8a2132303a0c731f Mon Sep 17 00:00:00 2001
From: David Tardon <dtardon@redhat.com>
Date: Thu, 29 May 2014 13:30:13 +0200
Subject: [PATCH] parse zipped FictionBook 2 files again

---
 src/lib/EBOOKDocument.cpp | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/lib/EBOOKDocument.cpp b/src/lib/EBOOKDocument.cpp
index 5b8e7ec..c4f9913 100644
--- a/src/lib/EBOOKDocument.cpp
+++ b/src/lib/EBOOKDocument.cpp
@@ -427,6 +427,25 @@ EBOOKAPI EBOOKDocument::Confidence EBOOKDocument::isSupported(librevenge::RVNGIn
       }
     }
 #endif
+
+    // TODO: This needs improvement: zipped FictionBook 2 files can contain images too...
+    if (1 == input->subStreamCount())
+    {
+      const librevenge::RVNGString name(input->subStreamName(0));
+      const unsigned long size = name.size();
+      const char *const cName = name.cstr();
+      if (equal(cName + (size - 4), cName + size, ".fb2"))
+      {
+        const scoped_ptr<RVNGInputStream> fb2(input->getSubStreamById(0));
+        const Type xmlType = detectXML(fb2.get());
+        if (TYPE_FICTIONBOOK2 == xmlType)
+        {
+          if (type)
+            *type = xmlType;
+          return CONFIDENCE_EXCELLENT;
+        }
+      }
+    }
   }
 
   Confidence confidence = CONFIDENCE_NONE;
@@ -533,7 +552,14 @@ EBOOKAPI EBOOKDocument::Result EBOOKDocument::parse(librevenge::RVNGInputStream
 #endif
   case TYPE_FICTIONBOOK2 :
   {
-    FB2Parser parser(input_.get());
+    RVNGInputStreamPtr_t fb2Input(input_);
+    // TODO: this needs to handle package with images too
+    if (input_->isStructured())
+    {
+      assert(1 == input->subStreamCount());
+      fb2Input.reset(input->getSubStreamById(0));
+    }
+    FB2Parser parser(fb2Input.get());
     return parser.parse(document) ? RESULT_OK : RESULT_UNKNOWN_ERROR;
   }
 #if defined ENABLE_EXPERIMENTAL
-- 
1.9.3