summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-04-18 16:47:14 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-04-18 17:34:36 +0200
commit6b6e4d471c2954d34d280398ed1c986d7fb27ae1 (patch)
tree09f655aa0de9cdcf9c6745fbb5d63fa7735a1ed8 /writerfilter
parentfbcdc3ec24e107736f4952b3d42504f9f8035b63 (diff)
fdo#75735 RTF import: fix COW when writing a nested structure
Regression from a48e2fd9049797110b3b2505c363557284987ca8 (fdo#44736 - convert RTFSprms to a copy-on-write structure., 2012-12-07) Change-Id: I2538f440e29cef6d40db2ea914e4afcbfe411890
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/rtftok/rtfdocumentimpl.cxx2
-rw-r--r--writerfilter/source/rtftok/rtfsprm.cxx6
-rw-r--r--writerfilter/source/rtftok/rtfsprm.hxx2
3 files changed, 7 insertions, 3 deletions
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 1a0fd1ad4891..7fffb141242c 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -77,7 +77,7 @@ static Id lcl_getParagraphBorder(sal_uInt32 nIndex)
static void lcl_putNestedAttribute(RTFSprms& rSprms, Id nParent, Id nId, RTFValue::Pointer_t pValue,
RTFOverwrite eOverwrite = OVERWRITE_YES, bool bAttribute = true)
{
- RTFValue::Pointer_t pParent = rSprms.find(nParent);
+ RTFValue::Pointer_t pParent = rSprms.find(nParent, /*bFirst=*/true, /*bForWrite=*/true);
if (!pParent.get())
{
RTFSprms aAttributes;
diff --git a/writerfilter/source/rtftok/rtfsprm.cxx b/writerfilter/source/rtftok/rtfsprm.cxx
index dc55aca0f168..48ce46887786 100644
--- a/writerfilter/source/rtftok/rtfsprm.cxx
+++ b/writerfilter/source/rtftok/rtfsprm.cxx
@@ -79,9 +79,13 @@ std::string RTFSprm::toString() const
return aBuf.makeStringAndClear().getStr();
}
-RTFValue::Pointer_t RTFSprms::find(Id nKeyword, bool bFirst)
+RTFValue::Pointer_t RTFSprms::find(Id nKeyword, bool bFirst, bool bForWrite)
{
RTFValue::Pointer_t pValue;
+
+ if (bForWrite)
+ ensureCopyBeforeWrite();
+
for (RTFSprms::Iterator_t i = m_pSprms->begin(); i != m_pSprms->end(); ++i)
if (i->first == nKeyword)
{
diff --git a/writerfilter/source/rtftok/rtfsprm.hxx b/writerfilter/source/rtftok/rtfsprm.hxx
index 6b25fa45d538..de5cd5935c59 100644
--- a/writerfilter/source/rtftok/rtfsprm.hxx
+++ b/writerfilter/source/rtftok/rtfsprm.hxx
@@ -61,7 +61,7 @@ namespace writerfilter {
RTFSprms(const RTFSprms& rSprms);
~RTFSprms();
RTFSprms& operator=(const RTFSprms& rOther);
- RTFValue::Pointer_t find(Id nKeyword, bool bFirst = true);
+ RTFValue::Pointer_t find(Id nKeyword, bool bFirst = true, bool bForWrite = false);
/// Does the same as ->push_back(), except that it can overwrite or ignore existing entries.
void set(Id nKeyword, RTFValue::Pointer_t pValue, RTFOverwrite eOverwrite = OVERWRITE_YES);
bool erase(Id nKeyword);