[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