diff options
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/core/data/ww6/pass/ooo17498-1.doc | bin | 0 -> 5632 bytes | |||
-rw-r--r-- | sw/qa/core/data/ww6/pass/ooo17498-2.doc | bin | 0 -> 5632 bytes | |||
-rw-r--r-- | sw/qa/core/data/ww6/pass/ooo17498-3.doc | bin | 0 -> 5632 bytes | |||
-rw-r--r-- | sw/qa/core/data/ww6/pass/ooo17498-4.doc | bin | 0 -> 5120 bytes | |||
-rw-r--r-- | sw/qa/core/data/ww6/pass/ooo8726-1.doc | bin | 0 -> 5120 bytes | |||
-rw-r--r-- | sw/source/filter/ww8/ww8par.cxx | 4 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par.hxx | 1 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par2.cxx | 7 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par3.cxx | 2 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8par6.cxx | 89 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8scan.cxx | 93 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8scan.hxx | 44 |
12 files changed, 174 insertions, 66 deletions
diff --git a/sw/qa/core/data/ww6/pass/ooo17498-1.doc b/sw/qa/core/data/ww6/pass/ooo17498-1.doc Binary files differnew file mode 100644 index 000000000000..258c6ff63ec7 --- /dev/null +++ b/sw/qa/core/data/ww6/pass/ooo17498-1.doc diff --git a/sw/qa/core/data/ww6/pass/ooo17498-2.doc b/sw/qa/core/data/ww6/pass/ooo17498-2.doc Binary files differnew file mode 100644 index 000000000000..9955f782092e --- /dev/null +++ b/sw/qa/core/data/ww6/pass/ooo17498-2.doc diff --git a/sw/qa/core/data/ww6/pass/ooo17498-3.doc b/sw/qa/core/data/ww6/pass/ooo17498-3.doc Binary files differnew file mode 100644 index 000000000000..c0db457ca0a9 --- /dev/null +++ b/sw/qa/core/data/ww6/pass/ooo17498-3.doc diff --git a/sw/qa/core/data/ww6/pass/ooo17498-4.doc b/sw/qa/core/data/ww6/pass/ooo17498-4.doc Binary files differnew file mode 100644 index 000000000000..be0df8195410 --- /dev/null +++ b/sw/qa/core/data/ww6/pass/ooo17498-4.doc diff --git a/sw/qa/core/data/ww6/pass/ooo8726-1.doc b/sw/qa/core/data/ww6/pass/ooo8726-1.doc Binary files differnew file mode 100644 index 000000000000..e78dab155102 --- /dev/null +++ b/sw/qa/core/data/ww6/pass/ooo8726-1.doc diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index d42e3c909b57..045cf7353279 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -4977,7 +4977,7 @@ sal_uLong SwWW8ImplReader::CoreLoad(WW8Glossary *pGloss) RedlineFlags eMode = RedlineFlags::ShowInsert; - m_pSprmParser = new wwSprmParser(m_pWwFib->GetFIBVersion()); + m_pSprmParser = new wwSprmParser(*m_pWwFib); // Set handy helper variables m_bVer6 = (6 == m_pWwFib->m_nVersion); @@ -6387,7 +6387,7 @@ bool SwMSDffManager::GetOLEStorageName(long nOLEId, OUString& rStorageName, nStartCp += rReader.m_nDrawCpO; nEndCp += rReader.m_nDrawCpO; WW8PLCFx_Cp_FKP* pChp = rReader.m_pPlcxMan->GetChpPLCF(); - wwSprmParser aSprmParser(rReader.m_pWwFib->GetFIBVersion()); + wwSprmParser aSprmParser(*rReader.m_pWwFib); while (nStartCp <= nEndCp && !nPictureId) { if (!pChp->SeekPos( nStartCp)) diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 54c9fd14e798..7d9dd965277d 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -1693,6 +1693,7 @@ public: // really private, but can only be done public void Read_BoldUsw(sal_uInt16 nId, const sal_uInt8*, short nLen); void Read_Bidi(sal_uInt16 nId, const sal_uInt8*, short nLen); void Read_BoldBiDiUsw(sal_uInt16 nId, const sal_uInt8*, short nLen); + void Read_AmbiguousSPRM(sal_uInt16 nId, const sal_uInt8*, short nLen); void Read_SubSuper( sal_uInt16, const sal_uInt8*, short nLen ); bool ConvertSubToGraphicPlacement(); static SwFrameFormat *ContainsSingleInlineGraphic(const SwPaM &rRegion); diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx index d7375533feb6..c777532778b8 100644 --- a/sw/source/filter/ww8/ww8par2.cxx +++ b/sw/source/filter/ww8/ww8par2.cxx @@ -1785,7 +1785,7 @@ WW8TabDesc::WW8TabDesc(SwWW8ImplReader* pIoClass, WW8_CP nStartCp) : WW8TabBandDesc* pNewBand = new WW8TabBandDesc; - wwSprmParser aSprmParser(m_pIo->GetFib().GetFIBVersion()); + wwSprmParser aSprmParser(m_pIo->GetFib()); // process pPap until end of table found do @@ -3638,6 +3638,9 @@ void WW8RStyle::ImportSprms(sal_uInt8 *pSprms, short nLen, bool bPap) WW8SprmIter aSprmIter(pSprms, nLen, maSprmParser); while (const sal_uInt8* pSprm = aSprmIter.GetSprms()) { +#ifdef DEBUGSPRMREADER + fprintf(stderr, "id is %x\n", aIter.GetAktId()); +#endif pIo->ImportSprm(pSprm); aSprmIter.advance(); } @@ -3740,7 +3743,7 @@ void WW8RStyle::ImportGrupx(short nLen, bool bPara, bool bOdd) WW8RStyle::WW8RStyle(WW8Fib& _rFib, SwWW8ImplReader* pI) : WW8Style(*pI->m_pTableStream, _rFib) - , maSprmParser(_rFib.GetFIBVersion()) + , maSprmParser(_rFib) , pIo(pI) , pStStrm(pI->m_pTableStream) , pStyRule(nullptr) diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx index 3f41f87415ea..5c34fe8c74aa 100644 --- a/sw/source/filter/ww8/ww8par3.cxx +++ b/sw/source/filter/ww8/ww8par3.cxx @@ -1136,7 +1136,7 @@ SwNumRule* WW8ListManager::GetNumRule(size_t i) // oeffentliche Methoden WW8ListManager::WW8ListManager(SvStream& rSt_, SwWW8ImplReader& rReader_) - : maSprmParser(rReader_.GetFib().GetFIBVersion()), rReader(rReader_) + : maSprmParser(rReader_.GetFib()), rReader(rReader_) , rDoc(rReader.GetDoc()) , rFib(rReader.GetFib()), rSt(rSt_) , nUniqueList(1) diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx index f28b3a832d22..59112cbb4d74 100644 --- a/sw/source/filter/ww8/ww8par6.cxx +++ b/sw/source/filter/ww8/ww8par6.cxx @@ -2944,6 +2944,83 @@ void SwWW8ImplReader::Read_Bidi(sal_uInt16, const sal_uInt8* pData, short nLen) } } +/* + tdf#91916, #i8726, #i42685# there is an ambiguity + around certain properties as to what they mean, + which appears to be a problem with different versions + of the file format where properties conflict, i.e. + +ooo40606-2.doc, magic is a699 + : 0x6f 0x4 0x0 0x71 0x4 0x0 +ooo40635-1.doc, magic is a699 + : 0x6f 0x4 0x0 0x71 0x4 0x0 +ooo31093/SIMPCHIN.doc, magic is a699 + : 0x6f 0x2 0x0 0x70 0x0 0x0 0x71 0x2 0x0 + : 0x6f 0x5 0x0 0x70 0x5 0x0 +ooo31093/TRADCHIN.doc, magic is a699 + : 0x6f 0x1 0x0 0x70 0x0 0x0 0x71 0x1 0x0 +ooo31093/JAPANESE.doc, magic is a697 + : 0x6f 0x2 0x0 0x70 0x0 0x0 0x71 0x2 0x0 +ooo31093/KOREAN.doc, magic is a698 + : 0x6f 0x2 0x0 0x70 0x0 0x0 0x71 0x2 0x0 +ooo31093-1.doc, magic is a698 + : 0x6f 0x5 0x0 0x70 0x5 0x0 +ooo31093-1.doc, magic is a698 + : 0x6f 0x5 0x0 0x70 0x5 0x0 + +meanwhile... + +ooo27954-1.doc, magic is a5dc + : 0x6f 0x1 0x81 0x71 0x2 0x4 0x0 0x74 0x2 0x20 0x0 + +ooo33251-1.doc, magic is a5dc + : 0x6f 0x1 0x81 0x71 0x2 0x3 0x0 0x74 0x2 0x1c 0x0 + +--- + +So we have the same sprm values, but different payloads, where +the a5dc versions appear to use a len argument, followed by len +bytes, while the a698<->a699 versions use a 2byte argument + +commit c2213db9ed70c1fd546482d22e36e4029c10aa45 + + INTEGRATION: CWS tl28 (1.169.24); FILE MERGED + 2006/10/25 13:40:41 tl 1.169.24.2: RESYNC: (1.169-1.170); FILE MERGED + 2006/09/20 11:55:50 hbrinkm 1.169.24.1: #i42685# applied patch + +changed 0x6f and 0x70 from Read_BoldBiDiUsw to Read_FontCode for all versions. + +In the Word for Window 2 spec we have... + 78 //sprmCMajority + 80 //sprmCFBoldBi + 81 //sprmCFItalicBi + 82 //sprmCFtcBi + 83 //sprmClidBi + 84 //sprmCIcoBi + 85 //sprmCHpsBi +as see in GetWW2SprmDispatcher, different numbers, but the sequence starts with +the same sprmCMajority as appears before 0x6f in word 6/95 + +I think the easiest explanation is that the CJK Word for Window 95, or whatever +the product was went rogue, and did their own things with at least first three +slots after sprmCMajority to do a different thing. I have no reason to think Tono +was wrong with what they do in the a698<->a699 versions versions, but with magic +a5dc they probably did mean sprmCFBoldBi, sprmCFItalicBi cause they have that 0x81 +pattern which has significance for those types of properties. +*/ +void SwWW8ImplReader::Read_AmbiguousSPRM(sal_uInt16 nId, const sal_uInt8* pData, + short nLen) +{ + if (m_pWwFib->m_wIdent >= 0xa697 && m_pWwFib->m_wIdent <= 0xa699) + { + Read_FontCode(nId, pData, nLen); + } + else + { + Read_BoldBiDiUsw(nId, pData, nLen); + } +} + // Read_BoldUsw for BiDi Italic, Bold void SwWW8ImplReader::Read_BoldBiDiUsw(sal_uInt16 nId, const sal_uInt8* pData, short nLen) @@ -5429,12 +5506,12 @@ const wwSprmDispatcher *GetWW6SprmDispatcher() //percentage to grow hps short {110, nullptr}, //"sprmCCondHyhen", chp.ysri //ysri short - {111, &SwWW8ImplReader::Read_FontCode}, //ww7 font - {112, &SwWW8ImplReader::Read_FontCode}, //ww7 CJK font - {113, &SwWW8ImplReader::Read_FontCode}, //ww7 rtl font - {114, &SwWW8ImplReader::Read_Language}, //ww7 lid - {115, &SwWW8ImplReader::Read_TextColor}, //ww7 rtl colour ? - {116, &SwWW8ImplReader::Read_FontSize}, + {111, &SwWW8ImplReader::Read_AmbiguousSPRM}, //sprmCFBoldBi or font code + {112, &SwWW8ImplReader::Read_AmbiguousSPRM}, //sprmCFItalicBi or font code + {113, &SwWW8ImplReader::Read_FontCode}, //sprmCFtcBi + {114, &SwWW8ImplReader::Read_Language}, //sprmClidBi + {115, &SwWW8ImplReader::Read_TextColor}, //sprmCIcoBi + {116, &SwWW8ImplReader::Read_FontSize}, //sprmCHpsBi {117, &SwWW8ImplReader::Read_Special}, //"sprmCFSpec", chp.fSpec 1 //or 0 bit {118, &SwWW8ImplReader::Read_Obj}, //"sprmCFObj", chp.fObj 1 or 0 diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx index 2192aae2296b..76029777121b 100644 --- a/sw/source/filter/ww8/ww8scan.cxx +++ b/sw/source/filter/ww8/ww8scan.cxx @@ -250,7 +250,7 @@ const wwSprmSearcher *wwSprmParser::GetWW2SprmSearcher() return &aSprmSrch; }; -const wwSprmSearcher *wwSprmParser::GetWW6SprmSearcher() +const wwSprmSearcher *wwSprmParser::GetWW6SprmSearcher(const WW8Fib& rFib) { //double lock me // WW7- Sprms @@ -352,12 +352,12 @@ const wwSprmSearcher *wwSprmParser::GetWW6SprmSearcher() {108, { 0, L_VAR} }, // "sprmCMajority50" chp.fBold, chp.fItalic, ... {109, { 2, L_FIX} }, // "sprmCHpsMul" chp.hps percentage to grow hps {110, { 2, L_FIX} }, // "sprmCCondHyhen" chp.ysri ysri - {111, { 2, L_FIX} }, // ww7 font - {112, { 2, L_FIX} }, // ww7 CJK font - {113, { 2, L_FIX} }, // ww7 rtl font - {114, { 2, L_FIX} }, // ww7 lid - {115, { 2, L_FIX} }, // ww7 rtl colour ? - {116, { 2, L_FIX} }, // ww7 fontsize + {111, { 0, L_VAR} }, // sprmCFBoldBi or font code + {112, { 0, L_VAR} }, // sprmCFItalicBi or font code + {113, { 0, L_VAR} }, // ww7 rtl font + {114, { 0, L_VAR} }, // ww7 lid + {115, { 0, L_VAR} }, // ww7 CJK font + {116, { 0, L_VAR} }, // ww7 fontsize {117, { 1, L_FIX} }, // "sprmCFSpec" chp.fSpec 1 or 0 bit {118, { 1, L_FIX} }, // "sprmCFObj" chp.fObj 1 or 0 bit {119, { 1, L_FIX} }, // "sprmPicBrcl" pic.brcl brcl (see PIC definition) @@ -429,10 +429,27 @@ const wwSprmSearcher *wwSprmParser::GetWW6SprmSearcher() {207, { 0, L_VAR} } // rtl property ? }; + if (rFib.m_wIdent >= 0xa697 && rFib.m_wIdent <= 0xa699) + { + //see Read_AmbiguousSPRM for this oddity + static wwSprmSearcher aSprmSrch(aSprms, SAL_N_ELEMENTS(aSprms), true); + return &aSprmSrch; + } + static wwSprmSearcher aSprmSrch(aSprms, SAL_N_ELEMENTS(aSprms)); return &aSprmSrch; }; +void wwSprmSearcher::patchCJKVariant() +{ + for (sal_uInt16 nId = 111; nId <= 113; ++nId) + { + SprmInfo& amb1 = map_[nId]; + amb1.nLen = 2; + amb1.nVari = wwSprmParser::L_FIX; + } +} + const wwSprmSearcher *wwSprmParser::GetWW8SprmSearcher() { //double lock me @@ -773,7 +790,7 @@ const wwSprmSearcher *wwSprmParser::GetWW8SprmSearcher() return &aSprmSrch; }; -wwSprmParser::wwSprmParser(ww::WordVersion eVersion) : meVersion(eVersion) +wwSprmParser::wwSprmParser(const WW8Fib& rFib) : meVersion(rFib.GetFIBVersion()) { OSL_ENSURE((meVersion >= ww::eWW1 && meVersion <= ww::eWW8), "Impossible value for version"); @@ -783,7 +800,7 @@ wwSprmParser::wwSprmParser(ww::WordVersion eVersion) : meVersion(eVersion) if (meVersion <= ww::eWW2) mpKnownSprms = GetWW2SprmSearcher(); else if (meVersion < ww::eWW8) - mpKnownSprms = GetWW6SprmSearcher(); + mpKnownSprms = GetWW6SprmSearcher(rFib); else mpKnownSprms = GetWW8SprmSearcher(); } @@ -930,9 +947,9 @@ const sal_uInt8* WW8SprmIter::FindSprm(sal_uInt16 nId) // temporary test // WW8PLCFx_PCDAttrs cling to WW8PLCF_Pcd and therefore do not have their own iterators. // All methods relating to iterators are therefore dummies. -WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs(ww::WordVersion eVersion, +WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs(const WW8Fib& rFib, WW8PLCFx_PCD* pPLCFx_PCD, const WW8ScannerBase* pBase) - : WW8PLCFx(eVersion, true), pPcdI(pPLCFx_PCD->GetPLCFIter()), + : WW8PLCFx(rFib, true), pPcdI(pPLCFx_PCD->GetPLCFIter()), pPcd(pPLCFx_PCD), pGrpprls(pBase->m_aPieceGrpprls.data()), nGrpprls(pBase->m_aPieceGrpprls.size()) { @@ -1116,9 +1133,9 @@ void WW8PLCFx_PCDAttrs::GetSprms(WW8PLCFxDesc* p) } } -WW8PLCFx_PCD::WW8PLCFx_PCD(ww::WordVersion eVersion, WW8PLCFpcd* pPLCFpcd, +WW8PLCFx_PCD::WW8PLCFx_PCD(const WW8Fib& rFib, WW8PLCFpcd* pPLCFpcd, WW8_CP nStartCp, bool bVer67P) - : WW8PLCFx(eVersion, false), nClipStart(-1) + : WW8PLCFx(rFib, false), nClipStart(-1) { // construct own iterator pPcdI = new WW8PLCFpcd_Iter(*pPLCFpcd, nStartCp); @@ -1564,9 +1581,9 @@ WW8ScannerBase::WW8ScannerBase( SvStream* pSt, SvStream* pTableSt, if( m_pPiecePLCF ) { m_pPieceIter = new WW8PLCFpcd_Iter( *m_pPiecePLCF ); - m_pPLCFx_PCD = new WW8PLCFx_PCD(pWwFib->GetFIBVersion(), m_pPiecePLCF, 0, + m_pPLCFx_PCD = new WW8PLCFx_PCD(*pWwFib, m_pPiecePLCF, 0, IsSevenMinus(m_pWw8Fib->GetFIBVersion())); - m_pPLCFx_PCDAttrs = new WW8PLCFx_PCDAttrs(pWwFib->GetFIBVersion(), + m_pPLCFx_PCDAttrs = new WW8PLCFx_PCDAttrs(*pWwFib, m_pPLCFx_PCD, this); } else @@ -1583,15 +1600,15 @@ WW8ScannerBase::WW8ScannerBase( SvStream* pSt, SvStream* pTableSt, m_pSepPLCF = new WW8PLCFx_SEPX( pSt, pTableSt, *pWwFib, 0 ); // SEPX // Footnotes - m_pFootnotePLCF = new WW8PLCFx_SubDoc( pTableSt, pWwFib->GetFIBVersion(), 0, + m_pFootnotePLCF = new WW8PLCFx_SubDoc( pTableSt, *pWwFib, 0, pWwFib->m_fcPlcffndRef, pWwFib->m_lcbPlcffndRef, pWwFib->m_fcPlcffndText, pWwFib->m_lcbPlcffndText, 2 ); // Endnotes - m_pEdnPLCF = new WW8PLCFx_SubDoc( pTableSt, pWwFib->GetFIBVersion(), 0, + m_pEdnPLCF = new WW8PLCFx_SubDoc( pTableSt, *pWwFib, 0, pWwFib->m_fcPlcfendRef, pWwFib->m_lcbPlcfendRef, pWwFib->m_fcPlcfendText, pWwFib->m_lcbPlcfendText, 2 ); // Comments - m_pAndPLCF = new WW8PLCFx_SubDoc( pTableSt, pWwFib->GetFIBVersion(), 0, + m_pAndPLCF = new WW8PLCFx_SubDoc( pTableSt, *pWwFib, 0, pWwFib->m_fcPlcfandRef, pWwFib->m_lcbPlcfandRef, pWwFib->m_fcPlcfandText, pWwFib->m_lcbPlcfandText, IsSevenMinus(pWwFib->GetFIBVersion()) ? 20 : 30); @@ -2396,14 +2413,16 @@ void WW8PLCFx_Fc_FKP::WW8Fkp::FillEntry(WW8PLCFx_Fc_FKP::WW8Fkp::Entry &rEntry, rEntry.mpData = maRawData + nDataOffset; } -WW8PLCFx_Fc_FKP::WW8Fkp::WW8Fkp(ww::WordVersion eVersion, SvStream* pSt, +WW8PLCFx_Fc_FKP::WW8Fkp::WW8Fkp(const WW8Fib& rFib, SvStream* pSt, SvStream* pDataSt, long _nFilePos, long nItemSiz, ePLCFT ePl, WW8_FC nStartFc) - : nItemSize(nItemSiz), nFilePos(_nFilePos), mnIdx(0), ePLCF(ePl), - maSprmParser(eVersion) + : nItemSize(nItemSiz), nFilePos(_nFilePos), mnIdx(0), ePLCF(ePl) + , maSprmParser(rFib) { memset(maRawData, 0, 512); + const ww::WordVersion eVersion = rFib.GetFIBVersion(); + sal_uInt64 const nOldPos = pSt->Tell(); bool bCouldSeek = checkSeek(*pSt, nFilePos); @@ -2580,7 +2599,6 @@ WW8PLCFx_Fc_FKP::WW8Fkp::WW8Fkp(ww::WordVersion eVersion, SvStream* pSt, { sal_Int32 nLen; sal_uInt8* pSprms = GetLenAndIStdAndSprms( nLen ); - WW8SprmIter aIter(pSprms, nLen, maSprmParser); while (aIter.GetSprms()) { @@ -2750,6 +2768,11 @@ void WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm(sal_uInt16 nId, }; } +ww::WordVersion WW8PLCFx::GetFIBVersion() const +{ + return mrFib.GetFIBVersion(); +} + void WW8PLCFx::GetSprms( WW8PLCFxDesc* p ) { OSL_ENSURE( false, "Called wrong GetSprms" ); @@ -2850,7 +2873,7 @@ bool WW8PLCFx_Fc_FKP::NewFkp() } else { - pFkp = new WW8Fkp(GetFIBVersion(), pFKPStrm, pDataStrm, nPo, + pFkp = new WW8Fkp(GetFIB(), pFKPStrm, pDataStrm, nPo, pFkpSizeTab[ ePLCF ], ePLCF, GetStartFc()); maFkpCache.push_back(pFkp); @@ -2868,8 +2891,8 @@ bool WW8PLCFx_Fc_FKP::NewFkp() WW8PLCFx_Fc_FKP::WW8PLCFx_Fc_FKP(SvStream* pSt, SvStream* pTableSt, SvStream* pDataSt, const WW8Fib& rFib, ePLCFT ePl, WW8_FC nStartFcL) - : WW8PLCFx(rFib.GetFIBVersion(), true), pFKPStrm(pSt), pDataStrm(pDataSt), - pFkp(nullptr), ePLCF(ePl), pPCDAttrs(nullptr) + : WW8PLCFx(rFib, true), pFKPStrm(pSt), pDataStrm(pDataSt) + , pFkp(nullptr), ePLCF(ePl), pPCDAttrs(nullptr) { SetStartFc(nStartFcL); long nLenStruct = (8 > rFib.m_nVersion) ? 2 : 4; @@ -3087,7 +3110,7 @@ WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTableSt, { ResetAttrStartEnd(); - pPcd = rSBase.m_pPiecePLCF ? new WW8PLCFx_PCD(GetFIBVersion(), + pPcd = rSBase.m_pPiecePLCF ? new WW8PLCFx_PCD(GetFIB(), rBase.m_pPiecePLCF, 0, IsSevenMinus(GetFIBVersion())) : nullptr; /* @@ -3099,7 +3122,7 @@ WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTableSt, if (pPcd) { pPCDAttrs = rSBase.m_pPLCFx_PCDAttrs ? new WW8PLCFx_PCDAttrs( - rSBase.m_pWw8Fib->GetFIBVersion(), pPcd, &rSBase) : nullptr; + *rSBase.m_pWw8Fib, pPcd, &rSBase) : nullptr; } pPieceIter = rSBase.m_pPieceIter; @@ -3357,7 +3380,7 @@ void WW8PLCFx_Cp_FKP::advance() WW8PLCFx_SEPX::WW8PLCFx_SEPX(SvStream* pSt, SvStream* pTableSt, const WW8Fib& rFib, WW8_CP nStartCp) - : WW8PLCFx(rFib.GetFIBVersion(), true), maSprmParser(rFib.GetFIBVersion()), + : WW8PLCFx(rFib, true), maSprmParser(rFib), pStrm(pSt), nArrMax(256), nSprmSiz(0) { pPLCF = rFib.m_lcbPlcfsed @@ -3538,10 +3561,10 @@ const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const return nullptr; // Sprm not found } -WW8PLCFx_SubDoc::WW8PLCFx_SubDoc(SvStream* pSt, ww::WordVersion eVersion, +WW8PLCFx_SubDoc::WW8PLCFx_SubDoc(SvStream* pSt, const WW8Fib& rFib, WW8_CP nStartCp, long nFcRef, long nLenRef, long nFcText, long nLenText, long nStruct) - : WW8PLCFx(eVersion, true), pRef(nullptr), pText(nullptr) + : WW8PLCFx(rFib, true), pRef(nullptr), pText(nullptr) { if( nLenRef && nLenText ) { @@ -3632,7 +3655,7 @@ void WW8PLCFx_SubDoc::advance() // fields WW8PLCFx_FLD::WW8PLCFx_FLD( SvStream* pSt, const WW8Fib& rMyFib, short nType) - : WW8PLCFx(rMyFib.GetFIBVersion(), true), pPLCF(nullptr), rFib(rMyFib) + : WW8PLCFx(rMyFib, true), pPLCF(nullptr), rFib(rMyFib) { long nFc, nLen; @@ -3927,7 +3950,7 @@ void WW8ReadSTTBF(bool bVer8, SvStream& rStrm, sal_uInt32 nStart, sal_Int32 nLen } WW8PLCFx_Book::WW8PLCFx_Book(SvStream* pTableSt, const WW8Fib& rFib) - : WW8PLCFx(rFib.GetFIBVersion(), false), nIsEnd(0), nBookmarkId(1) + : WW8PLCFx(rFib, false), nIsEnd(0), nBookmarkId(1) { if( !rFib.m_fcPlcfbkf || !rFib.m_lcbPlcfbkf || !rFib.m_fcPlcfbkl || !rFib.m_lcbPlcfbkl || !rFib.m_fcSttbfbkmk || !rFib.m_lcbSttbfbkmk ) @@ -4190,7 +4213,7 @@ const OUString* WW8PLCFx_Book::GetName() const } WW8PLCFx_AtnBook::WW8PLCFx_AtnBook(SvStream* pTableSt, const WW8Fib& rFib) - : WW8PLCFx(rFib.GetFIBVersion(), /*bSprm=*/false), + : WW8PLCFx(rFib, /*bSprm=*/false), m_bIsEnd(false) { if (!rFib.m_fcPlcfAtnbkf || !rFib.m_lcbPlcfAtnbkf || !rFib.m_fcPlcfAtnbkl || !rFib.m_lcbPlcfAtnbkl) @@ -4322,7 +4345,7 @@ bool WW8PLCFx_AtnBook::getIsEnd() const } WW8PLCFx_FactoidBook::WW8PLCFx_FactoidBook(SvStream* pTableSt, const WW8Fib& rFib) - : WW8PLCFx(rFib.GetFIBVersion(), /*bSprm=*/false), + : WW8PLCFx(rFib, /*bSprm=*/false), m_bIsEnd(false) { if (!rFib.m_fcPlcfBkfFactoid || !rFib.m_lcbPlcfBkfFactoid || !rFib.m_fcPlcfBklFactoid || !rFib.m_lcbPlcfBklFactoid) @@ -4581,7 +4604,7 @@ sal_uInt16 WW8PLCFMan::GetId(const WW8PLCFxDesc* p) const WW8PLCFMan::WW8PLCFMan(WW8ScannerBase* pBase, ManTypes nType, long nStartCp, bool bDoingDrawTextBox) - : maSprmParser(pBase->m_pWw8Fib->GetFIBVersion()), + : maSprmParser(*pBase->m_pWw8Fib), mbDoingDrawTextBox(bDoingDrawTextBox) { pWwFib = pBase->m_pWw8Fib; diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx index 5241578da95e..e538df65db20 100644 --- a/sw/source/filter/ww8/ww8scan.hxx +++ b/sw/source/filter/ww8/ww8scan.hxx @@ -72,12 +72,15 @@ struct SprmInfoRow { class wwSprmSearcher { public: - wwSprmSearcher(SprmInfoRow const * rows, std::size_t size) { + //see Read_AmbiguousSPRM for the bPatchCJK oddity + wwSprmSearcher(SprmInfoRow const * rows, std::size_t size, bool bPatchCJK = false) { for (std::size_t i = 0; i != size; ++i) { bool ins = map_.insert(Map::value_type(rows[i].nId, rows[i].info)) .second; assert(ins); (void) ins; } + if (bPatchCJK) + patchCJKVariant(); } SprmInfo const * search(sal_uInt16 id) const { @@ -89,8 +92,12 @@ private: typedef std::unordered_map<sal_uInt16, SprmInfo> Map; Map map_; + + void patchCJKVariant(); }; +class WW8Fib; + /** wwSprmParser knows how to take a sequence of bytes and split it up into sprms and their arguments @@ -102,18 +109,18 @@ private: sal_uInt8 mnDelta; const wwSprmSearcher *mpKnownSprms; static const wwSprmSearcher* GetWW8SprmSearcher(); - static const wwSprmSearcher* GetWW6SprmSearcher(); + static const wwSprmSearcher* GetWW6SprmSearcher(const WW8Fib& rFib); static const wwSprmSearcher* GetWW2SprmSearcher(); SprmInfo GetSprmInfo(sal_uInt16 nId) const; sal_uInt8 SprmDataOfs(sal_uInt16 nId) const; +public: enum SprmType {L_FIX=0, L_VAR=1, L_VAR2=2}; -public: //7- ids are very different to 8+ ones - explicit wwSprmParser(ww::WordVersion eVersion); + explicit wwSprmParser(const WW8Fib& rFib); /// Return the SPRM id at the beginning of this byte sequence sal_uInt16 GetSprmId(const sal_uInt8* pSp) const; @@ -156,7 +163,6 @@ OUString read_uInt16_BeltAndBracesString(SvStream& rStrm); //--Line above which the code has meaningful comments -class WW8Fib; class WW8ScannerBase; class WW8PLCFspecial; struct WW8PLCFxDesc; @@ -378,7 +384,7 @@ enum eExtSprm { eFTN = 256, eEDN = 257, eFLD = 258, eBKN = 259, eAND = 260, eATN class WW8PLCFx // virtual iterator for Piece Table Exceptions { private: - ww::WordVersion meVer; // Version number of FIB + const WW8Fib& mrFib; bool bIsSprm; // PLCF of Sprms or other stuff ( Footnote, ... ) WW8_FC nStartFc; bool bDirty; @@ -387,8 +393,8 @@ private: WW8PLCFx& operator=(const WW8PLCFx&) = delete; public: - WW8PLCFx(ww::WordVersion eVersion, bool bSprm) - : meVer(eVersion) + WW8PLCFx(const WW8Fib& rFib, bool bSprm) + : mrFib(rFib) , bIsSprm(bSprm) , nStartFc(-1) , bDirty(false) @@ -408,7 +414,8 @@ public: virtual sal_uInt16 GetIstd() const { return 0xffff; } virtual void Save( WW8PLCFxSave1& rSave ) const; virtual void Restore( const WW8PLCFxSave1& rSave ); - ww::WordVersion GetFIBVersion() const { return meVer; } + ww::WordVersion GetFIBVersion() const; + const WW8Fib& GetFIB() const { return mrFib; } void SetStartFc( WW8_FC nFc ) { nStartFc = nFc; } WW8_FC GetStartFc() const { return nStartFc; } void SetDirty(bool bIn) {bDirty=bIn;} @@ -429,7 +436,7 @@ private: WW8PLCFx_PCDAttrs& operator=(const WW8PLCFx_PCDAttrs&) = delete; public: - WW8PLCFx_PCDAttrs(ww::WordVersion eVersion, WW8PLCFx_PCD* pPLCFx_PCD, + WW8PLCFx_PCDAttrs(const WW8Fib& rFib, WW8PLCFx_PCD* pPLCFx_PCD, const WW8ScannerBase* pBase ); virtual sal_uInt32 GetIdx() const override; virtual void SetIdx( sal_uLong nI ) override; @@ -452,7 +459,7 @@ private: WW8PLCFx_PCD& operator=(const WW8PLCFx_PCD&) = delete; public: - WW8PLCFx_PCD(ww::WordVersion eVersion, WW8PLCFpcd* pPLCFpcd, + WW8PLCFx_PCD(const WW8Fib& rFib, WW8PLCFpcd* pPLCFpcd, WW8_CP nStartCp, bool bVer67P); virtual ~WW8PLCFx_PCD() override; sal_uLong GetIMax() const; @@ -522,7 +529,7 @@ public: void FillEntry(Entry &rEntry, std::size_t nDataOffset, sal_uInt16 nLen); public: - WW8Fkp (ww::WordVersion eVersion, SvStream* pFKPStrm, + WW8Fkp (const WW8Fib& rFib, SvStream* pFKPStrm, SvStream* pDataStrm, long _nFilePos, long nItemSiz, ePLCFT ePl, WW8_FC nStartFc); void Reset(WW8_FC nPos); @@ -678,7 +685,7 @@ private: WW8PLCFx_SubDoc& operator=(const WW8PLCFx_SubDoc&) = delete; public: - WW8PLCFx_SubDoc(SvStream* pSt, ww::WordVersion eVersion, WW8_CP nStartCp, + WW8PLCFx_SubDoc(SvStream* pSt, const WW8Fib& rFib, WW8_CP nStartCp, long nFcRef, long nLenRef, long nFcText, long nLenText, long nStruc); virtual ~WW8PLCFx_SubDoc() override; virtual sal_uInt32 GetIdx() const override; @@ -1002,7 +1009,7 @@ struct WW8PLCFxSaveAll class WW8ScannerBase { -friend WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs(ww::WordVersion eVersion, +friend WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs(const WW8Fib& rFib, WW8PLCFx_PCD* pPLCFx_PCD, const WW8ScannerBase* pBase ); friend WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream*, SvStream*, SvStream*, const WW8ScannerBase&, ePLCFT ); @@ -1504,13 +1511,10 @@ public: they couldn't read any format with nFib > some constant */ sal_uInt16 m_nFib_actual; // 0x05bc #i56856# - /* - now we only need a Ctor - */ - WW8Fib( SvStream& rStrm, sal_uInt8 nWantedVersion,sal_uInt32 nOffset=0 ); - /* unfortunately incorrect, you still need one for the export */ - WW8Fib( sal_uInt8 nVersion = 6, bool bDot = false ); + WW8Fib(SvStream& rStrm, sal_uInt8 nWantedVersion,sal_uInt32 nOffset=0); + explicit WW8Fib(sal_uInt8 nVersion = 6, bool bDot = false); + void WriteHeader(SvStream& rStrm); void Write(SvStream& rStrm); static rtl_TextEncoding GetFIBCharset(sal_uInt16 chs, sal_uInt16 nLidLocale); |