[Libreoffice-commits] .: src/lib
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Fri Feb 22 06:15:24 PST 2013
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.strba at 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);
More information about the Libreoffice-commits
mailing list