summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/VSD5Parser.cpp2
-rw-r--r--src/lib/VSD5Parser.h2
-rw-r--r--src/lib/VSDCollector.h2
-rw-r--r--src/lib/VSDContentCollector.cpp6
-rw-r--r--src/lib/VSDContentCollector.h2
-rw-r--r--src/lib/VSDDocumentStructure.h1
-rw-r--r--src/lib/VSDPages.cpp4
-rw-r--r--src/lib/VSDPages.h1
-rw-r--r--src/lib/VSDParser.cpp54
-rw-r--r--src/lib/VSDParser.h6
-rw-r--r--src/lib/VSDStylesCollector.cpp2
-rw-r--r--src/lib/VSDStylesCollector.h2
-rw-r--r--src/lib/VSDTypes.h4
-rw-r--r--src/lib/VSDXMLParserBase.cpp2
14 files changed, 77 insertions, 13 deletions
diff --git a/src/lib/VSD5Parser.cpp b/src/lib/VSD5Parser.cpp
index 9d7c164..f49fafa 100644
--- a/src/lib/VSD5Parser.cpp
+++ b/src/lib/VSD5Parser.cpp
@@ -381,7 +381,7 @@ void libvisio::VSD5Parser::readShape(WPXInputStream *input)
void libvisio::VSD5Parser::readPage(WPXInputStream *input)
{
unsigned backgroundPageID = getUInt(input);
- m_collector->collectPage(m_header.id, m_header.level, backgroundPageID, m_isBackgroundPage, WPXString());
+ m_collector->collectPage(m_header.id, m_header.level, backgroundPageID, m_isBackgroundPage, VSDName());
}
void libvisio::VSD5Parser::readTextBlock(WPXInputStream *input)
diff --git a/src/lib/VSD5Parser.h b/src/lib/VSD5Parser.h
index 4430e1c..d6cf0ae 100644
--- a/src/lib/VSD5Parser.h
+++ b/src/lib/VSD5Parser.h
@@ -73,6 +73,8 @@ protected:
virtual void readStyleSheet(WPXInputStream *input);
+ virtual void readNameIDX(WPXInputStream *) {}
+
virtual unsigned getUInt(WPXInputStream *input);
virtual int getInt(WPXInputStream *input);
diff --git a/src/lib/VSDCollector.h b/src/lib/VSDCollector.h
index 1633726..f53545b 100644
--- a/src/lib/VSDCollector.h
+++ b/src/lib/VSDCollector.h
@@ -79,7 +79,7 @@ public:
virtual void collectShapesOrder(unsigned id, unsigned level, const std::vector<unsigned> &shapeIds) = 0;
virtual void collectForeignDataType(unsigned level, unsigned foreignType, unsigned foreignFormat, double offsetX, double offsetY, double width, double height) = 0;
virtual void collectPageProps(unsigned id, unsigned level, double pageWidth, double pageHeight, double shadowOffsetX, double shadowOffsetY, double scale) = 0;
- virtual void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &pageName) = 0;
+ virtual void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const VSDName &pageName) = 0;
virtual void collectShape(unsigned id, unsigned level, unsigned parent, unsigned masterPage, unsigned masterShape, unsigned lineStyle, unsigned fillStyle, unsigned textStyle) = 0;
virtual void collectSplineStart(unsigned id, unsigned level, double x, double y, double secondKnot, double firstKnot, double lastKnot, unsigned degree) = 0;
virtual void collectSplineKnot(unsigned id, unsigned level, double x, double y, double knot) = 0;
diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp
index 09b268b..8901fa1 100644
--- a/src/lib/VSDContentCollector.cpp
+++ b/src/lib/VSDContentCollector.cpp
@@ -1699,11 +1699,13 @@ void libvisio::VSDContentCollector::collectPageProps(unsigned /* id */, unsigned
m_currentPage.m_pageHeight = m_scale*m_pageHeight;
}
-void libvisio::VSDContentCollector::collectPage(unsigned /* id */, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &pageName)
+void libvisio::VSDContentCollector::collectPage(unsigned /* id */, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const VSDName &pageName)
{
_handleLevelChange(level);
m_currentPage.m_backgroundPageID = backgroundPageID;
- m_currentPage.m_pageName = pageName;
+ m_currentPage.m_pageName.clear();
+ if (!pageName.empty())
+ _convertDataToString(m_currentPage.m_pageName, pageName.m_data, pageName.m_format);
m_isBackgroundPage = isBackgroundPage;
}
diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h
index 0c273c2..25ec85b 100644
--- a/src/lib/VSDContentCollector.h
+++ b/src/lib/VSDContentCollector.h
@@ -100,7 +100,7 @@ public:
void collectShapesOrder(unsigned id, unsigned level, const std::vector<unsigned> &shapeIds);
void collectForeignDataType(unsigned level, unsigned foreignType, unsigned foreignFormat, double offsetX, double offsetY, double width, double height);
void collectPageProps(unsigned id, unsigned level, double pageWidth, double pageHeight, double shadowOffsetX, double shadowOffsetY, double scale);
- void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &pageName);
+ void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const VSDName &pageName);
void collectShape(unsigned id, unsigned level, unsigned parent, unsigned masterPage, unsigned masterShape, unsigned lineStyle, unsigned fillStyle, unsigned textStyle);
void collectSplineStart(unsigned id, unsigned level, double x, double y, double secondKnot, double firstKnot, double lastKnot, unsigned degree);
void collectSplineKnot(unsigned id, unsigned level, double x, double y, double knot);
diff --git a/src/lib/VSDDocumentStructure.h b/src/lib/VSDDocumentStructure.h
index ae0fd62..b6a2c98 100644
--- a/src/lib/VSDDocumentStructure.h
+++ b/src/lib/VSDDocumentStructure.h
@@ -140,6 +140,7 @@
#define VSD_ANNOTATION 0xc6
#define VSD_SMART_TAG_DEF 0xc7
#define VSD_PRINT_PROPS 0xc8
+#define VSD_NAMEIDX 0xc9
#define VSD_SHAPE_DATA 0xd1
#define VSD_FONTFACE 0xd7
diff --git a/src/lib/VSDPages.cpp b/src/lib/VSDPages.cpp
index 81d2b84..de6c181 100644
--- a/src/lib/VSDPages.cpp
+++ b/src/lib/VSDPages.cpp
@@ -99,6 +99,8 @@ void libvisio::VSDPages::draw(libwpg::WPGPaintInterface *painter)
WPXPropertyList pageProps;
pageProps.insert("svg:width", m_pages[i].m_pageWidth);
pageProps.insert("svg:height", m_pages[i].m_pageHeight);
+ if (m_pages[i].m_pageName.len())
+ pageProps.insert("draw:name", m_pages[i].m_pageName);
painter->startGraphics(pageProps);
_drawWithBackground(painter, m_pages[i]);
painter->endGraphics();
@@ -110,6 +112,8 @@ void libvisio::VSDPages::draw(libwpg::WPGPaintInterface *painter)
WPXPropertyList pageProps;
pageProps.insert("svg:width", iter->second.m_pageWidth);
pageProps.insert("svg:height", iter->second.m_pageHeight);
+ if (iter->second.m_pageName.len())
+ pageProps.insert("draw:name", iter->second.m_pageName);
painter->startGraphics(pageProps);
_drawWithBackground(painter, iter->second);
painter->endGraphics();
diff --git a/src/lib/VSDPages.h b/src/lib/VSDPages.h
index 98c0b5e..f1f1b30 100644
--- a/src/lib/VSDPages.h
+++ b/src/lib/VSDPages.h
@@ -32,6 +32,7 @@
#define __VSDPAGES_H__
#include "VSDOutputElementList.h"
+#include "VSDTypes.h"
namespace libvisio
{
diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp
index e5aca03..84c2124 100644
--- a/src/lib/VSDParser.cpp
+++ b/src/lib/VSDParser.cpp
@@ -46,13 +46,26 @@ libvisio::VSDParser::VSDParser(WPXInputStream *input, libwpg::WPGPaintInterface
m_stencils(), m_currentStencil(0), m_shape(), m_isStencilStarted(false), m_isInStyles(false),
m_currentShapeLevel(0), m_currentShapeID(MINUS_ONE), m_extractStencils(false), m_colours(),
m_isBackgroundPage(false), m_isShapeStarted(false), m_shadowOffsetX(0.0), m_shadowOffsetY(0.0),
- m_currentGeometryList(0), m_currentGeomListCount(0), m_fonts(), m_names()
+ m_currentGeometryList(0), m_currentGeomListCount(0), m_fonts(), m_names(), m_namesMapMap(),
+ m_currentPageName()
{}
libvisio::VSDParser::~VSDParser()
{
}
+void libvisio::VSDParser::_nameFromId(VSDName &name, unsigned id, unsigned level)
+{
+ name = VSDName();
+ std::map<unsigned, std::map<unsigned, VSDName> >::const_iterator iter1 = m_namesMapMap.find(level);
+ if (iter1 != m_namesMapMap.end())
+ {
+ std::map<unsigned, VSDName>::const_iterator iter = iter1->second.find(id);
+ if (iter != iter1->second.end())
+ name = iter->second;
+ }
+}
+
bool libvisio::VSDParser::getChunkHeader(WPXInputStream *input)
{
unsigned char tmpChar = 0;
@@ -197,6 +210,7 @@ void libvisio::VSDParser::handleStreams(WPXInputStream *input, unsigned ptrType,
std::map<unsigned, libvisio::Pointer> PtrList;
std::map<unsigned, libvisio::Pointer> FontFaces;
std::map<unsigned, libvisio::Pointer> NameList;
+ std::map<unsigned, libvisio::Pointer> NameIDX;
try
{
@@ -212,6 +226,8 @@ void libvisio::VSDParser::handleStreams(WPXInputStream *input, unsigned ptrType,
FontFaces[i] = ptr;
else if (ptr.Type == VSD_NAME_LIST2)
NameList[i] = ptr;
+ else if (ptr.Type == VSD_NAMEIDX)
+ NameIDX[i] = ptr;
else if (ptr.Type != 0)
PtrList[i] = ptr;
}
@@ -229,10 +245,13 @@ void libvisio::VSDParser::handleStreams(WPXInputStream *input, unsigned ptrType,
}
std::map<unsigned, libvisio::Pointer>::iterator iter;
- for (iter = FontFaces.begin(); iter != FontFaces.end(); ++iter)
+ for (iter = NameList.begin(); iter != NameList.end(); ++iter)
handleStream(iter->second, iter->first, level+1);
- for (iter = NameList.begin(); iter != NameList.end(); ++iter)
+ for (iter = NameIDX.begin(); iter != NameIDX.end(); ++iter)
+ handleStream(iter->second, iter->first, level+1);
+
+ for (iter = FontFaces.begin(); iter != FontFaces.end(); ++iter)
handleStream(iter->second, iter->first, level+1);
if (!pointerOrder.empty())
@@ -281,6 +300,7 @@ void libvisio::VSDParser::handleStream(const Pointer &ptr, unsigned idx, unsigne
m_isBackgroundPage = true;
else
m_isBackgroundPage = false;
+ _nameFromId(m_currentPageName, idx, level+1);
m_collector->startPage(idx);
break;
case VSD_STENCILS:
@@ -294,6 +314,7 @@ void libvisio::VSDParser::handleStream(const Pointer &ptr, unsigned idx, unsigne
if (m_extractStencils)
{
m_isBackgroundPage = false;
+ _nameFromId(m_currentPageName, idx, level+1);
m_collector->startPage(idx);
}
else
@@ -480,6 +501,9 @@ void libvisio::VSDParser::handleChunk(WPXInputStream *input)
case VSD_OLE_DATA:
readOLEData(input);
break;
+ case VSD_NAMEIDX:
+ readNameIDX(input);
+ break;
case VSD_PAGE_PROPS:
readPageProps(input);
break;
@@ -700,6 +724,27 @@ void libvisio::VSDParser::readOLEData(WPXInputStream *input)
}
+void libvisio::VSDParser::readNameIDX(WPXInputStream *input)
+{
+ std::map<unsigned, VSDName> names;
+ unsigned recordCount = readU32(input);
+ for (unsigned i = 0; i < recordCount; ++i)
+ {
+ unsigned nameId = readU32(input);
+ if (nameId != readU32(input))
+ {
+ VSD_DEBUG_MSG(("VSDParser::readNameIDX --> mismatch of first two dwords\n"));
+ return;
+ }
+ unsigned elementId = readU32(input);
+ input->seek(1, WPX_SEEK_CUR);
+ std::map<unsigned, VSDName>::const_iterator iter = m_names.find(nameId);
+ if (iter != m_names.end())
+ names[elementId] = iter->second;
+ }
+ m_namesMapMap[m_header.level] = names;
+}
+
void libvisio::VSDParser::readEllipse(WPXInputStream *input)
{
input->seek(1, WPX_SEEK_CUR);
@@ -833,7 +878,6 @@ void libvisio::VSDParser::readParaList(WPXInputStream *input)
m_shape.m_paraList.setElementsOrder(paragraphOrder);
}
-
}
void libvisio::VSDParser::readPropList(WPXInputStream * /* input */)
@@ -844,7 +888,7 @@ void libvisio::VSDParser::readPage(WPXInputStream *input)
{
input->seek(8, WPX_SEEK_CUR); //sub header length and children list length
unsigned backgroundPageID = readU32(input);
- m_collector->collectPage(m_header.id, m_header.level, backgroundPageID, m_isBackgroundPage, WPXString());
+ m_collector->collectPage(m_header.id, m_header.level, backgroundPageID, m_isBackgroundPage, m_currentPageName);
}
void libvisio::VSDParser::readGeometry(WPXInputStream *input)
diff --git a/src/lib/VSDParser.h b/src/lib/VSDParser.h
index 13498e1..351b681 100644
--- a/src/lib/VSDParser.h
+++ b/src/lib/VSDParser.h
@@ -34,6 +34,7 @@
#include <stdio.h>
#include <iostream>
#include <vector>
+#include <stack>
#include <map>
#include <libwpd/libwpd.h>
#include <libwpd-stream/libwpd-stream.h>
@@ -127,6 +128,8 @@ protected:
void readOLEList(WPXInputStream *input);
void readOLEData(WPXInputStream *input);
+ virtual void readNameIDX(WPXInputStream *input);
+
// parser of one pass
bool parseDocument(WPXInputStream *input, unsigned shift);
@@ -143,6 +146,7 @@ protected:
void _handleLevelChange(unsigned level);
Colour _colourFromIndex(unsigned idx);
void _flushShape();
+ void _nameFromId(VSDName &name, unsigned id, unsigned level);
virtual unsigned getUInt(WPXInputStream *input);
virtual int getInt(WPXInputStream *input);
@@ -176,6 +180,8 @@ protected:
std::map<unsigned, VSDName> m_fonts;
std::map<unsigned, VSDName> m_names;
+ std::map<unsigned, std::map<unsigned, VSDName> > m_namesMapMap;
+ VSDName m_currentPageName;
private:
VSDParser();
diff --git a/src/lib/VSDStylesCollector.cpp b/src/lib/VSDStylesCollector.cpp
index 452f8bd..be586ee 100644
--- a/src/lib/VSDStylesCollector.cpp
+++ b/src/lib/VSDStylesCollector.cpp
@@ -244,7 +244,7 @@ void libvisio::VSDStylesCollector::collectPageProps(unsigned /* id */, unsigned
_handleLevelChange(level);
}
-void libvisio::VSDStylesCollector::collectPage(unsigned /* id */, unsigned level, unsigned /* backgroundPageID */, bool /* isBackgroundPage */, const WPXString & /* pageName */)
+void libvisio::VSDStylesCollector::collectPage(unsigned /* id */, unsigned level, unsigned /* backgroundPageID */, bool /* isBackgroundPage */, const VSDName & /* pageName */)
{
_handleLevelChange(level);
}
diff --git a/src/lib/VSDStylesCollector.h b/src/lib/VSDStylesCollector.h
index ce8d696..6cdf30b 100644
--- a/src/lib/VSDStylesCollector.h
+++ b/src/lib/VSDStylesCollector.h
@@ -91,7 +91,7 @@ public:
void collectShapesOrder(unsigned id, unsigned level, const std::vector<unsigned> &shapeIds);
void collectForeignDataType(unsigned level, unsigned foreignType, unsigned foreignFormat, double offsetX, double offsetY, double width, double height);
void collectPageProps(unsigned id, unsigned level, double pageWidth, double pageHeight, double shadowOffsetX, double shadowOffsetY, double scale);
- void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &pageName);
+ void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const VSDName &pageName);
void collectShape(unsigned id, unsigned level, unsigned parent, unsigned masterPage, unsigned masterShape, unsigned lineStyle, unsigned fillStyle, unsigned textStyle);
void collectSplineStart(unsigned id, unsigned level, double x, double y, double secondKnot, double firstKnot, double lastKnot, unsigned degree);
void collectSplineKnot(unsigned id, unsigned level, double x, double y, double knot);
diff --git a/src/lib/VSDTypes.h b/src/lib/VSDTypes.h
index ba90396..08e4e76 100644
--- a/src/lib/VSDTypes.h
+++ b/src/lib/VSDTypes.h
@@ -184,6 +184,10 @@ public:
m_format(format) {}
VSDName() : m_data(), m_format(VSD_TEXT_ANSI) {}
VSDName(const VSDName &name) : m_data(name.m_data), m_format(name.m_format) {}
+ bool empty() const
+ {
+ return !m_data.size();
+ }
WPXBinaryData m_data;
TextFormat m_format;
};
diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp
index 2885f45..64e1e79 100644
--- a/src/lib/VSDXMLParserBase.cpp
+++ b/src/lib/VSDXMLParserBase.cpp
@@ -1105,7 +1105,7 @@ void libvisio::VSDXMLParserBase::readPage(xmlTextReaderPtr reader)
bool isBackgroundPage = background ? xmlStringToBool(background) : false;
m_isPageStarted = true;
m_collector->startPage(nId);
- m_collector->collectPage(nId, (unsigned)getElementDepth(reader), backgroundPageID, isBackgroundPage, pageName ? WPXString((const char *)pageName) : WPXString());
+ m_collector->collectPage(nId, (unsigned)getElementDepth(reader), backgroundPageID, isBackgroundPage, pageName ? VSDName(WPXBinaryData(pageName, xmlStrlen(pageName)), VSD_TEXT_UTF8) : VSDName());
}
if (id)
xmlFree(id);