[Libreoffice-commits] core.git: 2 commits - sw/source

Miklos Vajna vmiklos at collabora.co.uk
Tue Dec 8 06:52:48 PST 2015


 sw/source/filter/ww8/ww8par.cxx   |    9 +++
 sw/source/filter/ww8/ww8par.hxx   |    4 +
 sw/source/filter/ww8/ww8par5.cxx  |    4 +
 sw/source/filter/ww8/ww8scan.cxx  |  109 ++++++++++++++++++++++++++++++++++++++
 sw/source/filter/ww8/ww8struc.hxx |   57 +++++++++++++++++++
 5 files changed, 183 insertions(+)

New commits:
commit e0caeaa5be754c35742cec7ddf70c9021f66f2bf
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Dec 8 15:34:03 2015 +0100

    WW8SmartTagData::Read: check seek result
    
    Change-Id: I0492c5b3018f59e4b783bb33f8b75ce67847dcf0

diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx
index 0f2df7c..c39afcb 100644
--- a/sw/source/filter/ww8/ww8scan.cxx
+++ b/sw/source/filter/ww8/ww8scan.cxx
@@ -6363,7 +6363,8 @@ void MSOPropertyBag::Read(SvStream& rStream)
 void WW8SmartTagData::Read(SvStream& rStream, WW8_FC fcFactoidData, sal_uInt32 lcbFactoidData)
 {
     sal_uInt64 nOldPosition = rStream.Tell();
-    rStream.Seek(fcFactoidData);
+    if (!checkSeek(rStream, fcFactoidData))
+        return;
 
     m_aPropBagStore.Read(rStream);
     while (rStream.Tell() < fcFactoidData + lcbFactoidData)
commit 0c3155f601b74eb369f47dc713d9e119e798da85
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Dec 8 15:16:50 2015 +0100

    DOC import: read SmartTagData
    
    This only reads all the interesting info,
    SwWW8ImplReader::Read_FactoidBook() still has to put it on the filter
    stack in a later commit.
    
    Change-Id: Ic2e8b441367448b5bdf940bf8871f25afe8362c4

diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index 84512a5..15a731b 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -5978,6 +5978,15 @@ const OUString* SwWW8ImplReader::GetAnnotationAuthor(sal_uInt16 nIdx)
     return pRet;
 }
 
+void SwWW8ImplReader::GetSmartTagInfo(sal_uInt16 /*nIndex*/)
+{
+    if (!m_pSmartTagData && m_pWwFib->lcbFactoidData)
+    {
+        m_pSmartTagData.reset(new WW8SmartTagData());
+        m_pSmartTagData->Read(*m_pTableStream, m_pWwFib->fcFactoidData, m_pWwFib->lcbFactoidData);
+    }
+}
+
 sal_uLong SwWW8ImplReader::LoadDoc(WW8Glossary *pGloss)
 {
     sal_uLong nErrRet = 0;
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
index 98669e3..d231d57 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -1251,6 +1251,8 @@ private:
 
     std::vector<OUString>* m_pAtnNames;
 
+    std::unique_ptr<WW8SmartTagData> m_pSmartTagData;
+
     sw::util::AuthorInfos m_aAuthorInfos;
     OUString m_sBaseURL;
 
@@ -1638,6 +1640,8 @@ private:
 
     const OUString* GetAnnotationAuthor(sal_uInt16 nIdx);
 
+    void GetSmartTagInfo(sal_uInt16 nIndex);
+
     // interfaces for the toggle attributes
     void SetToggleAttr(sal_uInt8 nAttrId, bool bOn);
     void SetToggleBiDiAttr(sal_uInt8 nAttrId, bool bOn);
diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
index 18747c3..5394be4 100644
--- a/sw/source/filter/ww8/ww8par5.cxx
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -249,7 +249,11 @@ long SwWW8ImplReader::Read_FactoidBook(WW8PLCFManResult*)
         if (pFactoidBook->getIsEnd())
             m_pReffedStck->SetAttr(*m_pPaM->GetPoint(), RES_FLTR_RDFMARK, true, pFactoidBook->getHandle());
         else
+        {
+            // TODO make this non-void and put keys/values into the RDF mark.
+            GetSmartTagInfo(pFactoidBook->getHandle());
             m_pReffedStck->NewAttr(*m_pPaM->GetPoint(), CntUInt16Item(RES_FLTR_RDFMARK, pFactoidBook->getHandle()));
+        }
     }
     return 0;
 }
diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx
index 1a39642..0f2df7c 100644
--- a/sw/source/filter/ww8/ww8scan.cxx
+++ b/sw/source/filter/ww8/ww8scan.cxx
@@ -6268,6 +6268,114 @@ rtl_TextEncoding WW8Fib::GetFIBCharset(sal_uInt16 chs, sal_uInt16 nLidLocale)
     return rtl_getTextEncodingFromWindowsCharset(static_cast<sal_uInt8>(chs));
 }
 
