[Libreoffice-commits] .: writerperfect/source

Fridrich Strba fridrich at kemper.freedesktop.org
Sun Apr 8 13:07:11 PDT 2012


 writerperfect/source/filter/OdtGenerator.cxx |   58 ++++++++++++++++++++++-----
 writerperfect/source/filter/OdtGenerator.hxx |    2 
 2 files changed, 50 insertions(+), 10 deletions(-)

New commits:
commit 04950bf3c339f074588fbcff7121fdff76f00163
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date:   Sun Apr 8 21:56:42 2012 +0200

    Allow conversion of embedded images to another binary image format

diff --git a/writerperfect/source/filter/OdtGenerator.cxx b/writerperfect/source/filter/OdtGenerator.cxx
index ecb29bb..8f6ae1b 100644
--- a/writerperfect/source/filter/OdtGenerator.cxx
+++ b/writerperfect/source/filter/OdtGenerator.cxx
@@ -118,6 +118,7 @@ public:
     void _closeListLevel();
 
     OdfEmbeddedObject _findEmbeddedObjectHandler(const WPXString &mimeType);
+    OdfEmbeddedImage _findEmbeddedImageHandler(const WPXString &mimeType);
 
     OdfDocumentHandler *mpHandler;
     bool mbUsed; // whether or not it has been before (you can only use me once!)
@@ -148,6 +149,7 @@ public:
 
     // embedded object handlers
     std::map<WPXString, OdfEmbeddedObject, ltstr > mObjectHandlers;
+    std::map<WPXString, OdfEmbeddedImage, ltstr > mImageHandlers;
 
     // metadata
     std::vector<DocumentElement *> mMetaData;
@@ -187,7 +189,7 @@ OdtGeneratorPrivate::OdtGeneratorPrivate(OdfDocumentHandler *pHandler, const Odf
     mWriterListStates(),
     mParagraphManager(), mSpanManager(), mFontManager(),
     mSectionStyles(), mTableStyles(), mFrameStyles(), mFrameAutomaticStyles(),
-    mObjectHandlers(), mMetaData(),
+    mObjectHandlers(), mImageHandlers(), mMetaData(),
     miNumListStyles(0),
     mBodyElements(),
     mpCurrentContentElements(&mBodyElements),
@@ -267,6 +269,15 @@ OdfEmbeddedObject OdtGeneratorPrivate::_findEmbeddedObjectHandler(const WPXStrin
     return 0;
 }
 
+OdfEmbeddedImage OdtGeneratorPrivate::_findEmbeddedImageHandler(const WPXString &mimeType)
+{
+    std::map<WPXString, OdfEmbeddedImage, ltstr>::iterator i = mImageHandlers.find(mimeType);
+    if (i != mImageHandlers.end())
+        return i->second;
+
+    return 0;
+}
+
 OdtGenerator::OdtGenerator(OdfDocumentHandler *pHandler, const OdfStreamType streamType) :
     mpImpl(new OdtGeneratorPrivate(pHandler, streamType))
 {
@@ -1247,18 +1258,40 @@ void OdtGenerator::insertBinaryObject(const WPXPropertyList &propList, const WPX
         return;
 
     OdfEmbeddedObject tmpObjectHandler = mpImpl->_findEmbeddedObjectHandler(propList["libwpd:mimetype"]->getStr());
+    OdfEmbeddedImage tmpImageHandler = mpImpl->_findEmbeddedImageHandler(propList["libwpd:mimetype"]->getStr());
 
-    if (tmpObjectHandler)
+    if (tmpObjectHandler || tmpImageHandler)
     {
-        std::vector<DocumentElement *> tmpContentElements;
-        InternalHandler tmpHandler(&tmpContentElements);
-
-        if (tmpObjectHandler(data, &tmpHandler, ODF_FLAT_XML) && !tmpContentElements.empty())
+        if (tmpObjectHandler)
         {
-            mpImpl->mpCurrentContentElements->push_back(new TagOpenElement("draw:object"));
-            for (std::vector<DocumentElement *>::const_iterator iter = tmpContentElements.begin(); iter != tmpContentElements.end(); ++iter)
-                mpImpl->mpCurrentContentElements->push_back(*iter);
-            mpImpl->mpCurrentContentElements->push_back(new TagCloseElement("draw:object"));
+            std::vector<DocumentElement *> tmpContentElements;
+            InternalHandler tmpHandler(&tmpContentElements);
+
+            if (tmpObjectHandler(data, &tmpHandler, ODF_FLAT_XML) && !tmpContentElements.empty())
+            {
+                mpImpl->mpCurrentContentElements->push_back(new TagOpenElement("draw:object"));
+                for (std::vector<DocumentElement *>::const_iterator iter = tmpContentElements.begin(); iter != tmpContentElements.end(); ++iter)
+                    mpImpl->mpCurrentContentElements->push_back(*iter);
+                mpImpl->mpCurrentContentElements->push_back(new TagCloseElement("draw:object"));
+            }
+        }
+        if (tmpImageHandler)
+        {
+            WPXBinaryData output;
+            if (tmpImageHandler(data, output))
+            {
+                mpImpl->mpCurrentContentElements->push_back(new TagOpenElement("draw:image"));
+
+                mpImpl->mpCurrentContentElements->push_back(new TagOpenElement("office:binary-data"));
+
+                WPXString binaryBase64Data = output.getBase64Data();
+
+                mpImpl->mpCurrentContentElements->push_back(new CharDataElement(binaryBase64Data.cstr()));
+
+                mpImpl->mpCurrentContentElements->push_back(new TagCloseElement("office:binary-data"));
+
+                mpImpl->mpCurrentContentElements->push_back(new TagCloseElement("draw:image"));
+            }
         }
     }
     else
@@ -1346,4 +1379,9 @@ void OdtGenerator::registerEmbeddedObjectHandler(const WPXString &mimeType, OdfE
     mpImpl->mObjectHandlers[mimeType] = objectHandler;
 }
 
+void OdtGenerator::registerEmbeddedImageHandler(const WPXString &mimeType, OdfEmbeddedImage imageHandler)
+{
+    mpImpl->mImageHandlers[mimeType] = imageHandler;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerperfect/source/filter/OdtGenerator.hxx b/writerperfect/source/filter/OdtGenerator.hxx
index 12c6df3..1275c1c 100644
--- a/writerperfect/source/filter/OdtGenerator.hxx
+++ b/writerperfect/source/filter/OdtGenerator.hxx
@@ -38,6 +38,7 @@
 
 
 typedef bool (*OdfEmbeddedObject)(const WPXBinaryData &data, OdfDocumentHandler *pHandler, const OdfStreamType streamType);
+typedef bool (*OdfEmbeddedImage)(const WPXBinaryData &input, WPXBinaryData &output);
 
 class OdtGeneratorPrivate;
 
@@ -113,6 +114,7 @@ public:
 
     // Register special converter for certain embedded binary objects
     void registerEmbeddedObjectHandler(const WPXString &mimeType, OdfEmbeddedObject objectHandler);
+    void registerEmbeddedImageHandler(const WPXString &mimeType, OdfEmbeddedImage imageHandler);
 
 private:
     OdtGeneratorPrivate *mpImpl;


More information about the Libreoffice-commits mailing list