src/lib/VSD5Parser.cpp | 18 +++++++++++++++++- src/lib/VSD5Parser.h | 2 +- src/lib/VSDDocumentStructure.h | 1 + src/lib/VSDParser.cpp | 24 +++++++++++++++++++++--- src/lib/VSDParser.h | 1 + 5 files changed, 41 insertions(+), 5 deletions(-)
New commits: commit d9358fa7e6eeaf9075042b0cc98909f5866aea8a Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Fri Feb 22 15:14:47 2013 +0100 More page names for versions <= 5 diff --git a/src/lib/VSD5Parser.cpp b/src/lib/VSD5Parser.cpp index f49fafa..447dea7 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, VSDName()); + m_collector->collectPage(m_header.id, m_header.level, backgroundPageID, m_isBackgroundPage, m_currentPageName); } void libvisio::VSD5Parser::readTextBlock(WPXInputStream *input) @@ -424,6 +424,22 @@ void libvisio::VSD5Parser::readTextField(WPXInputStream *input) } } +void libvisio::VSD5Parser::readNameIDX(WPXInputStream *input) +{ + VSD_DEBUG_MSG(("VSD5Parser::readNameIDX\n")); + std::map<unsigned, VSDName> names; + unsigned recordCount = readU16(input); + for (unsigned i = 0; i < recordCount; ++i) + { + unsigned elementId = readU16(input); + unsigned nameId = readU16(input); + 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; +} + unsigned libvisio::VSD5Parser::getUInt(WPXInputStream *input) { diff --git a/src/lib/VSD5Parser.h b/src/lib/VSD5Parser.h index d6cf0ae..64f4c6c 100644 --- a/src/lib/VSD5Parser.h +++ b/src/lib/VSD5Parser.h @@ -73,7 +73,7 @@ protected: virtual void readStyleSheet(WPXInputStream *input); - virtual void readNameIDX(WPXInputStream *) {} + virtual void readNameIDX(WPXInputStream *input); virtual unsigned getUInt(WPXInputStream *input); virtual int getInt(WPXInputStream *input); diff --git a/src/lib/VSDDocumentStructure.h b/src/lib/VSDDocumentStructure.h index b6a2c98..69fee18 100644 --- a/src/lib/VSDDocumentStructure.h +++ b/src/lib/VSDDocumentStructure.h @@ -52,6 +52,7 @@ #define VSD_NAME_LIST2 0x32 #define VSD_NAME2 0x33 +#define VSD_NAMEIDX123 0x34 #define VSD_PAGE_SHEET 0x46 #define VSD_SHAPE_GROUP 0x47 diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index 84c2124..605f102 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -226,7 +226,7 @@ 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) + else if (ptr.Type == VSD_NAMEIDX || ptr.Type == VSD_NAMEIDX123) NameIDX[i] = ptr; else if (ptr.Type != 0) PtrList[i] = ptr; @@ -337,8 +337,7 @@ void libvisio::VSDParser::handleStream(const Pointer &ptr, unsigned idx, unsigne if ((ptr.Format >> 4) == 0x4 || (ptr.Format >> 4) == 0x5 || (ptr.Format >> 4) == 0x0) { - if (ptr.Length > 4) - handleBlob(&tmpInput, shift, level+1); + handleBlob(&tmpInput, shift, level+1); if ((ptr.Format >> 4) == 0x5 && ptr.Type != VSD_COLORS) handleStreams(&tmpInput, ptr.Type, shift, level+1); } @@ -504,6 +503,9 @@ void libvisio::VSDParser::handleChunk(WPXInputStream *input) case VSD_NAMEIDX: readNameIDX(input); break; + case VSD_NAMEIDX123: + readNameIDX123(input); + break; case VSD_PAGE_PROPS: readPageProps(input); break; @@ -745,6 +747,22 @@ void libvisio::VSDParser::readNameIDX(WPXInputStream *input) m_namesMapMap[m_header.level] = names; } +void libvisio::VSDParser::readNameIDX123(WPXInputStream *input) +{ + std::map<unsigned, VSDName> names; + long endPosition = input->tell() + m_header.dataLength; + while (!input->atEOS() && input->tell() < endPosition) + { + unsigned nameId = getUInt(input); + unsigned elementId = getUInt(input); + 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); diff --git a/src/lib/VSDParser.h b/src/lib/VSDParser.h index 351b681..4e89631 100644 --- a/src/lib/VSDParser.h +++ b/src/lib/VSDParser.h @@ -129,6 +129,7 @@ protected: void readOLEData(WPXInputStream *input); virtual void readNameIDX(WPXInputStream *input); + virtual void readNameIDX123(WPXInputStream *input); // parser of one pass bool parseDocument(WPXInputStream *input, unsigned shift);
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits