[Libreoffice-commits] .: src/lib

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Feb 21 06:40:12 PST 2013


 src/lib/VSD5Parser.cpp          |   33 ++++++++++++++++++---------------
 src/lib/VSD5Parser.h            |    3 +++
 src/lib/VSD6Parser.cpp          |   11 +++++++++++
 src/lib/VSD6Parser.h            |    1 +
 src/lib/VSDCollector.h          |    2 +-
 src/lib/VSDContentCollector.cpp |    3 ++-
 src/lib/VSDContentCollector.h   |    2 +-
 src/lib/VSDDocumentStructure.h  |    3 +++
 src/lib/VSDPages.cpp            |    5 +++--
 src/lib/VSDPages.h              |    1 +
 src/lib/VSDParser.cpp           |   37 +++++++++++++++++++++++++++++++++++--
 src/lib/VSDParser.h             |    4 ++++
 src/lib/VSDStylesCollector.cpp  |    2 +-
 src/lib/VSDStylesCollector.h    |    2 +-
 src/lib/VSDXMLParserBase.cpp    |    5 ++++-
 15 files changed, 89 insertions(+), 25 deletions(-)

New commits:
commit 9a4a8eb8e76755bd2aaa287f86a931f7f4030ccc
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date:   Thu Feb 21 15:39:47 2013 +0100

    Some initial work on the support of page names

diff --git a/src/lib/VSD5Parser.cpp b/src/lib/VSD5Parser.cpp
index 55351b1..9d7c164 100644
--- a/src/lib/VSD5Parser.cpp
+++ b/src/lib/VSD5Parser.cpp
@@ -162,44 +162,47 @@ void libvisio::VSD5Parser::readGeomList(WPXInputStream *input)
   handleChunkRecords(input);
 }
 
-void libvisio::VSD5Parser::readCharList(WPXInputStream *input)
+void libvisio::VSD5Parser::readList(WPXInputStream *input)
 {
-  VSD_DEBUG_MSG(("VSD5Parser::readCharList\n"));
   if (!m_isStencilStarted)
     m_collector->collectUnhandledChunk(m_header.id, m_header.level);
   handleChunkRecords(input);
 }
 
+void libvisio::VSD5Parser::readCharList(WPXInputStream *input)
+{
+  VSD_DEBUG_MSG(("VSD5Parser::readCharList\n"));
+  readList(input);
+}
+
 void libvisio::VSD5Parser::readParaList(WPXInputStream *input)
 {
   VSD_DEBUG_MSG(("VSD5Parser::readParaList\n"));
-  if (!m_isStencilStarted)
-    m_collector->collectUnhandledChunk(m_header.id, m_header.level);
-  handleChunkRecords(input);
+  readList(input);
 }
 
 void libvisio::VSD5Parser::readShapeList(WPXInputStream *input)
 {
   VSD_DEBUG_MSG(("VSD5Parser::readShapeList\n"));
-  if (!m_isStencilStarted)
-    m_collector->collectUnhandledChunk(m_header.id, m_header.level);
-  handleChunkRecords(input);
+  readList(input);
 }
 
 void libvisio::VSD5Parser::readPropList(WPXInputStream *input)
 {
   VSD_DEBUG_MSG(("VSD5Parser::readPropList\n"));
-  if (!m_isStencilStarted)
-    m_collector->collectUnhandledChunk(m_header.id, m_header.level);
-  handleChunkRecords(input);
+  readList(input);
 }
 
 void libvisio::VSD5Parser::readFieldList(WPXInputStream *input)
 {
   VSD_DEBUG_MSG(("VSD5Parser::readFieldList\n"));
-  if (!m_isStencilStarted)
-    m_collector->collectUnhandledChunk(m_header.id, m_header.level);
-  handleChunkRecords(input);
+  readList(input);
+}
+
+void libvisio::VSD5Parser::readNameList2(WPXInputStream *input)
+{
+  VSD_DEBUG_MSG(("VSD5Parser::readNameList2\n"));
+  readList(input);
 }
 
 void libvisio::VSD5Parser::readLine(WPXInputStream *input)
@@ -378,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);
+  m_collector->collectPage(m_header.id, m_header.level, backgroundPageID, m_isBackgroundPage, WPXString());
 }
 
 void libvisio::VSD5Parser::readTextBlock(WPXInputStream *input)
diff --git a/src/lib/VSD5Parser.h b/src/lib/VSD5Parser.h
index ceb73d6..4430e1c 100644
--- a/src/lib/VSD5Parser.h
+++ b/src/lib/VSD5Parser.h
@@ -58,6 +58,7 @@ protected:
   virtual void readShapeList(WPXInputStream *input);
   virtual void readPropList(WPXInputStream *input);
   virtual void readFieldList(WPXInputStream *input);
+  virtual void readNameList2(WPXInputStream *input);
 
   virtual void readLine(WPXInputStream *input);
   virtual void readFillAndShadow(WPXInputStream *input);
@@ -79,6 +80,8 @@ private:
   VSD5Parser();
   VSD5Parser(const VSDParser &);
   VSD5Parser &operator=(const VSDParser &);
+
+  void readList(WPXInputStream *input);
 };
 
 } // namespace libvisio
diff --git a/src/lib/VSD6Parser.cpp b/src/lib/VSD6Parser.cpp
index 645d569..a34862b 100644
--- a/src/lib/VSD6Parser.cpp
+++ b/src/lib/VSD6Parser.cpp
@@ -282,6 +282,17 @@ void libvisio::VSD6Parser::readName(WPXInputStream *input)
   }
 }
 
+void libvisio::VSD6Parser::readName2(WPXInputStream *input)
+{
+  unsigned char character = 0;
+  ::WPXBinaryData name;
+  getInt(input); // skip a dword that seems to be always 1
+  while ((character = readU8(input)))
+    name.append(character);
+  name.append(character);
+  m_names[m_header.id] = VSDName(name, libvisio::VSD_TEXT_ANSI);
+}
+
 void libvisio::VSD6Parser::readTextField(WPXInputStream *input)
 {
   unsigned long initialPosition = input->tell();
diff --git a/src/lib/VSD6Parser.h b/src/lib/VSD6Parser.h
index 6550324..dd7663b 100644
--- a/src/lib/VSD6Parser.h
+++ b/src/lib/VSD6Parser.h
@@ -54,6 +54,7 @@ private:
   virtual void readParaIX(WPXInputStream *input);
   virtual void readFillAndShadow(WPXInputStream *input);
   virtual void readName(WPXInputStream *input);
+  virtual void readName2(WPXInputStream *input);
   virtual void readTextField(WPXInputStream *input);
 
   VSD6Parser();
diff --git a/src/lib/VSDCollector.h b/src/lib/VSDCollector.h
index 1c88eaa..1633726 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) = 0;
+  virtual void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &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 cbe2bcb..09b268b 100644
--- a/src/lib/VSDContentCollector.cpp
+++ b/src/lib/VSDContentCollector.cpp
@@ -1699,10 +1699,11 @@ 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)
+void libvisio::VSDContentCollector::collectPage(unsigned /* id */, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &pageName)
 {
   _handleLevelChange(level);
   m_currentPage.m_backgroundPageID = backgroundPageID;
+  m_currentPage.m_pageName = pageName;
   m_isBackgroundPage = isBackgroundPage;
 }
 
diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h
index bf8e728..0c273c2 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);
+  void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &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 ee9296f..ae0fd62 100644
--- a/src/lib/VSDDocumentStructure.h
+++ b/src/lib/VSDDocumentStructure.h
@@ -50,6 +50,9 @@
 #define VSD_NAME_LIST 0x2c
 #define VSD_NAME 0x2d
 
+#define VSD_NAME_LIST2 0x32
+#define VSD_NAME2 0x33
+
 #define VSD_PAGE_SHEET 0x46
 #define VSD_SHAPE_GROUP 0x47
 #define VSD_SHAPE_SHAPE 0x48
diff --git a/src/lib/VSDPages.cpp b/src/lib/VSDPages.cpp
index 0e741dc..81d2b84 100644
--- a/src/lib/VSDPages.cpp
+++ b/src/lib/VSDPages.cpp
@@ -32,14 +32,14 @@
 #include "libvisio_utils.h"
 
 libvisio::VSDPage::VSDPage()
-  : m_pageWidth(0.0), m_pageHeight(0.0),
+  : m_pageWidth(0.0), m_pageHeight(0.0), m_pageName(),
     m_currentPageID(0), m_backgroundPageID(MINUS_ONE),
     m_pageElements()
 {
 }
 
 libvisio::VSDPage::VSDPage(const libvisio::VSDPage &page)
-  : m_pageWidth(page.m_pageWidth), m_pageHeight(page.m_pageHeight),
+  : m_pageWidth(page.m_pageWidth), m_pageHeight(page.m_pageHeight), m_pageName(page.m_pageName),
     m_currentPageID(page.m_currentPageID), m_backgroundPageID(page.m_backgroundPageID),
     m_pageElements(page.m_pageElements)
 {
@@ -55,6 +55,7 @@ libvisio::VSDPage &libvisio::VSDPage::operator=(const libvisio::VSDPage &page)
   {
     m_pageWidth = page.m_pageWidth;
     m_pageHeight = page.m_pageHeight;
+    m_pageName = page.m_pageName;
     m_currentPageID = page.m_currentPageID;
     m_backgroundPageID = page.m_backgroundPageID;
     m_pageElements = page.m_pageElements;
diff --git a/src/lib/VSDPages.h b/src/lib/VSDPages.h
index 49497ac..98c0b5e 100644
--- a/src/lib/VSDPages.h
+++ b/src/lib/VSDPages.h
@@ -46,6 +46,7 @@ public:
   void append(const VSDOutputElementList &outputElements);
   void draw(libwpg::WPGPaintInterface *painter) const;
   double m_pageWidth, m_pageHeight;
+  WPXString m_pageName;
   unsigned m_currentPageID, m_backgroundPageID;
   VSDOutputElementList m_pageElements;
 };
diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp
index bab29b6..e5aca03 100644
--- a/src/lib/VSDParser.cpp
+++ b/src/lib/VSDParser.cpp
@@ -46,7 +46,7 @@ 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_currentGeometryList(0), m_currentGeomListCount(0), m_fonts(), m_names()
 {}
 
 libvisio::VSDParser::~VSDParser()
@@ -196,6 +196,7 @@ void libvisio::VSDParser::handleStreams(WPXInputStream *input, unsigned ptrType,
   std::vector<unsigned> pointerOrder;
   std::map<unsigned, libvisio::Pointer> PtrList;
   std::map<unsigned, libvisio::Pointer> FontFaces;
+  std::map<unsigned, libvisio::Pointer> NameList;
 
   try
   {
@@ -209,6 +210,8 @@ void libvisio::VSDParser::handleStreams(WPXInputStream *input, unsigned ptrType,
       readPointer(input, ptr);
       if (ptr.Type == VSD_FONTFACES)
         FontFaces[i] = ptr;
+      else if (ptr.Type == VSD_NAME_LIST2)
+        NameList[i] = ptr;
       else if (ptr.Type != 0)
         PtrList[i] = ptr;
     }
@@ -222,12 +225,16 @@ void libvisio::VSDParser::handleStreams(WPXInputStream *input, unsigned ptrType,
     pointerOrder.clear();
     PtrList.clear();
     FontFaces.clear();
+    NameList.clear();
   }
 
   std::map<unsigned, libvisio::Pointer>::iterator iter;
   for (iter = FontFaces.begin(); iter != FontFaces.end(); ++iter)
     handleStream(iter->second, iter->first, level+1);
 
+  for (iter = NameList.begin(); iter != NameList.end(); ++iter)
+    handleStream(iter->second, iter->first, level+1);
+
   if (!pointerOrder.empty())
   {
     for (unsigned j=0; j < pointerOrder.size(); ++j)
@@ -513,9 +520,15 @@ void libvisio::VSDParser::handleChunk(WPXInputStream *input)
   case VSD_NAME_LIST:
     readNameList(input);
     break;
+  case VSD_NAME_LIST2:
+    readNameList2(input);
+    break;
   case VSD_NAME:
     readName(input);
     break;
+  case VSD_NAME2:
+    readName2(input);
+    break;
   case VSD_FIELD_LIST:
     readFieldList(input);
     break;
@@ -831,7 +844,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);
+  m_collector->collectPage(m_header.id, m_header.level, backgroundPageID, m_isBackgroundPage, WPXString());
 }
 
 void libvisio::VSDParser::readGeometry(WPXInputStream *input)
@@ -1413,6 +1426,11 @@ void libvisio::VSDParser::readNameList(WPXInputStream * /* input */)
   m_shape.m_names.clear();
 }
 
+void libvisio::VSDParser::readNameList2(WPXInputStream * /* input */)
+{
+  m_names.clear();
+}
+
 void libvisio::VSDParser::readFieldList(WPXInputStream *input)
 {
   if (m_header.trailer)
@@ -1744,6 +1762,21 @@ void libvisio::VSDParser::readName(WPXInputStream *input)
   }
 }
 
+void libvisio::VSDParser::readName2(WPXInputStream *input)
+{
+  unsigned short unicharacter = 0;
+  ::WPXBinaryData name;
+  input->seek(4, WPX_SEEK_CUR); // skip a dword that seems to be always 1
+  while ((unicharacter = readU16(input)))
+  {
+    name.append(unicharacter & 0xff);
+    name.append((unicharacter & 0xff00) >> 8);
+  }
+  name.append(unicharacter & 0xff);
+  name.append((unicharacter & 0xff00) >> 8);
+  m_names[m_header.id] = VSDName(name, libvisio::VSD_TEXT_UTF16);
+}
+
 void libvisio::VSDParser::readTextField(WPXInputStream *input)
 {
   unsigned long initialPosition = input->tell();
diff --git a/src/lib/VSDParser.h b/src/lib/VSDParser.h
index 3fa8c4a..13498e1 100644
--- a/src/lib/VSDParser.h
+++ b/src/lib/VSDParser.h
@@ -110,6 +110,9 @@ protected:
   void readNameList(WPXInputStream *input);
   virtual void readName(WPXInputStream *input);
 
+  virtual void readNameList2(WPXInputStream *input);
+  virtual void readName2(WPXInputStream *input);
+
   virtual void readFieldList(WPXInputStream *input);
   virtual void readTextField(WPXInputStream *input);
 
@@ -172,6 +175,7 @@ protected:
   unsigned m_currentGeomListCount;
 
   std::map<unsigned, VSDName> m_fonts;
+  std::map<unsigned, VSDName> m_names;
 
 private:
   VSDParser();
diff --git a/src/lib/VSDStylesCollector.cpp b/src/lib/VSDStylesCollector.cpp
index eeaad50..452f8bd 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 */)
+void libvisio::VSDStylesCollector::collectPage(unsigned /* id */, unsigned level, unsigned /* backgroundPageID */, bool /* isBackgroundPage */, const WPXString & /* pageName */)
 {
   _handleLevelChange(level);
 }
diff --git a/src/lib/VSDStylesCollector.h b/src/lib/VSDStylesCollector.h
index 2d22f8e..ce8d696 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);
+  void collectPage(unsigned id, unsigned level, unsigned backgroundPageID, bool isBackgroundPage, const WPXString &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/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp
index 4174e16..2885f45 100644
--- a/src/lib/VSDXMLParserBase.cpp
+++ b/src/lib/VSDXMLParserBase.cpp
@@ -1097,6 +1097,7 @@ void libvisio::VSDXMLParserBase::readPage(xmlTextReaderPtr reader)
   xmlChar *id = xmlTextReaderGetAttribute(reader, BAD_CAST("ID"));
   xmlChar *bgndPage = xmlTextReaderGetAttribute(reader, BAD_CAST("BackPage"));
   xmlChar *background = xmlTextReaderGetAttribute(reader, BAD_CAST("Background"));
+  xmlChar *pageName = xmlTextReaderGetAttribute(reader, BAD_CAST("NameU"));
   if (id)
   {
     unsigned nId = (unsigned)xmlStringToLong(id);
@@ -1104,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);
+    m_collector->collectPage(nId, (unsigned)getElementDepth(reader), backgroundPageID, isBackgroundPage, pageName ? WPXString((const char *)pageName) : WPXString());
   }
   if (id)
     xmlFree(id);
@@ -1112,6 +1113,8 @@ void libvisio::VSDXMLParserBase::readPage(xmlTextReaderPtr reader)
     xmlFree(bgndPage);
   if (background)
     xmlFree(background);
+  if (pageName)
+    xmlFree(pageName);
 }
 
 void libvisio::VSDXMLParserBase::readText(xmlTextReaderPtr reader)


More information about the Libreoffice-commits mailing list