summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFridrich Štrba <fridrich.strba@bluewin.ch>2011-11-10 13:12:20 +0100
committerFridrich Štrba <fridrich.strba@bluewin.ch>2011-11-10 13:12:20 +0100
commit80ce9032a98cfeb434fdf23a8a99973eb8754c97 (patch)
treefa556cb55a339a3b58fa10b989baa5b92971a470
parentdc4fb1d4c5e37272c024047dd383ea1b74cc45fc (diff)
And now the text fields should be replaced (not in the right format though)
-rw-r--r--src/lib/VSDXContentCollector.cpp28
-rw-r--r--src/lib/VSDXContentCollector.h7
-rw-r--r--src/lib/VSDXFieldList.cpp30
-rw-r--r--src/lib/VSDXFieldList.h5
4 files changed, 26 insertions, 44 deletions
diff --git a/src/lib/VSDXContentCollector.cpp b/src/lib/VSDXContentCollector.cpp
index cb2c47d..77d418f 100644
--- a/src/lib/VSDXContentCollector.cpp
+++ b/src/lib/VSDXContentCollector.cpp
@@ -65,8 +65,8 @@ libvisio::VSDXContentCollector::VSDXContentCollector(
m_currentPageNumber(0), m_shapeOutputDrawing(0), m_shapeOutputText(0),
m_pageOutputDrawing(), m_pageOutputText(), m_documentPageShapeOrders(documentPageShapeOrders),
m_pageShapeOrder(documentPageShapeOrders[0]), m_isFirstGeometry(true),
- m_NURBSData(), m_polylineData(), m_textStream(), m_names(), m_fields(), m_textFormat(VSD_TEXT_ANSI),
- m_charFormats(), m_paraFormats(), m_textBlockStyle(),
+ m_NURBSData(), m_polylineData(), m_textStream(), m_names(), m_fields(), m_fieldIndex(0),
+ m_textFormat(VSD_TEXT_ANSI), m_charFormats(), m_paraFormats(), m_textBlockStyle(),
m_defaultCharStyle(), m_defaultParaStyle(), m_styles(styles),
m_stencils(stencils), m_stencilShape(0), m_isStencilStarted(false), m_currentGeometryCount(0),
m_backgroundPageID(0xffffffff), m_currentPageID(0), m_currentPage(), m_pages(),
@@ -1611,11 +1611,7 @@ void libvisio::VSDXContentCollector::collectShape(unsigned id, unsigned level, u
m_names.push_back(nameString);
}
- for (std::vector<VSDXFieldListElement *>::iterator iterField = m_fields.begin(); iterField != m_fields.end(); iterField++)
- if (*iterField)
- delete (*iterField);
- m_fields.clear();
- m_fields = m_stencilShape->m_fields.getVector();
+ m_fields = m_stencilShape->m_fields;
if (m_stencilShape->m_lineStyleId)
lineStyleFromStyleSheet(m_stencilShape->m_lineStyleId);
@@ -1660,6 +1656,7 @@ void libvisio::VSDXContentCollector::collectShape(unsigned id, unsigned level, u
}
m_currentGeometryCount = 0;
+ m_fieldIndex = 0;
}
void libvisio::VSDXContentCollector::collectUnhandledChunk(unsigned /* id */, unsigned level)
@@ -1767,6 +1764,7 @@ void libvisio::VSDXContentCollector::collectNameList(unsigned /*id*/, unsigned l
void libvisio::VSDXContentCollector::_convertDataToString(WPXString &result, const WPXBinaryData &data, TextFormat format)
{
+ m_fieldIndex = 0;
WPXInputStream *pStream = const_cast<WPXInputStream *>(data.getDataStream());
if (format == VSD_TEXT_ANSI)
{
@@ -1861,30 +1859,32 @@ void libvisio::VSDXContentCollector::fillStyleFromStyleSheet(const VSDXFillStyle
void libvisio::VSDXContentCollector::collectFieldList(unsigned id, unsigned level, const std::vector<unsigned> &fieldsOrder)
{
_handleLevelChange(level);
- for (std::vector<VSDXFieldListElement *>::iterator iterField = m_fields.begin(); iterField != m_fields.end(); iterField++)
- if (*iterField)
- delete (*iterField);
m_fields.clear();
+ m_fields.setElementsOrder(fieldsOrder);
}
void libvisio::VSDXContentCollector::collectTextField(unsigned id, unsigned level, unsigned nameId)
{
_handleLevelChange(level);
+ m_fields.addTextField(id, level, nameId);
}
void libvisio::VSDXContentCollector::collectNumericField(unsigned id, unsigned level, unsigned format, double number)
{
_handleLevelChange(level);
+ m_fields.addNumericField(id, level, format, number);
}
void libvisio::VSDXContentCollector::collectDatetimeField(unsigned id, unsigned level, unsigned format, unsigned long timeValue)
{
_handleLevelChange(level);
+ m_fields.addDatetimeField(id, level, format, timeValue);
}
void libvisio::VSDXContentCollector::collectEmptyField(unsigned id, unsigned level)
{
_handleLevelChange(level);
+ m_fields.addEmptyField(id, level);
}
@@ -1919,7 +1919,6 @@ void libvisio::VSDXContentCollector::_handleLevelChange(unsigned level)
if (m_textStream.size())
_flushText();
m_isShapeStarted = false;
-
}
m_originalX = 0.0;
m_originalY = 0.0;
@@ -1989,6 +1988,7 @@ void libvisio::VSDXContentCollector::_appendUTF16LE(WPXString &text, WPXInputStr
uint16_t high_surrogate = 0;
bool fail = false;
uint32_t ucs4Character = 0;
+ uint16_t character = 0;
while (true)
{
if (input->atEOS())
@@ -1996,8 +1996,10 @@ void libvisio::VSDXContentCollector::_appendUTF16LE(WPXString &text, WPXInputStr
fail = true;
break;
}
- uint16_t character = readU16(input);
- if (character >= 0xdc00 && character < 0xe000) /* low surrogate */
+ character = readU16(input);
+ if (character == 0xfffc)
+ text.append(m_fields.getElement(m_fieldIndex++)->getString(m_names).cstr());
+ else if (character >= 0xdc00 && character < 0xe000) /* low surrogate */
{
if (high_surrogate)
{
diff --git a/src/lib/VSDXContentCollector.h b/src/lib/VSDXContentCollector.h
index 47d1743..03c192f 100644
--- a/src/lib/VSDXContentCollector.h
+++ b/src/lib/VSDXContentCollector.h
@@ -62,10 +62,6 @@ public:
virtual ~VSDXContentCollector()
{
if (m_txtxform) delete(m_txtxform);
- for (std::vector<VSDXFieldListElement *>::iterator iterField = m_fields.begin(); iterField != m_fields.end(); iterField++)
- if (*iterField)
- delete (*iterField);
- m_fields.clear();
};
void collectEllipticalArcTo(unsigned id, unsigned level, double x3, double y3, double x2, double y2, double angle, double ecc);
@@ -229,7 +225,8 @@ private:
std::map<unsigned, PolylineData> m_polylineData;
WPXBinaryData m_textStream;
std::vector<WPXString> m_names;
- std::vector<VSDXFieldListElement *> m_fields;
+ VSDXFieldList m_fields;
+ unsigned m_fieldIndex;
TextFormat m_textFormat;
std::vector<VSDXCharStyle> m_charFormats;
std::vector<VSDXParaStyle> m_paraFormats;
diff --git a/src/lib/VSDXFieldList.cpp b/src/lib/VSDXFieldList.cpp
index e1c8381..56ec296 100644
--- a/src/lib/VSDXFieldList.cpp
+++ b/src/lib/VSDXFieldList.cpp
@@ -200,30 +200,6 @@ libvisio::VSDXFieldList &libvisio::VSDXFieldList::operator=(const libvisio::VSDX
return *this;
}
-std::vector<libvisio::VSDXFieldListElement *> libvisio::VSDXFieldList::getVector() const
-{
- std::vector<libvisio::VSDXFieldListElement *> vec;
- if (!empty())
- {
- std::map<unsigned, VSDXFieldListElement *>::const_iterator iter;
- if (m_elementsOrder.size())
- {
- for (unsigned i = 0; i < m_elementsOrder.size(); i++)
- {
- iter = m_elements.find(m_elementsOrder[i]);
- if (iter != m_elements.end())
- vec.push_back(iter->second->clone());
- }
- }
- else
- {
- for (iter = m_elements.begin(); iter != m_elements.end(); iter++)
- vec.push_back(iter->second->clone());
- }
- }
- return vec;
-}
-
libvisio::VSDXFieldList::~VSDXFieldList()
{
clear();
@@ -260,6 +236,7 @@ void libvisio::VSDXFieldList::handle(VSDXCollector *collector)
{
if (empty())
return;
+
std::map<unsigned, VSDXFieldListElement *>::iterator iter;
if (m_elementsOrder.size())
{
@@ -287,7 +264,10 @@ void libvisio::VSDXFieldList::clear()
libvisio::VSDXFieldListElement *libvisio::VSDXFieldList::getElement(unsigned index)
{
- std::map<unsigned, VSDXFieldListElement *>::iterator iter = m_elements.find(index);
+ if (m_elementsOrder.size() > index)
+ index = m_elementsOrder[index];
+
+ std::map<unsigned, VSDXFieldListElement *>::const_iterator iter = m_elements.find(index);
if (iter != m_elements.end())
return iter->second;
else
diff --git a/src/lib/VSDXFieldList.h b/src/lib/VSDXFieldList.h
index b33a8bb..51ce2d1 100644
--- a/src/lib/VSDXFieldList.h
+++ b/src/lib/VSDXFieldList.h
@@ -61,7 +61,6 @@ public:
VSDXFieldList(const VSDXFieldList &fieldList);
~VSDXFieldList();
VSDXFieldList &operator=(const VSDXFieldList &fieldList);
- std::vector<VSDXFieldListElement *> getVector() const;
void setElementsOrder(const std::vector<unsigned> &m_elementsOrder);
void addTextField(unsigned id, unsigned level, unsigned nameId);
void addNumericField(unsigned id, unsigned level, unsigned format, double number);
@@ -69,6 +68,10 @@ public:
void addEmptyField(unsigned id, unsigned level);
void handle(VSDXCollector *collector);
void clear();
+ unsigned long size() const
+ {
+ return (unsigned long)m_elements.size();
+ }
bool empty() const
{
return (!m_elements.size());