Kaydet (Commit) 04950bf3 authored tarafından Fridrich Štrba's avatar Fridrich Štrba

Allow conversion of embedded images to another binary image format

üst 00e60cf7
...@@ -118,6 +118,7 @@ public: ...@@ -118,6 +118,7 @@ public:
void _closeListLevel(); void _closeListLevel();
OdfEmbeddedObject _findEmbeddedObjectHandler(const WPXString &mimeType); OdfEmbeddedObject _findEmbeddedObjectHandler(const WPXString &mimeType);
OdfEmbeddedImage _findEmbeddedImageHandler(const WPXString &mimeType);
OdfDocumentHandler *mpHandler; OdfDocumentHandler *mpHandler;
bool mbUsed; // whether or not it has been before (you can only use me once!) bool mbUsed; // whether or not it has been before (you can only use me once!)
...@@ -148,6 +149,7 @@ public: ...@@ -148,6 +149,7 @@ public:
// embedded object handlers // embedded object handlers
std::map<WPXString, OdfEmbeddedObject, ltstr > mObjectHandlers; std::map<WPXString, OdfEmbeddedObject, ltstr > mObjectHandlers;
std::map<WPXString, OdfEmbeddedImage, ltstr > mImageHandlers;
// metadata // metadata
std::vector<DocumentElement *> mMetaData; std::vector<DocumentElement *> mMetaData;
...@@ -187,7 +189,7 @@ OdtGeneratorPrivate::OdtGeneratorPrivate(OdfDocumentHandler *pHandler, const Odf ...@@ -187,7 +189,7 @@ OdtGeneratorPrivate::OdtGeneratorPrivate(OdfDocumentHandler *pHandler, const Odf
mWriterListStates(), mWriterListStates(),
mParagraphManager(), mSpanManager(), mFontManager(), mParagraphManager(), mSpanManager(), mFontManager(),
mSectionStyles(), mTableStyles(), mFrameStyles(), mFrameAutomaticStyles(), mSectionStyles(), mTableStyles(), mFrameStyles(), mFrameAutomaticStyles(),
mObjectHandlers(), mMetaData(), mObjectHandlers(), mImageHandlers(), mMetaData(),
miNumListStyles(0), miNumListStyles(0),
mBodyElements(), mBodyElements(),
mpCurrentContentElements(&mBodyElements), mpCurrentContentElements(&mBodyElements),
...@@ -267,6 +269,15 @@ OdfEmbeddedObject OdtGeneratorPrivate::_findEmbeddedObjectHandler(const WPXStrin ...@@ -267,6 +269,15 @@ OdfEmbeddedObject OdtGeneratorPrivate::_findEmbeddedObjectHandler(const WPXStrin
return 0; 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) : OdtGenerator::OdtGenerator(OdfDocumentHandler *pHandler, const OdfStreamType streamType) :
mpImpl(new OdtGeneratorPrivate(pHandler, streamType)) mpImpl(new OdtGeneratorPrivate(pHandler, streamType))
{ {
...@@ -1247,18 +1258,40 @@ void OdtGenerator::insertBinaryObject(const WPXPropertyList &propList, const WPX ...@@ -1247,18 +1258,40 @@ void OdtGenerator::insertBinaryObject(const WPXPropertyList &propList, const WPX
return; return;
OdfEmbeddedObject tmpObjectHandler = mpImpl->_findEmbeddedObjectHandler(propList["libwpd:mimetype"]->getStr()); 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; if (tmpObjectHandler)
InternalHandler tmpHandler(&tmpContentElements);
if (tmpObjectHandler(data, &tmpHandler, ODF_FLAT_XML) && !tmpContentElements.empty())
{ {
mpImpl->mpCurrentContentElements->push_back(new TagOpenElement("draw:object")); std::vector<DocumentElement *> tmpContentElements;
for (std::vector<DocumentElement *>::const_iterator iter = tmpContentElements.begin(); iter != tmpContentElements.end(); ++iter) InternalHandler tmpHandler(&tmpContentElements);
mpImpl->mpCurrentContentElements->push_back(*iter);
mpImpl->mpCurrentContentElements->push_back(new TagCloseElement("draw:object")); 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 else
...@@ -1346,4 +1379,9 @@ void OdtGenerator::registerEmbeddedObjectHandler(const WPXString &mimeType, OdfE ...@@ -1346,4 +1379,9 @@ void OdtGenerator::registerEmbeddedObjectHandler(const WPXString &mimeType, OdfE
mpImpl->mObjectHandlers[mimeType] = objectHandler; mpImpl->mObjectHandlers[mimeType] = objectHandler;
} }
void OdtGenerator::registerEmbeddedImageHandler(const WPXString &mimeType, OdfEmbeddedImage imageHandler)
{
mpImpl->mImageHandlers[mimeType] = imageHandler;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
typedef bool (*OdfEmbeddedObject)(const WPXBinaryData &data, OdfDocumentHandler *pHandler, const OdfStreamType streamType); typedef bool (*OdfEmbeddedObject)(const WPXBinaryData &data, OdfDocumentHandler *pHandler, const OdfStreamType streamType);
typedef bool (*OdfEmbeddedImage)(const WPXBinaryData &input, WPXBinaryData &output);
class OdtGeneratorPrivate; class OdtGeneratorPrivate;
...@@ -113,6 +114,7 @@ public: ...@@ -113,6 +114,7 @@ public:
// Register special converter for certain embedded binary objects // Register special converter for certain embedded binary objects
void registerEmbeddedObjectHandler(const WPXString &mimeType, OdfEmbeddedObject objectHandler); void registerEmbeddedObjectHandler(const WPXString &mimeType, OdfEmbeddedObject objectHandler);
void registerEmbeddedImageHandler(const WPXString &mimeType, OdfEmbeddedImage imageHandler);
private: private:
OdtGeneratorPrivate *mpImpl; OdtGeneratorPrivate *mpImpl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment