sw/source/filter/ww8/wrtww8.cxx | 45 ++++++++++++++++++++++++-- sw/source/filter/ww8/ww8scan.cxx | 64 +++++++++++++++++++++++++++++++++++++- sw/source/filter/ww8/ww8struc.hxx | 7 ++++ 3 files changed, 112 insertions(+), 4 deletions(-)
New commits: commit fed39aeae06cbd38be1a57e68eb8859df7a9b3f2 Author: Miklos Vajna <[email protected]> Date: Mon Dec 14 14:37:50 2015 +0100 DOC export: write propBags in SmartTagData Change-Id: I1d1f8aa28438209fbe3258b4b4418fcdfaabf78c diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index f75560b..8a30c1b 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -418,6 +418,19 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) } } aSmartTagData.m_aPropBagStore.m_aStringTable.assign(aSet.begin(), aSet.end()); + for (const std::map<OUString, OUString>& rStatements : m_aStatements) + { + MSOPropertyBag aPropertyBag; + aPropertyBag.m_nId = 1; + for (const std::pair<OUString, OUString>& rPair : rStatements) + { + MSOProperty aProperty; + aProperty.m_nKey = std::distance(aSet.begin(), aSet.find(rPair.first)); + aProperty.m_nValue = std::distance(aSet.begin(), aSet.find(rPair.second)); + aPropertyBag.m_aProperties.push_back(aProperty); + } + aSmartTagData.m_aPropBags.push_back(aPropertyBag); + } aSmartTagData.Write(rExport); rExport.pFib->lcbFactoidData = rStream.Tell() - rExport.pFib->fcFactoidData; diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx index a460eaa..98b4a5a 100644 --- a/sw/source/filter/ww8/ww8scan.cxx +++ b/sw/source/filter/ww8/ww8scan.cxx @@ -6399,6 +6399,12 @@ void MSOProperty::Read(SvStream& rStream) rStream.ReadUInt32(m_nValue); } +void MSOProperty::Write(SvStream& rStream) +{ + rStream.WriteUInt32(m_nKey); + rStream.WriteUInt32(m_nValue); +} + MSOPropertyBag::MSOPropertyBag() : m_nId(0) { @@ -6425,6 +6431,16 @@ void MSOPropertyBag::Read(SvStream& rStream) } } +void MSOPropertyBag::Write(WW8Export& rExport) +{ + SvStream& rStream = *rExport.pTableStrm; + rStream.WriteUInt16(m_nId); + rStream.WriteUInt16(m_aProperties.size()); + rStream.WriteUInt16(0); // cbUnknown + for (MSOProperty& rProperty : m_aProperties) + rProperty.Write(rStream); +} + void WW8SmartTagData::Read(SvStream& rStream, WW8_FC fcFactoidData, sal_uInt32 lcbFactoidData) { sal_uInt64 nOldPosition = rStream.Tell(); @@ -6445,6 +6461,8 @@ void WW8SmartTagData::Read(SvStream& rStream, WW8_FC fcFactoidData, sal_uInt32 l void WW8SmartTagData::Write(WW8Export& rExport) { m_aPropBagStore.Write(rExport); + for (MSOPropertyBag& rPropertyBag : m_aPropBags) + rPropertyBag.Write(rExport); } WW8Style::WW8Style(SvStream& rStream, WW8Fib& rFibPara) diff --git a/sw/source/filter/ww8/ww8struc.hxx b/sw/source/filter/ww8/ww8struc.hxx index 5aef92a..fc97b2d 100644 --- a/sw/source/filter/ww8/ww8struc.hxx +++ b/sw/source/filter/ww8/ww8struc.hxx @@ -1120,6 +1120,7 @@ class MSOProperty public: MSOProperty(); void Read(SvStream& rStream); + void Write(SvStream& rStream); /// Index into MSOPropertyBagStore::m_aStringTable. sal_uInt32 m_nKey; @@ -1133,6 +1134,7 @@ class MSOPropertyBag public: MSOPropertyBag(); void Read(SvStream& rStream); + void Write(WW8Export& rExport); /// Matches MSOFactoidType::m_nId in MSOPropertyBagStore::m_aFactoidTypes. sal_uInt16 m_nId; commit 520bb76859d912bfc7a5f60d7dbbbd2e460b4ff7 Author: Miklos Vajna <[email protected]> Date: Mon Dec 14 13:57:14 2015 +0100 DOC export: write stringTable in SmartTagData Change-Id: I05eda6067308119a388238eed356531851000691 diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index c90ef7d..f75560b 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -319,11 +319,12 @@ class WW8_WrtFactoids: private boost::noncopyable { std::vector<WW8_CP> m_aStartCPs; std::vector<WW8_CP> m_aEndCPs; + std::vector< std::map<OUString, OUString> > m_aStatements; public: WW8_WrtFactoids(); ~WW8_WrtFactoids(); - void Append(WW8_CP nStartCp, WW8_CP nEndCp); + void Append(WW8_CP nStartCp, WW8_CP nEndCp, const std::map<OUString, OUString>& rStatements); void Write(WW8Export& rWrt); } ; @@ -335,10 +336,11 @@ WW8_WrtFactoids::~WW8_WrtFactoids() { } -void WW8_WrtFactoids::Append(WW8_CP nStartCp, WW8_CP nEndCp) +void WW8_WrtFactoids::Append(WW8_CP nStartCp, WW8_CP nEndCp, const std::map<OUString, OUString>& rStatements) { m_aStartCPs.push_back(nStartCp); m_aEndCPs.push_back(nEndCp); + m_aStatements.push_back(rStatements); } void WW8_WrtFactoids::Write(WW8Export& rExport) @@ -404,6 +406,19 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) aFactoidType.m_aTag = "RDF"; WW8SmartTagData aSmartTagData; aSmartTagData.m_aPropBagStore.m_aFactoidTypes.push_back(aFactoidType); + + std::set<OUString> aSet; + for (const std::map<OUString, OUString>& rStatements : m_aStatements) + { + // Statements for a single text node. + for (const std::pair<OUString, OUString>& rPair : rStatements) + { + aSet.insert(rPair.first); + aSet.insert(rPair.second); + } + } + aSmartTagData.m_aPropBagStore.m_aStringTable.assign(aSet.begin(), aSet.end()); + aSmartTagData.Write(rExport); rExport.pFib->lcbFactoidData = rStream.Tell() - rExport.pFib->fcFactoidData; } @@ -1477,7 +1492,7 @@ void WW8Export::AppendSmartTags(const SwTextNode& rTextNode) if (!aStatements.empty()) { WW8_CP nCP = Fc2Cp(Strm().Tell()); - m_pFactoids->Append(nCP, nCP); + m_pFactoids->Append(nCP, nCP, aStatements); } } commit 8f52bb0b66020590b04bcfb5ce8ff6694f6a4112 Author: Miklos Vajna <[email protected]> Date: Mon Dec 14 12:20:13 2015 +0100 DOC export: write factoidTypes in SmartTagData Change-Id: I30ba25e035fae08c06b17e2bafcb8a1147d4e12d diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index c145fd6..c90ef7d 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -395,6 +395,17 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) rStream.WriteInt16(0); // cDepth, 0 as does not overlap with any other smart tag. } rExport.pFib->lcbPlcfBklFactoid = rStream.Tell() - rExport.pFib->fcPlcfBklFactoid; + + rExport.pFib->fcFactoidData = rStream.Tell(); + // Write SmartTagData. + MSOFactoidType aFactoidType; + aFactoidType.m_nId = 1; + aFactoidType.m_aUri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + aFactoidType.m_aTag = "RDF"; + WW8SmartTagData aSmartTagData; + aSmartTagData.m_aPropBagStore.m_aFactoidTypes.push_back(aFactoidType); + aSmartTagData.Write(rExport); + rExport.pFib->lcbFactoidData = rStream.Tell() - rExport.pFib->fcFactoidData; } #define ANZ_DEFAULT_STYLES 16 diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx index 326ae80..a460eaa 100644 --- a/sw/source/filter/ww8/ww8scan.cxx +++ b/sw/source/filter/ww8/ww8scan.cxx @@ -6253,8 +6253,10 @@ bool WW8Fib::Write(SvStream& rStrm) pData += 0x442 - 0x43A; Set_UInt32(pData, fcPlcfBklFactoid); Set_UInt32(pData, lcbPlcfBklFactoid); + Set_UInt32(pData, fcFactoidData); + Set_UInt32(pData, lcbFactoidData); - pData += 0x4DA - 0x44A; + pData += 0x4DA - 0x452; } else pData += 0x4DA - 0x422; @@ -6309,6 +6311,15 @@ OUString Read(SvStream& rStream) return aRet; } + +void Write(const OUString& rString, SvStream& rStream) +{ + sal_uInt16 nBuf = 0; + nBuf |= rString.getLength(); // cch, 0..14th bits. + nBuf |= 0x8000; // fAnsiString, 15th bit. + rStream.WriteUInt16(nBuf); + SwWW8Writer::WriteString8(rStream, rString, false, RTL_TEXTENCODING_ASCII_US); +} }; void MSOFactoidType::Read(SvStream& rStream) @@ -6321,6 +6332,20 @@ void MSOFactoidType::Read(SvStream& rStream) MSOPBString::Read(rStream); // rgbDownloadURL } +void MSOFactoidType::Write(WW8Export& rExport) +{ + SvStream& rStream = *rExport.pTableStrm; + + SvMemoryStream aStream; + aStream.WriteUInt32(m_nId); // id + MSOPBString::Write(m_aUri, aStream); + MSOPBString::Write(m_aTag, aStream); + MSOPBString::Write("", aStream); // rgbDownloadURL + rStream.WriteUInt32(aStream.Tell()); + aStream.Seek(0); + rStream.WriteStream(aStream); +} + void MSOPropertyBagStore::Read(SvStream& rStream) { sal_uInt32 cFactoidType(0); @@ -6348,6 +6373,20 @@ void MSOPropertyBagStore::Read(SvStream& rStream) } } +void MSOPropertyBagStore::Write(WW8Export& rExport) +{ + SvStream& rStream = *rExport.pTableStrm; + rStream.WriteUInt32(m_aFactoidTypes.size()); // cFactoidType + for (MSOFactoidType& rType : m_aFactoidTypes) + rType.Write(rExport); + rStream.WriteUInt16(0xc); // cbHdr + rStream.WriteUInt16(0x0100); // sVer + rStream.WriteUInt32(0); // cfactoid + rStream.WriteUInt32(m_aStringTable.size()); // cste + for (const OUString& rString : m_aStringTable) + MSOPBString::Write(rString, rStream); +} + MSOProperty::MSOProperty() : m_nKey(0) , m_nValue(0) @@ -6403,6 +6442,11 @@ void WW8SmartTagData::Read(SvStream& rStream, WW8_FC fcFactoidData, sal_uInt32 l rStream.Seek(nOldPosition); } +void WW8SmartTagData::Write(WW8Export& rExport) +{ + m_aPropBagStore.Write(rExport); +} + WW8Style::WW8Style(SvStream& rStream, WW8Fib& rFibPara) : rFib(rFibPara), rSt(rStream), cstd(0), cbSTDBaseInFile(0), fStdStylenamesWritten(0) , stiMaxWhenSaved(0), istdMaxFixedWhenSaved(0), nVerBuiltInNamesWhenSaved(0) diff --git a/sw/source/filter/ww8/ww8struc.hxx b/sw/source/filter/ww8/ww8struc.hxx index 5181a1b..5aef92a 100644 --- a/sw/source/filter/ww8/ww8struc.hxx +++ b/sw/source/filter/ww8/ww8struc.hxx @@ -32,6 +32,8 @@ # pragma pack(push, 2) #endif +class WW8Export; + inline void Set_UInt8( sal_uInt8 *& p, sal_uInt8 n ) { *p = n; @@ -1094,6 +1096,7 @@ class MSOFactoidType public: MSOFactoidType(); void Read(SvStream& rStream); + void Write(WW8Export& rExport); sal_uInt32 m_nId; OUString m_aUri; @@ -1105,6 +1108,7 @@ class MSOPropertyBagStore { public: void Read(SvStream& rStream); + void Write(WW8Export& rExport); std::vector<MSOFactoidType> m_aFactoidTypes; std::vector<OUString> m_aStringTable; @@ -1140,6 +1144,7 @@ class WW8SmartTagData { public: void Read(SvStream& rStream, WW8_FC fcFactoidData, sal_uInt32 lcbFactoidData); + void Write(WW8Export& rExport); MSOPropertyBagStore m_aPropBagStore; std::vector<MSOPropertyBag> m_aPropBags; _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