+MSOFactoidType::MSOFactoidType()
+    : m_nId(0)
+{
+}
+
+namespace MSOPBString
+{
+OUString Read(SvStream& rStream)
+{
+    OUString aRet;
+
+    sal_uInt16 nBuf(0);
+    rStream.ReadUInt16(nBuf);
+    sal_uInt16 nCch = nBuf & 0x7fff; // Bits 1..15.
+    bool bAnsiString = (nBuf & (1 << 15)) >> 15; // 16th bit.
+    if (bAnsiString)
+        aRet = OStringToOUString(read_uInt8s_ToOString(rStream, nCch), RTL_TEXTENCODING_ASCII_US);
+    else
+        aRet = read_uInt16s_ToOUString(rStream, nCch);
+
+    return aRet;
+}
+};
+
+void MSOFactoidType::Read(SvStream& rStream)
+{
+    sal_uInt32 cbFactoid(0);
+    rStream.ReadUInt32(cbFactoid);
+    rStream.ReadUInt32(m_nId);
+    m_aUri = MSOPBString::Read(rStream);
+    m_aTag = MSOPBString::Read(rStream);
+    MSOPBString::Read(rStream); // rgbDownloadURL
+}
+
+void MSOPropertyBagStore::Read(SvStream& rStream)
+{
+    sal_uInt32 cFactoidType(0);
+    rStream.ReadUInt32(cFactoidType);
+    for (sal_uInt32 i = 0; i < cFactoidType; ++i)
+    {
+        MSOFactoidType aFactoidType;
+        aFactoidType.Read(rStream);
+        m_aFactoidTypes.push_back(aFactoidType);
+    }
+    sal_uInt16 cbHdr(0);
+    rStream.ReadUInt16(cbHdr);
+    SAL_WARN_IF(cbHdr != 0xc, "sw.ww8", "MSOPropertyBagStore::Read: unexpected cbHdr");
+    sal_uInt16 nVer(0);
+    rStream.ReadUInt16(nVer);
+    SAL_WARN_IF(nVer != 0x0100, "sw.ww8", "MSOPropertyBagStore::Read: unexpected nVer");
+    rStream.SeekRel(4); // cfactoid
+    sal_uInt32 nCste(0);
+    rStream.ReadUInt32(nCste);
+
+    for (sal_uInt32 i = 0; i < nCste; ++i)
+    {
+        OUString aString = MSOPBString::Read(rStream);
+        m_aStringTable.push_back(aString);
+    }
+}
+
+MSOProperty::MSOProperty()
+    : m_nKey(0),
+    m_nValue(0)
+{
+}
+
+void MSOProperty::Read(SvStream& rStream)
+{
+    rStream.ReadUInt32(m_nKey);
+    rStream.ReadUInt32(m_nValue);
+}
+
+MSOPropertyBag::MSOPropertyBag()
+    : m_nId(0)
+{
+}
+
+void MSOPropertyBag::Read(SvStream& rStream)
+{
+    rStream.ReadUInt16(m_nId);
+    sal_uInt16 cProp(0);
+    rStream.ReadUInt16(cProp);
+    rStream.SeekRel(2); // cbUnknown
+    for (sal_uInt16 i = 0; i < cProp; ++i)
+    {
+        MSOProperty aProperty;
+        aProperty.Read(rStream);
+        m_aProperties.push_back(aProperty);
+    }
+}
+
+void WW8SmartTagData::Read(SvStream& rStream, WW8_FC fcFactoidData, sal_uInt32 lcbFactoidData)
+{
+    sal_uInt64 nOldPosition = rStream.Tell();
+    rStream.Seek(fcFactoidData);
+
+    m_aPropBagStore.Read(rStream);
+    while (rStream.Tell() < fcFactoidData + lcbFactoidData)
+    {
+        MSOPropertyBag aPropertyBag;
+        aPropertyBag.Read(rStream);
+        m_aPropBags.push_back(aPropertyBag);
+    }
+
+    rStream.Seek(nOldPosition);
+}
+
 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 5d0f0fc..5181a1b 100644
--- a/sw/source/filter/ww8/ww8struc.hxx
+++ b/sw/source/filter/ww8/ww8struc.hxx
@@ -1088,6 +1088,63 @@ namespace wwUtility
     inline sal_uInt32 RGBToBGR(sal_uInt32 nColour) { return msfilter::util::BGRToRGB(nColour); }
 }
 
+/// [MS-OSHARED] FactoidType: one smart tag type.
+class MSOFactoidType
+{
+public:
+    MSOFactoidType();
+    void Read(SvStream& rStream);
+
+    sal_uInt32 m_nId;
+    OUString m_aUri;
+    OUString m_aTag;
+};
+
+/// [MS-OSHARED] PropertyBagStore: smart tag types and string store.
+class MSOPropertyBagStore
+{
+public:
+    void Read(SvStream& rStream);
+
+    std::vector<MSOFactoidType> m_aFactoidTypes;
+    std::vector<OUString> m_aStringTable;
+};
+
+/// [MS-OSHARED] Property: stores information about one smart-tag key/value.
+class MSOProperty
+{
+public:
+    MSOProperty();
+    void Read(SvStream& rStream);
+
+    /// Index into MSOPropertyBagStore::m_aStringTable.
+    sal_uInt32 m_nKey;
+    /// Index into MSOPropertyBagStore::m_aStringTable.
+    sal_uInt32 m_nValue;
+};
+
+/// [MS-OSHARED] PropertyBag: stores information about one smart tag.
+class MSOPropertyBag
+{
+public:
+    MSOPropertyBag();
+    void Read(SvStream& rStream);
+
+    /// Matches MSOFactoidType::m_nId in MSOPropertyBagStore::m_aFactoidTypes.
+    sal_uInt16 m_nId;
+    std::vector<MSOProperty> m_aProperties;
+};
+
+/// [MS-DOC] SmartTagData: stores information about all smart tags in the document.
+class WW8SmartTagData
+{
+public:
+    void Read(SvStream& rStream, WW8_FC fcFactoidData, sal_uInt32 lcbFactoidData);
+
+    MSOPropertyBagStore m_aPropBagStore;
+    std::vector<MSOPropertyBag> m_aPropBags;
+};
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list