1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_SW_SOURCE_FILTER_WW8_WW8PAR_HXX
21 #define INCLUDED_SW_SOURCE_FILTER_WW8_WW8PAR_HXX
22 
23 #include <rtl/ustring.hxx>
24 #include <filter/msfilter/msdffimp.hxx>
25 #include <filter/msfilter/util.hxx>
26 #include <editeng/frmdir.hxx>
27 #include <fltshell.hxx>
28 
29 #include <svx/svdobj.hxx>
30 
31 #include <vector>
32 #include <stack>
33 #include <deque>
34 #include <map>
35 #include <utility>
36 #include <memory>
37 
38 #include "ww8struc.hxx"
39 #include "ww8scan.hxx"
40 #include "ww8glsy.hxx"
41 #include "ww8graf.hxx"
42 #include "wrtww8.hxx"
43 #include <msfilter.hxx>
44 #include <xmloff/odffields.hxx>
45 #include <IMark.hxx>
46 
47 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
48 #include <swtypes.hxx>
49 #include <fmtfsize.hxx>
50 #include <fmtornt.hxx>
51 #include <fmtsrnd.hxx>
52 #include <ndtxt.hxx>
53 #include <editeng/lrspitem.hxx>
54 #include <o3tl/deleter.hxx>
55 #include <oox/ole/olehelper.hxx>
56 
57 #define SW_UD_IMAPDATA      2
58 
59 class SwDoc;
60 class SwPaM;
61 class SfxPoolItem;
62 class SwTextFormatColl;
63 class SwPageDesc;
64 class SvxBoxItem;
65 class SwFormat;
66 class SwNodeIndex;
67 class SwFlyFrameFormat;
68 class SwAttrSet;
69 class SwNumRule;
70 class SwFrameFormat;
71 class Writer;
72 class SwFormatField;
73 class WW8Fib;
74 class WW8PLCFMan;
75 struct WW8PLCFManResult;
76 class WW8RStyle;
77 class WW8PLCF_HdFt;
78 class WW8ScannerBase;
79 struct WW8FlyPara;
80 struct WW8SwFlyPara;
81 struct WW8_PIC;
82 class WW8TabDesc;
83 struct WW8_SHD;
84 struct WW8_OLST;
85 class SwNumFormat;
86 struct WW8_ANLD;
87 struct WW8_ANLV;
88 struct WW8_DO;
89 struct WW8_DPHEAD;
90 struct WW8_FSPA;
91 class SdrModel;
92 class SdrPage;
93 class SdrObject;
94 class SdrTextObj;
95 class SdrUnoObj;
96 class Size;
97 class EditEngine;
98 struct SwPosition;
99 class WW8ReaderSave;
100 struct WW8PicDesc;
101 class Graphic;
102 class SwFieldType;
103 class SotStorage;
104 class SwAttrSet;
105 class GDIMetaFile;
106 struct ESelection;
107 class SfxItemSet;
108 class OutlinerParaObject;
109 
110 namespace com{namespace sun {namespace star{
111     namespace beans{ class XPropertySet;}
112     namespace form { class XFormComponent;}
113     namespace drawing{class XShape;}
114     namespace lang{class XMultiServiceFactory;}
115 }}}
116 
117 // defines only for the WW8-variable of the INI file
118 #define WW8FL_NO_STYLES      2
119 #define WW8FL_NO_GRAF     0x80
120 
121 #define WW8FL_NO_OUTLINE         0x1000
122 #define WW8FL_NO_IMPLPASP        0x4000  // no implicit para space
123 #define WW8FL_NO_GRAFLAYER       0x8000
124 
125 // Add-on-filter-flags, valid from Winword 8 on
126 #define WW8FL_NO_FLY_FOR_TXBX         1
127 
128 //            List-Manager (from Ver8 on)
129 
130 struct WW8LFOInfo;
131 
132 class WW8Reader : public StgReader
133 {
134     virtual ErrCode Read(SwDoc &, const OUString& rBaseURL, SwPaM &, const OUString &) override;
135     ErrCode OpenMainStream( tools::SvRef<SotStorageStream>& rRef, sal_uInt16& rBuffSize );
136 public:
137     virtual SwReaderType GetReaderType() override;
138 
139     virtual bool HasGlossaries() const override;
140     virtual bool ReadGlossaries( SwTextBlocks&, bool bSaveRelFiles ) const override;
141 };
142 
143 class SwWW8ImplReader;
144 struct WW8LSTInfo;
145 class WW8ListManager
146 {
147 public:
148     WW8ListManager(SvStream& rSt_, SwWW8ImplReader& rReader_);
149     //Min and Max possible List Levels in Word
150     enum ListLevel {nMinLevel=1, nMaxLevel=9};
151     //the rParaSprms returns back the original word paragraph indent
152     //sprms which were attached to the original numbering format
153     SwNumRule* GetNumRuleForActivation(sal_uInt16 nLFOPosition, const sal_uInt8 nLevel,
154         std::vector<sal_uInt8> &rParaSprms, SwTextNode *pNode=nullptr);
155     SwNumRule* CreateNextRule(bool bSimple);
156     ~WW8ListManager() COVERITY_NOEXCEPT_FALSE;
157     SwNumRule* GetNumRule(size_t i);
GetWW8LSTInfoNum() const158     size_t GetWW8LSTInfoNum() const{return maLSTInfos.size();}
159 private:
160     wwSprmParser const maSprmParser;
161     SwWW8ImplReader& rReader;
162     SwDoc&           rDoc;
163     const WW8Fib&    rFib;
164     SvStream&        rSt;
165     std::vector<std::unique_ptr<WW8LSTInfo>> maLSTInfos;
166     std::vector<std::unique_ptr<WW8LFOInfo>> m_LFOInfos;// D. from PLF LFO, sorted exactly like in the WW8 Stream
167     sal_uInt16       nUniqueList; // current number for creating unique list names
168     SprmResult GrpprlHasSprm(sal_uInt16 nId, sal_uInt8& rSprms, sal_uInt8 nLen);
169     WW8LSTInfo* GetLSTByListId(    sal_uInt32  nIdLst     ) const;
170     //the rParaSprms returns back the original word paragraph indent
171     //sprms which are attached to this numbering level
172     bool ReadLVL(SwNumFormat& rNumFormat, std::unique_ptr<SfxItemSet>& rpItemSet, sal_uInt16 nLevelStyle,
173         bool bSetStartNo, std::deque<bool> &rNotReallyThere, sal_uInt16 nLevel,
174         ww::bytes &rParaSprms);
175 
176     // character attributes from GrpprlChpx
177     typedef std::unique_ptr<SfxItemSet> WW8aISet[nMaxLevel];
178     // character style pointer
179     typedef SwCharFormat* WW8aCFormat[nMaxLevel];
180 
181     void AdjustLVL(sal_uInt8 nLevel, SwNumRule& rNumRule, WW8aISet const & rListItemSet,
182         WW8aCFormat& aCharFormat, bool& bNewCharFormatCreated,
183         const OUString& aPrefix = OUString());
184 
185     WW8ListManager(const WW8ListManager&) = delete;
186     WW8ListManager& operator=(const WW8ListManager&) = delete;
187     sal_uInt16 nLastLFOPosition;
188 };
189 
190 struct WW8FlyPara
191 {                       // WinWord-attributes
192                         // Attention: *DO NOT* reorder, since parts will be
193                         // compared using memcmp
194     bool bVer67;
195     sal_Int16 nSp26, nSp27;         // raw position
196     sal_Int16 nSp45, nSp28;         // width / height
197     sal_Int16 nLeMgn, nRiMgn, nUpMgn, nLoMgn;           // borders
198     sal_uInt8 nSp29;                 // raw binding + alignment
199     sal_uInt8 nSp37;                 // Wrap-Mode ( 1 / 2; 0 = no Apo ? )
200     WW8_BRCVer9_5 brc;          // borders Top, Left, Bottom, Right, Between
201     bool bBorderLines;          // border lines
202     bool bGrafApo;              // true: this frame is only used to position
203                                 // the contained graphics *not* as a character
204     bool mbVertSet;             // true if vertical positioning has been set
205 
206     WW8FlyPara(bool bIsVer67, const WW8FlyPara* pSrc = nullptr);
207     bool operator==(const WW8FlyPara& rSrc) const;
208     void Read(sal_uInt8 nSprm29, WW8PLCFx_Cp_FKP* pPap);
209     void ReadFull(sal_uInt8 nSprm29, SwWW8ImplReader* pIo);
210     void Read(sal_uInt8 nSprm29, WW8RStyle const * pStyle);
211     void ApplyTabPos(const WW8_TablePos *pTabPos);
212     bool IsEmpty() const;
213 };
214 
215 class SwWW8StyInf
216 {
217     OUString        m_sWWStyleName;
218     sal_uInt16      m_nWWStyleId;
219 public:
220     rtl_TextEncoding m_eLTRFontSrcCharSet;    // rtl_TextEncoding for the font
221     rtl_TextEncoding m_eRTLFontSrcCharSet;    // rtl_TextEncoding for the font
222     rtl_TextEncoding m_eCJKFontSrcCharSet;    // rtl_TextEncoding for the font
223     SwFormat*      m_pFormat;
224     std::shared_ptr<WW8FlyPara> m_xWWFly;
225     SwNumRule*  m_pOutlineNumrule;
226     long        m_nFilePos;
227     sal_uInt16      m_nBase;
228     sal_uInt16      m_nFollow;
229     sal_uInt16      m_nLFOIndex;
230     sal_uInt8        m_nListLevel;
231 
232     // WW8 outline level is zero-based:
233     // 0: outline level 1
234     // 1: outline level 2
235     // ...
236     // 8: outline level 9
237     // 9: body text
238     sal_uInt8 mnWW8OutlineLevel;
239 
240     sal_uInt16  m_n81Flags;           // for bold, italic, ...
241     sal_uInt16  m_n81BiDiFlags;       // for bold, italic, ...
242     std::shared_ptr<SvxLRSpaceItem> maWordLR;
243     bool m_bValid;            // empty of valid
244     bool m_bImported;         // for recursive imports
245     bool m_bColl;             // true-> pFormat is SwTextFormatColl
246     bool m_bImportSkipped;    // only true if !bNewDoc && existing style
247     bool m_bHasStyNumRule;    // true-> named NumRule in style
248     bool m_bHasBrokenWW6List; // true-> WW8+ style has a WW7- list
249     bool m_bListReleventIndentSet; //true if this style's indent has
250                                  //been explicitly set, it's set to the value
251                                  //of pFormat->GetItemState(RES_LR_SPACE, false)
252                                  //if it was possible to get the ItemState
253                                  //for L of the LR space independently
254     bool m_bParaAutoBefore;   // For Auto spacing before a paragraph
255     bool m_bParaAutoAfter;    // For Auto Spacing after a paragraph
256     sal_Int16 m_nRelativeJustify;
257 
SwWW8StyInf()258     SwWW8StyInf() :
259         m_sWWStyleName( OUString() ),
260         m_nWWStyleId( 0 ),
261         m_eLTRFontSrcCharSet(0),
262         m_eRTLFontSrcCharSet(0),
263         m_eCJKFontSrcCharSet(0),
264         m_pFormat( nullptr ),
265         m_pOutlineNumrule( nullptr ),
266         m_nFilePos( 0 ),
267         m_nBase( 0 ),
268         m_nFollow( 0 ),
269         m_nLFOIndex( USHRT_MAX ),
270         m_nListLevel(WW8ListManager::nMaxLevel),
271         mnWW8OutlineLevel( MAXLEVEL ),
272         m_n81Flags( 0 ),
273         m_n81BiDiFlags(0),
274         maWordLR(std::make_shared<SvxLRSpaceItem>(RES_LR_SPACE)),
275         m_bValid(false),
276         m_bImported(false),
277         m_bColl(false),
278         m_bImportSkipped(false),
279         m_bHasStyNumRule(false),
280         m_bHasBrokenWW6List(false),
281         m_bListReleventIndentSet(false),
282         m_bParaAutoBefore(false),
283         m_bParaAutoAfter(false),
284         m_nRelativeJustify(-1)
285 
286     {}
287 
SetOrgWWIdent(const OUString & rName,const sal_uInt16 nId)288     void SetOrgWWIdent( const OUString& rName, const sal_uInt16 nId )
289     {
290         m_sWWStyleName = rName;
291         m_nWWStyleId = nId;
292 
293         // apply default WW8 outline level to WW8 Built-in Heading styles
294         if (IsWW8BuiltInHeadingStyle())
295         {
296             mnWW8OutlineLevel = m_nWWStyleId - 1;
297         }
298     }
299 
GetOrgWWName() const300     const OUString& GetOrgWWName() const
301     {
302         return m_sWWStyleName;
303     }
304 
HasWW8OutlineLevel() const305     bool HasWW8OutlineLevel() const
306     {
307         return (m_pFormat != nullptr && (MAXLEVEL > mnWW8OutlineLevel));
308     }
309 
IsOutlineNumbered() const310     bool IsOutlineNumbered() const
311     {
312         return m_pOutlineNumrule && HasWW8OutlineLevel();
313     }
314 
GetOutlineNumrule() const315     const SwNumRule* GetOutlineNumrule() const
316     {
317         return m_pOutlineNumrule;
318     }
319     rtl_TextEncoding GetCharSet() const;
320     rtl_TextEncoding GetCJKCharSet() const;
321 
GetWWStyleId() const322     sal_uInt16 GetWWStyleId() const
323     {
324         return m_nWWStyleId;
325     }
326 
IsWW8BuiltInHeadingStyle() const327     bool IsWW8BuiltInHeadingStyle() const
328     {
329         return GetWWStyleId() >= 1 && GetWWStyleId() <= 9;
330     }
331 
IsWW8BuiltInDefaultStyle() const332     bool IsWW8BuiltInDefaultStyle() const
333     {
334         return GetWWStyleId() == 0;
335     }
336 
337     static sal_uInt8
WW8OutlineLevelToOutlinelevel(const sal_uInt8 nWW8OutlineLevel)338     WW8OutlineLevelToOutlinelevel(const sal_uInt8 nWW8OutlineLevel)
339     {
340         if (nWW8OutlineLevel < MAXLEVEL)
341         {
342             if (nWW8OutlineLevel == 9)
343             {
344                 return 0; // no outline level --> body text
345             }
346             else
347             {
348                 return nWW8OutlineLevel + 1; // outline level 1..9
349             }
350         }
351 
352         return 0;
353     }
354 };
355 
356 //            Stack
357 
358 class SwWW8FltControlStack : public SwFltControlStack
359 {
360 private:
361     SwWW8ImplReader& rReader;
362     std::unique_ptr<SfxItemSet> m_xScratchSet;
363     sal_uInt16 nToggleAttrFlags;
364     sal_uInt16 nToggleBiDiAttrFlags;
365     SwWW8FltControlStack(const SwWW8FltControlStack&) = delete;
366     SwWW8FltControlStack& operator=(const SwWW8FltControlStack&) = delete;
367     const SwNumFormat* GetNumFormatFromStack(const SwPosition &rPos,
368         const SwTextNode &rTextNode);
369 protected:
370     virtual void SetAttrInDoc(const SwPosition& rTmpPos,
371         SwFltStackEntry& rEntry) override;
372 
373     virtual sal_Int32 GetCurrAttrCP() const override;
374     virtual bool IsParaEndInCPs(sal_Int32 nStart, sal_Int32 nEnd, bool bSdOD) const override;
375     //Clear the para end position recorded in reader intermittently for the least impact on loading performance
376     virtual void ClearParaEndPosition() override;
377     virtual bool CheckSdOD(sal_Int32 nStart,sal_Int32 nEnd) override;
378 
379 public:
SwWW8FltControlStack(SwDoc * pDo,sal_uLong nFieldFl,SwWW8ImplReader & rReader_)380     SwWW8FltControlStack(SwDoc* pDo, sal_uLong nFieldFl, SwWW8ImplReader& rReader_ )
381         : SwFltControlStack( pDo, nFieldFl ), rReader( rReader_ ),
382         nToggleAttrFlags(0), nToggleBiDiAttrFlags(0)
383     {}
384 
385     void NewAttr(const SwPosition& rPos, const SfxPoolItem& rAttr);
386 
387     virtual SwFltStackEntry* SetAttr(const SwPosition& rPos, sal_uInt16 nAttrId, bool bTstEnde=true, long nHand=LONG_MAX, bool consumedByField=false) override;
388 
SetToggleAttr(sal_uInt8 nId,bool bOn)389     void SetToggleAttr(sal_uInt8 nId, bool bOn)
390     {
391         if( bOn )
392             nToggleAttrFlags |= (1 << nId);
393         else
394             nToggleAttrFlags &= ~(1 << nId);
395     }
396 
GetToggleAttrFlags() const397     sal_uInt16 GetToggleAttrFlags() const { return nToggleAttrFlags; }
398 
SetToggleBiDiAttr(sal_uInt8 nId,bool bOn)399     void SetToggleBiDiAttr(sal_uInt8 nId, bool bOn)
400     {
401         if( bOn )
402             nToggleBiDiAttrFlags |= (1 << nId);
403         else
404             nToggleBiDiAttrFlags &= ~(1 << nId);
405     }
406 
GetToggleBiDiAttrFlags() const407     sal_uInt16 GetToggleBiDiAttrFlags() const { return nToggleBiDiAttrFlags; }
SetToggleAttrFlags(sal_uInt16 nFlags)408     void SetToggleAttrFlags(sal_uInt16 nFlags) { nToggleAttrFlags = nFlags; }
SetToggleBiDiAttrFlags(sal_uInt16 nFlags)409     void SetToggleBiDiAttrFlags(sal_uInt16 nFlags) {nToggleBiDiAttrFlags = nFlags;}
410 
411     const SfxPoolItem* GetFormatAttr(const SwPosition& rPos, sal_uInt16 nWhich);
GetFormatAttr(const SwPosition & rPos,TypedWhichId<T> nWhich)412     template<class T> const T* GetFormatAttr( const SwPosition& rPos, TypedWhichId<T> nWhich )
413     {
414         return static_cast<const T*>(GetFormatAttr(rPos, sal_uInt16(nWhich)));
415     }
416     const SfxPoolItem* GetStackAttr(const SwPosition& rPos, sal_uInt16 nWhich);
417 };
418 
419 //The only thing this is for is RES_FLTR_ANCHOR, anything else is an error.
420 //For graphics whose anchoring position would otherwise be automatically moved
421 //along by the insertion of text.
422 class SwWW8FltAnchorStack : public SwFltControlStack
423 {
424 public:
SwWW8FltAnchorStack(SwDoc * pDo,sal_uLong nFieldFl)425     SwWW8FltAnchorStack(SwDoc* pDo, sal_uLong nFieldFl)
426         : SwFltControlStack( pDo, nFieldFl ) {}
427     void AddAnchor(const SwPosition& rPos,SwFrameFormat *pFormat);
428     void Flush();
429 private:
430     SwWW8FltAnchorStack(const SwWW8FltAnchorStack&) = delete;
431     SwWW8FltAnchorStack& operator=(const SwWW8FltAnchorStack&) = delete;
432 };
433 
434 
435 namespace SwWW8
436 {
437     struct ltstr
438     {
operator ()SwWW8::ltstr439         bool operator()(const OUString &r1, const OUString &r2) const
440         {
441             return r1.compareToIgnoreAsciiCase(r2)<0;
442         }
443     };
444 
445     struct ltnode
446     {
operator ()SwWW8::ltnode447         bool operator()(const SwTextNode *r1, const SwTextNode *r2) const
448         {
449             return r1->GetIndex() < r2->GetIndex();
450         }
451     };
452 };
453 
454 class SwWW8ReferencedFltEndStack : public SwFltEndStack
455 {
456 public:
SwWW8ReferencedFltEndStack(SwDoc * pDo,sal_uLong nFieldFl)457     SwWW8ReferencedFltEndStack( SwDoc* pDo, sal_uLong nFieldFl )
458         : SwFltEndStack( pDo, nFieldFl )
459         , aReferencedTOCBookmarks()
460     {}
461 
462     // Keep track of referenced TOC bookmarks in order to suppress the import
463     // of unreferenced ones.
464     std::set<OUString, SwWW8::ltstr> aReferencedTOCBookmarks;
465 protected:
466     virtual void SetAttrInDoc( const SwPosition& rTmpPos,
467                                SwFltStackEntry& rEntry ) override;
468 };
469 
470 class SwWW8FltRefStack final : public SwFltEndStack
471 {
472 public:
SwWW8FltRefStack(SwDoc * pDo,sal_uLong nFieldFl)473     SwWW8FltRefStack(SwDoc* pDo, sal_uLong nFieldFl)
474         : SwFltEndStack( pDo, nFieldFl )
475         , aFieldVarNames()
476     {}
477     bool IsFootnoteEdnBkmField(const SwFormatField& rFormatField, sal_uInt16& rBkmNo);
478 
479     //Keep track of variable names created with fields, and the bookmark
480     //mapped to their position, hopefully the same, but very possibly
481     //an additional pseudo bookmark
482     std::map<OUString, OUString, SwWW8::ltstr> aFieldVarNames;
483 private:
484     SwFltStackEntry *RefToVar(const SwField* pField,SwFltStackEntry& rEntry);
485     virtual void SetAttrInDoc(const SwPosition& rTmpPos,
486         SwFltStackEntry& rEntry) override;
487     SwWW8FltRefStack(const SwWW8FltRefStack&) = delete;
488     SwWW8FltRefStack& operator=(const SwWW8FltRefStack&) = delete;
489 };
490 
491 template< typename Type >
get_flag(Type nBitField,Type nMask)492 inline bool get_flag( Type nBitField, Type nMask )
493 { return (nBitField & nMask) != 0; }
494 
495 template< typename ReturnType, typename Type >
ulimit_cast(Type nValue,ReturnType nMax)496 inline ReturnType ulimit_cast( Type nValue, ReturnType nMax )
497 { return static_cast< ReturnType >( std::min< Type >( nValue, nMax ) ); }
498 
499 template< typename ReturnType, typename Type >
ulimit_cast(Type nValue)500 inline ReturnType ulimit_cast( Type nValue )
501 { return ulimit_cast( nValue, std::numeric_limits< ReturnType >::max() ); }
502 
503 class SwMacroInfo : public SdrObjUserData
504 {
505 public:
506     SwMacroInfo();
507     virtual ~SwMacroInfo() override;
508 
509     SwMacroInfo(SwMacroInfo const &) = default;
510     SwMacroInfo(SwMacroInfo &&) = default;
511     SwMacroInfo & operator =(SwMacroInfo const &) = delete; // due to SdrObjUserData
512     SwMacroInfo & operator =(SwMacroInfo &&) = delete; // due to SdrObjUserData
513 
514     virtual std::unique_ptr<SdrObjUserData> Clone( SdrObject* pObj ) const override;
515 
SetHlink(const OUString & rHlink)516     void SetHlink( const OUString& rHlink ) { maHlink = rHlink; }
GetHlink() const517     const OUString& GetHlink() const { return maHlink; }
SetTarFrame(const OUString & rTarFrame)518     void SetTarFrame( const OUString& rTarFrame ) { maTarFrame = rTarFrame; }
GetTarFrame() const519     const OUString& GetTarFrame() const { return maTarFrame; }
SetShapeId(sal_Int32 rShapeId)520     void SetShapeId( sal_Int32 rShapeId ) { mnShapeId = rShapeId; }
GetShapeId() const521     const sal_Int32& GetShapeId() const { return mnShapeId; }
SetName(const OUString & rName)522     void SetName( const OUString& rName ) { maNameStr = rName; }
GetName() const523     const OUString& GetName() const { return maNameStr; }
524 
525 private:
526     sal_Int32 mnShapeId;
527     OUString maHlink;
528     OUString maNameStr;
529     OUString maTarFrame;
530 };
531 
532 struct HyperLinksTable
533 {
534     OUString hLinkAddr;
535     OUString tarFrame;
536 };
537 
538 namespace sw
539 {
540     namespace hack
541     {
542         class Position
543         {
544         private:
545             SwNodeIndex maPtNode;
546             sal_Int32 mnPtContent;
547         public:
548             explicit Position(const SwPosition &rPos);
549             operator SwPosition() const;
GetPtNode() const550             const SwNodeIndex& GetPtNode() const { return maPtNode; };
GetPtContent() const551             sal_Int32 GetPtContent() const { return mnPtContent; };
552         };
553     }
554 
555     auto FilterControlChars(OUString const& rString) -> OUString;
556 }
557 
558 class WW8FieldEntry
559 {
560     private:
561         OUString msBookmarkName;
562         OUString msMarkType;
563         OUString msMarkCode;
564         ::sw::mark::IFieldmark::parameter_map_t maParams;
565 
566     public:
567         sw::hack::Position maStartPos;
568         sal_uInt16 mnFieldId;
569         sal_uLong mnObjLocFc;
570         WW8FieldEntry(SwPosition const &rPos, sal_uInt16 nFieldId) throw();
571         WW8FieldEntry(const WW8FieldEntry &rOther) throw();
572         WW8FieldEntry &operator=(const WW8FieldEntry &rOther) throw();
573         void Swap(WW8FieldEntry &rOther) throw();
574 
GetPtNode() const575         SwNodeIndex GetPtNode() const { return maStartPos.GetPtNode(); };
GetPtContent() const576         sal_Int32 GetPtContent() const { return maStartPos.GetPtContent(); };
577 
GetBookmarkName() const578         const OUString& GetBookmarkName() const { return msBookmarkName;}
GetBookmarkCode() const579         const OUString& GetBookmarkCode() const { return msMarkCode;}
580         void SetBookmarkName(const OUString& bookmarkName);
581         void SetBookmarkType(const OUString& bookmarkType);
582         void SetBookmarkCode(const OUString& bookmarkCode);
getParameters()583         ::sw::mark::IFieldmark::parameter_map_t& getParameters() { return maParams;}
584 };
585 
586 //    mini marker for some flags
587 
588 class WW8ReaderSave
589 {
590 private:
591     WW8PLCFxSaveAll maPLCFxSave;
592     SwPosition const maTmpPos;
593     std::deque<bool> maOldApos;
594     std::deque<WW8FieldEntry> maOldFieldStack;
595     std::unique_ptr<SwWW8FltControlStack> mxOldStck;
596     std::unique_ptr<SwWW8FltAnchorStack> mxOldAnchorStck;
597     std::unique_ptr<sw::util::RedlineStack> mxOldRedlines;
598     std::shared_ptr<WW8PLCFMan> mxOldPlcxMan;
599     std::unique_ptr<WW8FlyPara> mpWFlyPara;
600     std::unique_ptr<WW8SwFlyPara> mpSFlyPara;
601     SwPaM* const mpPreviousNumPaM;
602     const SwNumRule* mpPrevNumRule;
603     std::unique_ptr<WW8TabDesc> mxTableDesc;
604     int const mnInTable;
605     sal_uInt16 const mnCurrentColl;
606     sal_Unicode const mcSymbol;
607     bool const mbIgnoreText;
608     bool const mbSymbol;
609     bool const mbHdFtFootnoteEdn;
610     bool const mbTxbxFlySection;
611     bool const mbAnl;
612     bool const mbInHyperlink;
613     bool const mbPgSecBreak;
614     bool const mbWasParaEnd;
615     bool const mbHasBorder;
616     bool const mbFirstPara;
617 public:
618     WW8ReaderSave(SwWW8ImplReader* pRdr, WW8_CP nStart=-1);
619     void Restore(SwWW8ImplReader* pRdr);
GetStartPos() const620     const SwPosition &GetStartPos() const { return maTmpPos; }
621 };
622 
623 enum class eF_ResT { OK, TEXT, TAGIGN, READ_FSPA };
624 
625 class SwWW8Shade
626 {
627 public:
628     Color aColor;
629     SwWW8Shade(bool bVer67, const WW8_SHD& rSHD);
SwWW8Shade(Color nFore,Color nBack,sal_uInt16 nIndex)630     SwWW8Shade(Color nFore, Color nBack, sal_uInt16 nIndex)
631     {
632         SetShade(nFore, nBack, nIndex);
633     }
634 private:
635     void SetShade(Color nFore, Color nBack, sal_uInt16 nIndex);
636 };
637 
638 //    Formulas
639 
640 enum SwWw8ControlType
641 {
642     WW8_CT_EDIT,
643     WW8_CT_CHECKBOX,
644     WW8_CT_DROPDOWN
645 };
646 
647 class WW8FormulaControl
648 {
649 protected:
650     SwWW8ImplReader &mrRdr;
651 
652     WW8FormulaControl(WW8FormulaControl const&) = delete;
653     WW8FormulaControl& operator=(WW8FormulaControl const&) = delete;
654 
655 public:
WW8FormulaControl(const OUString & rN,SwWW8ImplReader & rRdr)656     WW8FormulaControl(const OUString& rN, SwWW8ImplReader &rRdr)
657         : mrRdr(rRdr), mfUnknown(0), mfDropdownIndex(0),
658         mfToolTip(0), mfNoMark(0), mfType(0),
659         mfUnused(0), mhpsCheckBox(20), mnChecked(0), mnMaxLen(0),
660         mbHelp(false), msName( rN )
661     {
662     }
663     sal_uInt8 mfUnknown:2;
664     sal_uInt8 mfDropdownIndex:6;
665     sal_uInt8 mfToolTip:1;
666     sal_uInt8 mfNoMark:1;
667     sal_uInt8 mfType:3;
668     sal_uInt8 mfUnused:3;
669 
670     sal_uInt16 mhpsCheckBox;
671     sal_uInt16 mnChecked;
672 
673     /// FFData.cch in the spec: maximum length, in characters, of the value of the textbox.
674     sal_uInt16 mnMaxLen;
675     OUString msTitle;
676     OUString msDefault;
677     OUString msFormatting;
678     bool mbHelp;
679     OUString msHelp;
680     OUString msToolTip;
681     OUString msEntryMcr;
682     OUString msExitMcr;
683     std::vector<OUString> maListEntries;
~WW8FormulaControl()684     virtual ~WW8FormulaControl() {}
685     void FormulaRead(SwWw8ControlType nWhich,SvStream *pD);
686     virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> &rServiceFactory,
687         css::uno::Reference< css::form::XFormComponent> &rFComp,
688         css::awt::Size &rSz) = 0;
689     OUString const msName;
690 };
691 
692 class WW8FormulaCheckBox : public WW8FormulaControl
693 {
694 private:
695     WW8FormulaCheckBox(const WW8FormulaCheckBox&) = delete;
696     WW8FormulaCheckBox& operator=(const WW8FormulaCheckBox&) = delete;
697 
698 public:
699     explicit WW8FormulaCheckBox(SwWW8ImplReader &rR);
700 
701     virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> &rServiceFactory,
702         css::uno::Reference< css::form::XFormComponent> &rFComp,
703         css::awt::Size &rSz) override;
704 };
705 
706 class WW8FormulaListBox : public WW8FormulaControl
707 {
708 private:
709     WW8FormulaListBox(const WW8FormulaListBox&) = delete;
710     WW8FormulaListBox& operator=(const WW8FormulaListBox&) = delete;
711 
712 public:
713     explicit WW8FormulaListBox(SwWW8ImplReader &rR);
714 
715     virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> &rServiceFactory,
716         css::uno::Reference< css::form::XFormComponent> &rFComp,
717         css::awt::Size &rSz) override;
718 };
719 
720 class WW8FormulaEditBox : public WW8FormulaControl
721 {
722 private:
723     WW8FormulaEditBox(const WW8FormulaEditBox&) = delete;
724     WW8FormulaEditBox& operator=(const WW8FormulaEditBox&) = delete;
725 public:
726     explicit WW8FormulaEditBox(SwWW8ImplReader &rR);
727     //no real implementation, return false
Import(const css::uno::Reference<css::lang::XMultiServiceFactory> &,css::uno::Reference<css::form::XFormComponent> &,css::awt::Size &)728     virtual bool Import(const css::uno::Reference< css::lang::XMultiServiceFactory> & /* rServiceFactory */,
729         css::uno::Reference< css::form::XFormComponent> & /* rFComp */,
730         css::awt::Size & /* rSz */) override { return false; }
731 };
732 
733 class SwMSConvertControls: public oox::ole::MSConvertOCXControls
734 {
735 public:
736     SwMSConvertControls( SfxObjectShell const *pDSh, SwPaM *pP );
737     void InsertFormula( WW8FormulaControl &rFormula);
738     virtual bool InsertControl(const css::uno::Reference< css::form::XFormComponent >& rFComp,
739         const css::awt::Size& rSize,
740         css::uno::Reference<  css::drawing::XShape > *pShape, bool bFloatingCtrl) override;
741     void ExportControl(WW8Export &rWrt, const SdrUnoObj& rFormObj);
742     bool ReadOCXStream( tools::SvRef<SotStorage> const & rSrc1,
743         css::uno::Reference< css::drawing::XShape > *pShapeRef,
744         bool bFloatingCtrl=false );
745 private:
746     SwPaM * const pPaM;
747     sal_uInt32 mnObjectId;
748 };
749 
750 class SwMSDffManager : public SvxMSDffManager
751 {
752 private:
753     SwWW8ImplReader& rReader;
754     SvStream *pFallbackStream;
755     std::unordered_map<sal_uInt32, Graphic> aOldEscherBlipCache;
756 
757     virtual bool GetOLEStorageName( sal_uInt32 nOLEId, OUString& rStorageName,
758         tools::SvRef<SotStorage>& rSrcStorage, css::uno::Reference < css::embed::XStorage >& rDestStorage ) const override;
759     virtual bool ShapeHasText( sal_uLong nShapeId, sal_uLong nFilePos ) const override;
760     // #i32596# - new parameter <_nCalledByGroup>, which
761     // indicates, if the OLE object is imported inside a group object
762     virtual SdrObject* ImportOLE( sal_uInt32 nOLEId,
763                                   const Graphic& rGrf,
764                                   const tools::Rectangle& rBoundRect,
765                                   const tools::Rectangle& rVisArea,
766                                   const int _nCalledByGroup ) const override;
767 
768     SwMSDffManager(const SwMSDffManager&) = delete;
769     SwMSDffManager& operator=(const SwMSDffManager&) = delete;
770 public:
771     static sal_uInt32 GetFilterFlags();
772     static sal_Int32 GetEscherLineMatch(MSO_LineStyle eStyle, MSO_SPT eShapeType,
773         sal_Int32 &rThick);
774     SwMSDffManager( SwWW8ImplReader& rRdr, bool bSkipImages );
775     void DisableFallbackStream();
776     void EnableFallbackStream();
777 protected:
778     virtual SdrObject* ProcessObj( SvStream& rSt, DffObjData& rObjData, SvxMSDffClientData& rData, tools::Rectangle& rTextRect, SdrObject* pObj ) override;
779 };
780 
781 class wwSection
782 {
783 public:
784     explicit wwSection(const SwPosition &rPos);
785     SEPr maSep;
786     WW8_BRCVer9 brc[4];
787     SwNodeIndex maStart;
788     SwSection *mpSection;
789     SwPageDesc *mpPage;
790     SvxFrameDirection meDir;
791 
792     sal_uInt32 nPgWidth;
793     sal_uInt32 nPgLeft;
794     sal_uInt32 nPgRight;
795 
796     css::drawing::TextVerticalAdjust mnVerticalAdjustment;
797     sal_uInt8 mnBorders;
798     bool mbHasFootnote;
799     void SetDirection();
IsContinuous() const800     bool IsContinuous() const { return maSep.bkc == 0; }
IsNotProtected() const801     bool IsNotProtected() const { return maSep.fUnlocked != 0; }
802     bool IsVertical() const;
NoCols() const803     sal_Int16 NoCols() const { return maSep.ccolM1 + 1; }
StandardColSeparation() const804     sal_Int32 StandardColSeparation() const { return maSep.dxaColumns; }
HasTitlePage() const805     bool HasTitlePage() const { return maSep.fTitlePage != 0; }
PageStartAt() const806     sal_uInt16 PageStartAt() const { return maSep.pgnStart; }
PageRestartNo() const807     bool PageRestartNo() const { return maSep.fPgnRestart != 0; }
IsBiDi() const808     bool IsBiDi() const { return maSep.fBiDi != 0; }
GetPageWidth() const809     sal_uInt32 GetPageWidth() const { return nPgWidth; }
GetTextAreaWidth() const810     sal_uInt32 GetTextAreaWidth() const
811         { return GetPageWidth() - GetPageLeft() - GetPageRight(); }
GetPageHeight() const812     sal_uInt32 GetPageHeight() const { return maSep.yaPage; }
GetPageLeft() const813     sal_uInt32 GetPageLeft() const { return nPgLeft; }
GetPageRight() const814     sal_uInt32 GetPageRight() const { return nPgRight; }
IsLandScape() const815     bool IsLandScape() const { return maSep.dmOrientPage != 0; }
IsFixedHeightHeader() const816     bool IsFixedHeightHeader() const { return maSep.dyaTop < 0; }
IsFixedHeightFooter() const817     bool IsFixedHeightFooter() const { return maSep.dyaBottom < 0; }
818 };
819 
820 class wwSectionManager
821 {
822 private:
823     /*
824     A queue of the ms sections in the document
825     */
826     SwWW8ImplReader& mrReader;
827     std::deque<wwSection> maSegments;
828     typedef std::deque<wwSection>::iterator mySegIter;
829 
830     //Num of page desc's entered into the document
831     sal_uInt16 mnDesc;
832 
833     struct wwULSpaceData
834     {
835         bool bHasHeader, bHasFooter;
836         sal_uInt32 nSwHLo, nSwFUp, nSwUp,  nSwLo;
wwULSpaceDatawwSectionManager::wwULSpaceData837         wwULSpaceData()
838             : bHasHeader(false)
839             , bHasFooter(false)
840             , nSwHLo(0)
841             , nSwFUp(0)
842             , nSwUp(0)
843             , nSwLo(0)
844         {}
845     };
846 
847     void SetSegmentToPageDesc(const wwSection &rSection, bool bIgnoreCols);
848 
849     void GetPageULData(const wwSection &rNewSection,
850         wwULSpaceData& rData) const;
851     static void SetPageULSpaceItems(SwFrameFormat &rFormat, wwULSpaceData const & rData,
852         const wwSection &rSection);
853 
854     static void SetPage(SwPageDesc &rPageDesc, SwFrameFormat &rFormat,
855         const wwSection &rSection, bool bIgnoreCols);
856 
857     static void SetNumberingType(const wwSection &rNewSection, SwPageDesc &rPageDesc);
858 
859     void SetUseOn(wwSection &rSection);
860     void SetHdFt(wwSection const &rSection, int nSect, const wwSection *pPrevious);
861 
862     SwSectionFormat *InsertSection(SwPaM const & rMyPaM, wwSection &rSection);
863     static bool SetCols(SwFrameFormat &rFormat, const wwSection &rSection,
864         sal_uInt32 nNetWidth);
865     bool SectionIsProtected(const wwSection &rSection) const;
866     void SetLeftRight(wwSection &rSection);
867     /*
868      The segment we're inserting, the start of the segments container, and the
869      nodeindex of where we want the page break to (normally the segments start
870      position
871     */
872     SwFormatPageDesc SetSwFormatPageDesc(mySegIter const &rIter, mySegIter const &rStart,
873         bool bIgnoreCols);
874 
875     wwSectionManager(const wwSectionManager&) = delete;
876     wwSectionManager& operator=(const wwSectionManager&) = delete;
877 public:
wwSectionManager(SwWW8ImplReader & rReader)878     explicit wwSectionManager(SwWW8ImplReader &rReader) : mrReader(rReader), mnDesc(0)
879         {}
880     void SetCurrentSectionHasFootnote();
881     void SetCurrentSectionVerticalAdjustment(const css::drawing::TextVerticalAdjust nVA);
882     bool CurrentSectionIsVertical() const;
883     bool CurrentSectionIsProtected() const;
884     void PrependedInlineNode(const SwPosition &rPos, const SwNode &rNode);
885     sal_uInt16 CurrentSectionColCount() const;
886     bool WillHavePageDescHere(const SwNodeIndex& rIdx) const;
887     void CreateSep(const long nTextPos);
888     void InsertSegments();
889     void JoinNode(const SwPosition &rPos, const SwNode &rNode);
890     sal_uInt32 GetPageLeft() const;
891     sal_uInt32 GetPageRight() const;
892     sal_uInt32 GetPageWidth() const;
893     sal_uInt32 GetWWPageTopMargin() const;
894     sal_uInt32 GetTextAreaWidth() const;
895 };
896 
897 //Various writer elements like frames start off containing a blank paragraph,
898 //sometimes this paragraph turns out to be extraneous, e.g. the frame should
899 //only contain a table with no trailing paragraph.
900 
901 //We want to remove these extra paragraphs, but removing them during the parse
902 //is problematic, because we don't want to remove any paragraphs that are still
903 //addressed by property entries in a SwFltControlStack which have not yet been
904 //committed to the document.
905 
906 //Safest thing is to not delete SwTextNodes from a document during import, and
907 //remove these extraneous paragraphs at the end after all SwFltControlStack are
908 //destroyed.
909 class wwExtraneousParas
910 {
911 private:
912     /*
913     A vector of SwTextNodes to erase from a document after import is complete
914     */
915     std::set<SwTextNode*, SwWW8::ltnode> m_aTextNodes;
916     SwDoc& m_rDoc;
917 
918     wwExtraneousParas(wwExtraneousParas const&) = delete;
919     wwExtraneousParas& operator=(wwExtraneousParas const&) = delete;
920 
921 public:
wwExtraneousParas(SwDoc & rDoc)922     explicit wwExtraneousParas(SwDoc &rDoc) : m_rDoc(rDoc) {}
~wwExtraneousParas()923     ~wwExtraneousParas() { delete_all_from_doc(); }
insert(SwTextNode * pTextNode)924     void insert(SwTextNode *pTextNode) { m_aTextNodes.insert(pTextNode); }
925     void delete_all_from_doc();
926 };
927 
928 class wwFrameNamer
929 {
930 private:
931     OUString const msSeed;
932     sal_Int32 mnImportedGraphicsCount;
933     bool const mbIsDisabled;
934 
935     wwFrameNamer(wwFrameNamer const&) = delete;
936     wwFrameNamer& operator=(wwFrameNamer const&) = delete;
937 
938 public:
939     void SetUniqueGraphName(SwFrameFormat *pFrameFormat, const OUString &rFixedPart);
wwFrameNamer(bool bIsDisabled,const OUString & rSeed)940     wwFrameNamer(bool bIsDisabled, const OUString &rSeed)
941         : msSeed(rSeed), mnImportedGraphicsCount(0), mbIsDisabled(bIsDisabled)
942     {
943     }
944 };
945 
946 class wwSectionNamer
947 {
948 private:
949     const SwDoc &mrDoc;
950     OUString const msFileLinkSeed;
951     int mnFileSectionNo;
952     wwSectionNamer(const wwSectionNamer&) = delete;
953     wwSectionNamer& operator=(const wwSectionNamer&) = delete;
954 public:
955     OUString UniqueName();
wwSectionNamer(const SwDoc & rDoc,const OUString & rSeed)956     wwSectionNamer(const SwDoc &rDoc, const OUString &rSeed)
957         : mrDoc(rDoc), msFileLinkSeed(rSeed), mnFileSectionNo(0)
958         { }
959 };
960 
961 class FootnoteDescriptor
962 {
963 public:
964     ManTypes meType;
965     bool mbAutoNum;
966     WW8_CP mnStartCp;
967     WW8_CP mnLen;
968 };
969 
970 struct ApoTestResults
971 {
972     bool mbStartApo;
973     bool mbStopApo;
974     bool m_bHasSprm37;
975     bool m_bHasSprm29;
976     sal_uInt8 m_nSprm29;
977     WW8FlyPara* mpStyleApo;
ApoTestResultsApoTestResults978     ApoTestResults()
979         : mbStartApo(false), mbStopApo(false), m_bHasSprm37(false)
980         , m_bHasSprm29(false), m_nSprm29(0), mpStyleApo(nullptr) {}
HasStartStopApoTestResults981     bool HasStartStop() const { return (mbStartApo || mbStopApo); }
HasFrameApoTestResults982     bool HasFrame() const { return (m_bHasSprm29 || m_bHasSprm37 || mpStyleApo); }
983 };
984 
985 struct ANLDRuleMap
986 {
987     OUString msOutlineNumRule;    // WinWord 6 numbering, variant 1
988     OUString msNumberingNumRule;  // WinWord 6 numbering, variant 2
989     SwNumRule* GetNumRule(const SwDoc& rDoc, sal_uInt8 nNumType);
990     void SetNumRule(const OUString& rNumRule, sal_uInt8 nNumType);
991 };
992 
993 struct SprmReadInfo;
994 class SwDocShell;
995 struct WW8PostProcessAttrsInfo
996 {
997     bool mbCopy;
998     WW8_CP const mnCpStart;
999     WW8_CP const mnCpEnd;
1000     SwPaM mPaM;
1001     SfxItemSet mItemSet;
1002 
1003     WW8PostProcessAttrsInfo(WW8_CP nCpStart, WW8_CP nCpEnd, SwPaM & rPaM);
1004 };
1005 
1006 #define MAX_COL 64  // WW6-description: 32, WW6-UI: 31 & WW8-UI: 63!
1007 
1008 struct WW8TabBandDesc
1009 {
1010     WW8TabBandDesc* pNextBand;
1011     short nGapHalf;
1012     short mnDefaultLeft;
1013     short mnDefaultTop;
1014     short mnDefaultRight;
1015     short mnDefaultBottom;
1016     bool mbHasSpacing;
1017     short nLineHeight;
1018     short nRows;
1019     sal_uInt16 maDirections[MAX_COL + 1];
1020     short nCenter[MAX_COL + 1]; // X-edge of all cells of this band
1021     short nWidth[MAX_COL + 1];  // length of all cells of this band
1022     short nWwCols;      // sal_uInt8 would be sufficient, alignment -> short
1023     short nSwCols;      // SW: number of columns for the writer
1024     bool bLEmptyCol;    // SW: an additional empty column at the left
1025     bool bREmptyCol;    // SW: same at the right
1026     bool bCantSplit;
1027     bool bCantSplit90;
1028     WW8_TCell* pTCs;
1029     sal_uInt8 nOverrideSpacing[MAX_COL + 1];
1030     short nOverrideValues[MAX_COL + 1][4];
1031     WW8_SHD* pSHDs;
1032     Color* pNewSHDs;
1033     WW8_BRCVer9 aDefBrcs[6];
1034 
1035     bool bExist[MAX_COL];           // does this cell exist ?
1036     sal_uInt8 nTransCell[MAX_COL + 2];  // translation WW-Index -> SW-Index
1037 
transCellWW8TabBandDesc1038     sal_uInt8 transCell(sal_uInt8 nWwCol) const
1039     {
1040         return nWwCol < SAL_N_ELEMENTS(nTransCell) ? nTransCell[nWwCol] : 0xFF;
1041     }
1042 
1043     WW8TabBandDesc();
1044     WW8TabBandDesc(WW8TabBandDesc const & rBand);    // deep copy
1045     ~WW8TabBandDesc();
1046     void ReadDef(bool bVer67, const sal_uInt8* pS, short nLen);
1047     void ProcessDirection(const sal_uInt8* pParams);
1048     void ProcessSprmTSetBRC(int nBrcVer, const sal_uInt8* pParamsTSetBRC, sal_uInt16 nParamsLen);
1049     void ProcessSprmTTableBorders(int nBrcVer, const sal_uInt8* pParams, sal_uInt16 nParamsLen);
1050     void ProcessSprmTDxaCol(const sal_uInt8* pParamsTDxaCol);
1051     void ProcessSprmTDelete(const sal_uInt8* pParamsTDelete);
1052     void ProcessSprmTInsert(const sal_uInt8* pParamsTInsert);
1053     void ProcessSpacing(const sal_uInt8* pParamsTInsert);
1054     void ProcessSpecificSpacing(const sal_uInt8* pParamsTInsert);
1055     void ReadShd(const sal_uInt8* pS );
1056     void ReadNewShd(const sal_uInt8* pS, bool bVer67);
1057 
1058     enum wwDIR {wwTOP = 0, wwLEFT = 1, wwBOTTOM = 2, wwRIGHT = 3};
1059 
1060 private:
1061     WW8TabBandDesc & operator =(WW8TabBandDesc const &) = default; // only for use in copy ctor
1062 };
1063 
1064 //            Storage-Reader
1065 
1066 typedef std::set<WW8_CP> cp_set;
1067 typedef std::vector<WW8_CP> cp_vector;
1068 
1069 class SwWW8ImplReader
1070 {
1071 private:
1072     SwDocShell *m_pDocShell;         // The Real DocShell
1073 
1074 friend class WW8RStyle;
1075 friend class WW8TabDesc;
1076 friend class WW8ReaderSave;
1077 friend struct WW8FlyPara;
1078 friend struct WW8SwFlyPara;
1079 friend class WW8FlySet;
1080 friend class SwMSDffManager;
1081 friend class SwWW8FltControlStack;
1082 friend class WW8FormulaControl;
1083 friend class wwSectionManager;
1084 
1085 private:
1086 
1087     SotStorage* m_pStg;                // Input-Storage
1088     SvStream* m_pStrm;                // Input-(Storage)Stream
1089     SvStream* m_pTableStream;         // Input-(Storage)Stream
1090     SvStream* m_pDataStream;          // Input-(Storage)Stream
1091 
1092 // general stuff
1093     SwDoc& m_rDoc;
1094     std::shared_ptr<SwUnoCursor> mpCursor;
1095     SwPaM* m_pPaM;
1096 
1097     std::unique_ptr<SwWW8FltControlStack> m_xCtrlStck;    // stack for the attributes
1098 
1099     /*
1100     This stack is for redlines, because their sequence of discovery can
1101     be out of order of their order of insertion into the document.
1102     */
1103     std::stack<std::unique_ptr<sw::util::RedlineStack>> m_aFrameRedlines; //inside frames, tables, etc
1104     std::unique_ptr<sw::util::RedlineStack> m_xRedlineStack;    //main document
1105 
1106     /*
1107     This stack is for fields that get referenced later, e.g. BookMarks and TOX.
1108     They get inserted at the end of the document, it is the same stack for
1109     headers/footers/main text/textboxes/tables etc...
1110     */
1111     std::unique_ptr<SwWW8ReferencedFltEndStack> m_xReffedStck;
1112 
1113     /*
1114     This stack is for fields whose true conversion cannot be determined until
1115     the end of the document, it is the same stack for headers/footers/main
1116     text/textboxes/tables etc... They are things that reference other things
1117     e.g. NoteRef and Ref, they are processed after pReffedStck
1118     */
1119     std::unique_ptr<SwWW8FltRefStack> m_xReffingStck;
1120 
1121     /*
1122     For graphics anchors. Determines the graphics whose anchors are in the
1123     current paragraph, and works around the difficulty in inserting a graphic
1124     anchored to character before a character to be anchored to has been
1125     inserted. Is emptied at the end of each paragraph.
1126     */
1127     std::unique_ptr<SwWW8FltAnchorStack> m_xAnchorStck;
1128 
1129     /*
1130     A stack of fields identifiers to keep track of any open fields that need
1131     to be closed. Generally word fields are inserted as writer fields as soon
1132     as they are encountered, and so their end point is normally unimportant.
1133     But hyperlink fields need to be applied as attributes to text and it is
1134     far easier and safer to set the end point of an attribute when we
1135     encounter the end marker of the field instead of calculating in advance
1136     where the end point will fall, to do so fully correctly duplicates the
1137     main logic of the filter itself.
1138     */
1139     std::deque<WW8FieldEntry> m_aFieldStack;
1140 
1141     /*
1142     A stack of open footnotes. Should only be one in it at any time.
1143     */
1144     std::deque<FootnoteDescriptor> m_aFootnoteStack;
1145 
1146     /*
1147     A queue of the ms sections in the document
1148     */
1149     wwSectionManager m_aSectionManager;
1150 
1151     /*
1152     A vector of surplus-to-requirements paragraph in the final document,
1153     that exist because of quirks of the SwDoc document model and/or API,
1154     which need to be removed.
1155     */
1156     wwExtraneousParas m_aExtraneousParas;
1157 
1158     /*
1159     A map of tables to their follow nodes for use in inserting tables into
1160     already existing document, i.e. insert file
1161     */
1162     sw::util::InsertedTablesManager m_aInsertedTables;
1163 
1164     /*
1165     Creates unique names to give to (file link) sections (WW1/WW2/...)
1166     */
1167     wwSectionNamer m_aSectionNameGenerator;
1168 
1169     /*
1170     Knows how to split a series of bytes into sprms and their arguments
1171     */
1172     std::unique_ptr<wwSprmParser> m_xSprmParser;
1173 
1174     /*
1175     Creates unique names to give to graphics
1176     */
1177     wwFrameNamer m_aGrfNameGenerator;
1178 
1179     /*
1180     Knows which writer style a given word style should be imported as.
1181     */
1182     sw::util::ParaStyleMapper m_aParaStyleMapper;
1183     sw::util::CharStyleMapper m_aCharStyleMapper;
1184 
1185     /*
1186      Stack of textencoding being used as we progress through the document text
1187     */
1188     std::stack<rtl_TextEncoding> m_aFontSrcCharSets;
1189     std::stack<rtl_TextEncoding> m_aFontSrcCJKCharSets;
1190 
1191     /*
1192      Progress bar
1193      */
1194     std::unique_ptr<ImportProgress> m_xProgress;
1195 
1196     std::unique_ptr<SwMSConvertControls> m_xFormImpl; // implementation of control
1197 
1198     SwFlyFrameFormat* m_pFlyFormatOfJustInsertedGraphic;
1199     SwFrameFormat* m_pFormatOfJustInsertedApo;
1200     SwPaM* m_pPreviousNumPaM;
1201     const SwNumRule* m_pPrevNumRule;
1202 
1203     //Keep track of APO environments
1204     std::deque<bool> m_aApos;
1205     /*
1206     Keep track of generated Ruby character formats we can minimize the
1207     number of character formats created
1208     */
1209     std::vector<const SwCharFormat*> m_aRubyCharFormats;
1210 
1211     /*
1212     For fuzzing keep track of source offset of inserted graphics
1213     */
1214     std::set<sal_uLong> m_aGrafPosSet;
1215 
1216     std::unique_ptr<WW8PostProcessAttrsInfo> m_pPostProcessAttrsInfo;
1217 
1218     std::shared_ptr<WW8Fib> m_xWwFib;
1219     std::unique_ptr<WW8Fonts> m_xFonts;
1220     std::unique_ptr<WW8Dop> m_xWDop;
1221     std::unique_ptr<WW8ListManager, o3tl::default_delete<WW8ListManager>> m_xLstManager;
1222     std::unique_ptr<WW8ScannerBase> m_xSBase;
1223     std::shared_ptr<WW8PLCFMan> m_xPlcxMan;
1224     std::map<short, OUString> m_aLinkStringMap;
1225 
1226     std::set<const SwNode*> m_aTextNodesHavingFirstLineOfstSet; // #i103711#
1227     std::set<const SwNode*> m_aTextNodesHavingLeftIndentSet; // #i105414#
1228 
1229     std::unique_ptr<WW8RStyle> m_xStyles;     // pointer to the style reading class
1230     SwFormat* m_pCurrentColl;        // collection to be created now
1231                             // ( always 0 outside of a Style-Def )
1232     std::unique_ptr<SfxItemSet> m_xCurrentItemSet;// character attributes to be read in now
1233                             // (always 0 outside of the WW8ListManager Ctor)
1234     std::vector<SwWW8StyInf> m_vColl;
1235     const SwTextFormatColl* m_pDfltTextFormatColl;    // Default
1236     SwFormat* m_pStandardFormatColl;// "Standard"
1237 
1238     std::unique_ptr<WW8PLCF_HdFt> m_xHdFt;        // pointer to Header / Footer - scanner class
1239 
1240     std::unique_ptr<WW8FlyPara> m_xWFlyPara;      // WW-parameter
1241     std::unique_ptr<WW8SwFlyPara> m_xSFlyPara;    // Sw parameters created from previous
1242 
1243     std::unique_ptr<WW8TabDesc> m_xTableDesc;     // description of table properties
1244     //Keep track of tables within tables
1245     std::stack<std::unique_ptr<WW8TabDesc>> m_aTableStack;
1246 
1247     ANLDRuleMap m_aANLDRules;
1248     std::unique_ptr<WW8_OLST> m_xNumOlst;         // position in text
1249 
1250     SdrModel* m_pDrawModel;
1251     SdrPage* m_pDrawPg;
1252     std::unique_ptr<EditEngine> m_pDrawEditEngine;
1253     std::unique_ptr<wwZOrderer> m_xWWZOrder;
1254 
1255     SwFieldType* m_pNumFieldType;   // for number circle
1256 
1257     std::unique_ptr<SwMSDffManager> m_xMSDffManager;
1258 
1259     std::unique_ptr<std::vector<OUString>> m_pAtnNames;
1260 
1261     std::unique_ptr<WW8SmartTagData> m_pSmartTagData;
1262 
1263     sw::util::AuthorInfos m_aAuthorInfos;
1264     OUString const m_sBaseURL;
1265 
1266                                 // Ini-Flags:
1267     sal_uInt32 m_nIniFlags;            // flags from writer.ini
1268     sal_uInt32 m_nIniFlags1;           // dito ( additional flags )
1269     sal_uInt32 m_nFieldFlags;          // dito for fields
1270     sal_uInt32 m_nFieldTagAlways[3];   // dito for tagging of fields
1271     sal_uInt32 m_nFieldTagBad[3];      // dito for tagging of fields that can't be imported
1272     bool m_bRegardHindiDigits;  // import digits in CTL scripts as Hindi numbers
1273 
1274     bool m_bDrawCpOValid;
1275     WW8_CP m_nDrawCpO;            // start of Txbx-SubDocs
1276 
1277     sal_uLong m_nPicLocFc;            // Picture Location in File (FC)
1278     sal_uLong m_nObjLocFc;            // Object Location in File (FC)
1279 
1280     sal_Int32 m_nIniFlyDx;            // X-offset of Flys
1281     sal_Int32 m_nIniFlyDy;            // Y-offset of Flys
1282 
1283     rtl_TextEncoding m_eTextCharSet;    // Default charset for Text
1284     rtl_TextEncoding m_eStructCharSet;  // rtl_TextEncoding for structures
1285     rtl_TextEncoding m_eHardCharSet;    // Hard rtl_TextEncoding-Attribute
1286     sal_uInt16 m_nProgress;           // percentage for Progressbar
1287     sal_uInt16 m_nCurrentColl;          // per WW-count
1288     sal_uInt16 m_nFieldNum;             // serial number for that
1289     sal_uInt16 m_nLFOPosition;
1290 
1291     short m_nCharFormat;             // per WW-count, <0 for none
1292 
1293     short m_nDrawXOfs, m_nDrawYOfs;
1294     short m_nDrawXOfs2, m_nDrawYOfs2;
1295 
1296     sal_Unicode m_cSymbol;        // symbol to be read now
1297 
1298     sal_uInt8 const m_nWantedVersion;        // originally requested WW-Doc version by Writer
1299 
1300     sal_uInt8 m_nSwNumLevel;           // level number for outline / enumeration
1301     sal_uInt8 m_nWwNumType;            // outline / number / enumeration
1302     sal_uInt8 m_nListLevel;
1303 
1304     bool const m_bNewDoc;          // new document?
1305     bool const m_bSkipImages;      // skip images for text extraction/indexing
1306     bool m_bReadNoTable;        // no tables
1307     bool m_bPgSecBreak;       // Page- or Sectionbreak is still to be added
1308     bool m_bSpec;             // special char follows in text
1309     bool m_bObj;              // Obj in Text
1310     bool m_bTxbxFlySection;   // FlyFrame that was inserted as replacement for Winword Textbox
1311     bool m_bHasBorder;        // for bundling of the borders
1312     bool m_bSymbol;           // e.g. Symbol instead of Times
1313     bool m_bIgnoreText;       // e.g. for FieldVanish
1314     int  m_nInTable;          // are we currently reading a table?
1315     bool m_bWasTabRowEnd;     // table : Row End Mark
1316     bool m_bWasTabCellEnd;    // table: Cell End Mark
1317 
1318     bool m_bAnl;              // enumeration in work
1319                                 // Anl stands for "Autonumber level"
1320 
1321     bool m_bHdFtFootnoteEdn;       // special text: header/footer/and so on
1322     bool m_bFootnoteEdn;           // footnote or endnote
1323     bool m_bIsHeader;         // text is read from header ( line height )
1324     bool m_bIsFooter;         // text is read from footer ( line height )
1325 
1326     bool m_bIsUnicode;            // current piece of text is encoded as 2-byte Unicode
1327                                 // please do NOT handle this as bit field!
1328 
1329     bool m_bCpxStyle;         // style in the complex part
1330     bool m_bStyNormal;        // style with Id 0 is currently read
1331     bool m_bWWBugNormal;      // WW-Version with Bug Dya in Style Normal
1332     bool m_bNoAttrImport;     // ignore attributes for ignoring styles
1333     bool m_bInHyperlink;      // special case for reading 0x01
1334                                    // see also: SwWW8ImplReader::Read_F_Hyperlink()
1335     bool m_bWasParaEnd;
1336 
1337     // useful helper variables
1338     bool m_bVer67;            // ( (6 == nVersion) || (7 == nVersion) );
1339     bool m_bVer6;             //   (6 == nVersion);
1340     bool m_bVer7;             //   (7 == nVersion);
1341     bool m_bVer8;             //   (8 == nVersion);
1342 
1343     bool m_bEmbeddObj;        // EmbeddField is being read
1344 
1345     bool m_bCurrentAND_fNumberAcross; // current active Annotated List Descriptor - ROW flag
1346 
1347     bool m_bNoLnNumYet;       // no Line Numbering has been activated yet (we import
1348                             //     the very 1st Line Numbering and ignore the rest)
1349 
1350     bool m_bFirstPara;        // first paragraph?
1351     bool m_bFirstParaOfPage;
1352     bool m_bParaAutoBefore;
1353     bool m_bParaAutoAfter;
1354 
1355     bool m_bDropCap;
1356     sal_Int32 m_nDropCap;
1357 
1358     bool m_bBidi;
1359     bool m_bReadTable;
1360     // Indicate that currently on loading a TOC, managed by Read_F_TOX() and End_Field()
1361     bool m_bLoadingTOXCache;
1362     int m_nEmbeddedTOXLevel;
1363     // Indicate that current on loading a hyperlink, which is inside a TOC; Managed by Read_F_Hyperlink() and End_Field()
1364     bool m_bLoadingTOXHyperlink;
1365     // a document position recorded the after-position of TOC section, managed by Read_F_TOX() and End_Field()
1366     std::unique_ptr<SwPaM> m_pPosAfterTOC;
1367     // used for some dropcap tweaking
1368     SwTextNode* m_pPreviousNode;
1369 
1370     std::unique_ptr< SwPosition > m_pLastAnchorPos;
1371 
1372     bool m_bCareFirstParaEndInToc;
1373     bool m_bCareLastParaEndInToc;
1374     cp_set m_aTOXEndCps;
1375 
1376     cp_vector m_aEndParaPos;
1377     WW8_CP m_aCurrAttrCP;
1378     bool m_bOnLoadingMain:1;
1379     bool m_bNotifyMacroEventRead:1;
1380 
1381     const SprmReadInfo& GetSprmReadInfo(sal_uInt16 nId) const;
1382 
StyleExists(unsigned int nColl) const1383     bool StyleExists(unsigned int nColl) const { return (nColl < m_vColl.size()); }
1384     SwWW8StyInf *GetStyle(sal_uInt16 nColl) const;
1385     void AppendTextNode(SwPosition& rPos);
1386 
1387     void Read_HdFt(int nSect, const SwPageDesc *pPrev,
1388         const wwSection &rSection);
1389     void Read_HdFtText(WW8_CP nStartCp, WW8_CP nLen, SwFrameFormat const * pHdFtFormat);
1390     void Read_HdFtTextAsHackedFrame(WW8_CP nStart, WW8_CP nLen,
1391         SwFrameFormat const &rHdFtFormat, sal_uInt16 nPageWidth);
1392 
1393     bool isValid_HdFt_CP(WW8_CP nHeaderCP) const;
1394 
1395     bool HasOwnHeaderFooter(sal_uInt8 nWhichItems, sal_uInt8 grpfIhdt, int nSect);
1396 
1397     void HandleLineNumbering(const wwSection &rSection);
1398 
1399     void CopyPageDescHdFt( const SwPageDesc* pOrgPageDesc,
1400                            SwPageDesc* pNewPageDesc, sal_uInt8 nCode );
1401 
1402     void DeleteStack(std::unique_ptr<SwFltControlStack> prStck);
DeleteCtrlStack()1403     void DeleteCtrlStack()
1404     {
1405         DeleteStack(std::move(m_xCtrlStck));
1406     }
DeleteRefStacks()1407     void DeleteRefStacks()
1408     {
1409         DeleteStack(std::move(m_xReffedStck));
1410         DeleteStack(std::move(m_xReffingStck));
1411     }
DeleteAnchorStack()1412     void DeleteAnchorStack()
1413     {
1414         DeleteStack(std::move(m_xAnchorStck));
1415     }
1416     void emulateMSWordAddTextToParagraph(const OUString& rAddString);
1417     void simpleAddTextToParagraph(const OUString& rAddString);
1418     bool HandlePageBreakChar();
1419     bool ReadChar(long nPosCp, long nCpOfs);
1420     bool ReadPlainChars(WW8_CP& rPos, sal_Int32 nEnd, sal_Int32 nCpOfs);
1421     bool ReadChars(WW8_CP& rPos, WW8_CP nNextAttr, long nTextEnd, long nCpOfs);
1422     static bool LangUsesHindiNumbers(LanguageType nLang);
1423     static sal_Unicode TranslateToHindiNumbers(sal_Unicode);
1424 
1425     void SetDocumentGrid(SwFrameFormat &rFormat, const wwSection &rSection);
1426 
1427     void ProcessCurrentCollChange(WW8PLCFManResult& rRes, bool* pStartAttr,
1428         bool bCallProcessSpecial);
1429     long ReadTextAttr(WW8_CP& rTextPos, long nTextEnd, bool& rbStartLine, int nDepthGuard = 0);
1430     void ReadAttrs(WW8_CP& rTextPos, WW8_CP& rNext, long nTextEnd, bool& rbStartLine);
1431     void CloseAttrEnds();
1432     bool ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType);
1433 
1434     void ReadRevMarkAuthorStrTabl( SvStream& rStrm, sal_Int32 nTablePos,
1435         sal_Int32 nTableSiz, SwDoc& rDoc );
1436 
1437     void Read_HdFtFootnoteText(const SwNodeIndex* pSttIdx, WW8_CP nStartCp,
1438                                WW8_CP nLen, ManTypes nType);
1439 
1440     void ImportTox( int nFieldId, const OUString& aStr );
1441 
1442     void EndSprm( sal_uInt16 nId );
1443     // #i103711#
1444     // #i105414#
1445     void NewAttr( const SfxPoolItem& rAttr,
1446                   const bool bFirstLineOfStSet = false,
1447                   const bool bLeftIndentSet = false );
1448 
1449     bool GetFontParams(sal_uInt16, FontFamily&, OUString&, FontPitch&,
1450         rtl_TextEncoding&);
1451     bool SetNewFontAttr(sal_uInt16 nFCode, bool bSetEnums, sal_uInt16 nWhich);
1452     void ResetCharSetVars();
1453     void ResetCJKCharSetVars();
1454 
1455     const SfxPoolItem* GetFormatAttr( sal_uInt16 nWhich );
1456     bool JoinNode(SwPaM &rPam, bool bStealAttr = false);
1457 
1458     static bool IsBorder(const WW8_BRCVer9* pbrc, bool bChkBtwn = false);
1459 
1460     //Set closest writer border equivalent into rBox from pbrc, optionally
1461     //recording true winword dimensions in pSizeArray. nSetBorders to mark a
1462     //border which has been previously set to a value and for which becoming
1463     //empty is valid. Set bCheBtwn to work with paragraphs that have a special
1464     //between paragraphs border
1465 
1466     // Note #i20672# we can't properly support between lines so best to ignore
1467     // them for now
1468     static bool SetBorder(SvxBoxItem& rBox, const WW8_BRCVer9* pbrc,
1469         short *pSizeArray=nullptr, sal_uInt8 nSetBorders=0xFF);
1470     static void GetBorderDistance(const WW8_BRCVer9* pbrc, tools::Rectangle& rInnerDist);
1471     static sal_uInt16 GetParagraphAutoSpace(bool fDontUseHTMLAutoSpacing);
1472     static bool SetShadow(SvxShadowItem& rShadow, const short *pSizeArray,
1473         const WW8_BRCVer9& aRightBrc);
1474     //returns true is a shadow was set
1475     static bool SetFlyBordersShadow(SfxItemSet& rFlySet, const WW8_BRCVer9 *pbrc,
1476         short *SizeArray);
1477     static void SetPageBorder(SwFrameFormat &rFormat, const wwSection &rSection);
1478 
1479     static sal_Int32 MatchSdrBoxIntoFlyBoxItem( const Color& rLineColor,
1480         MSO_LineStyle eLineStyle, MSO_LineDashing eDashing, MSO_SPT eShapeType, sal_Int32 &rLineWidth,
1481         SvxBoxItem& rBox );
1482     void MatchSdrItemsIntoFlySet( SdrObject const *    pSdrObj, SfxItemSet &aFlySet,
1483         MSO_LineStyle eLineStyle, MSO_LineDashing eDashing, MSO_SPT eShapeType, tools::Rectangle &rInnerDist );
1484     static void AdjustLRWrapForWordMargins(const SvxMSDffImportRec &rRecord,
1485         SvxLRSpaceItem &rLR);
1486     static void AdjustULWrapForWordMargins(const SvxMSDffImportRec &rRecord,
1487         SvxULSpaceItem &rUL);
1488     static void MapWrapIntoFlyFormat(SvxMSDffImportRec const * pRecord, SwFrameFormat* pFlyFormat);
1489 
1490     void SetAttributesAtGrfNode(SvxMSDffImportRec const* pRecord,
1491             SwFrameFormat const *pFlyFormat, WW8_FSPA const *pF);
1492 
1493     bool IsDropCap() const;
IsListOrDropcap() const1494     bool IsListOrDropcap() const { return (!m_xCurrentItemSet  || m_bDropCap); };
1495 
1496     //Apo == Absolutely Positioned Object, MSWord's old-style frames
1497     std::unique_ptr<WW8FlyPara> ConstructApo(const ApoTestResults &rApo,
1498         const WW8_TablePos *pTabPos);
1499     bool StartApo(const ApoTestResults &rApo, const WW8_TablePos *pTabPos);
1500     void StopApo();
1501     bool TestSameApo(const ApoTestResults &rApo, const WW8_TablePos *pTabPos);
1502     ApoTestResults TestApo(int nCellLevel, bool bTableRowEnd,
1503         const WW8_TablePos *pTabPos);
1504     static void StripNegativeAfterIndent(SwFrameFormat const *pFlyFormat);
1505 
1506     void EndSpecial();
1507     bool ProcessSpecial(bool &rbReSync, WW8_CP nStartCp);
1508     sal_uInt16 TabRowSprm(int nLevel) const;
1509 
1510     bool ReadGrafFile(OUString& rFileName, std::unique_ptr<Graphic>& rpGraphic,
1511        const WW8_PIC& rPic, SvStream* pSt, sal_uLong nFilePos, bool* pDelIt);
1512 
1513     static void ReplaceObj(const SdrObject &rReplaceTextObj,
1514         SdrObject &rSubObj);
1515 
1516     SwFlyFrameFormat* MakeGrafNotInContent(const WW8PicDesc& rPD,
1517         const Graphic* pGraph, const OUString& rFileName,
1518         const SfxItemSet& rGrfSet);
1519 
1520     SwFrameFormat* MakeGrafInContent(const WW8_PIC& rPic, const WW8PicDesc& rPD,
1521         const Graphic* pGraph, const OUString& rFileName,
1522         const SfxItemSet& rGrfSet);
1523 
1524     SwFrameFormat *AddAutoAnchor(SwFrameFormat *pFormat);
1525     SwFrameFormat* ImportGraf1(WW8_PIC const & rPic, SvStream* pSt, sal_uLong nFilePos);
1526     SwFrameFormat* ImportGraf(SdrTextObj const * pTextObj = nullptr, SwFrameFormat const * pFlyFormat = nullptr);
1527 
1528     SdrObject* ImportOleBase( Graphic& rGraph, const Graphic* pGrf=nullptr,
1529         const SfxItemSet* pFlySet=nullptr, const tools::Rectangle& aVisArea = tools::Rectangle() );
1530 
1531     SwFrameFormat* ImportOle( const Graphic* = nullptr, const SfxItemSet* pFlySet = nullptr,
1532         const SfxItemSet* pGrfSet = nullptr, const tools::Rectangle& aVisArea = tools::Rectangle() );
1533     SwFlyFrameFormat* InsertOle(SdrOle2Obj &rObject, const SfxItemSet &rFlySet,
1534         const SfxItemSet *rGrfSet);
1535 
1536     bool ImportFormulaControl(WW8FormulaControl &rBox,WW8_CP nStart,
1537         SwWw8ControlType nWhich);
1538 
1539     void ImportDop();
1540 
1541     //This converts MS Asian Typography information into OOo's
1542     void ImportDopTypography(const WW8DopTypography &rTypo);
1543 
1544     ErrCode LoadThroughDecryption(WW8Glossary *pGloss);
1545     ErrCode SetSubStreams(tools::SvRef<SotStorageStream> &rTableStream, tools::SvRef<SotStorageStream> &rDataStream);
1546     ErrCode CoreLoad(WW8Glossary const *pGloss);
1547 
1548     void ReadDocVars();
1549 
1550     bool StartTable(WW8_CP nStartCp);
1551     bool InEqualApo(int nLvl) const;
InLocalApo() const1552     bool InLocalApo() const { return InEqualApo(m_nInTable); }
1553     bool InEqualOrHigherApo(int nLvl) const;
1554     void TabCellEnd();
1555     void StopTable();
1556     bool IsInvalidOrToBeMergedTabCell() const;
1557 
1558 // Enumerations / lists ( Autonumbered List Data Descriptor )
1559 // list:        ANLD ( Autonumbered List Data Descriptor )
1560 //   one level: ANLV ( Autonumber Level Descriptor )
1561 
1562 // Chg7-8:
1563 // lists are separate structures in WW8 that are handled via the following three tables:
1564 // rglst, hpllfo and hsttbListNames
1565 // the corresponding structures are: LSTF, LVLF, LFO LFOLVL
1566 
1567     void SetAnlvStrings(SwNumFormat &rNum, WW8_ANLV const &rAV, const sal_uInt8* pText,
1568         size_t nStart, size_t nElements, bool bOutline);
1569     void SetAnld(SwNumRule* pNumR, WW8_ANLD const * pAD, sal_uInt8 nSwLevel, bool bOutLine);
1570     void SetNumOlst( SwNumRule* pNumR, WW8_OLST* pO, sal_uInt8 nSwLevel );
1571     SwNumRule* GetStyRule();
1572 
1573     void StartAnl(const sal_uInt8* pSprm13);
1574     void NextAnlLine(const sal_uInt8* pSprm13);
1575     void StopAllAnl(bool bGoBack = true);
1576     void StopAnlToRestart(sal_uInt8 nType, bool bGoBack = true);
1577 
1578 // graphics layer
1579 
1580     bool ReadGrafStart(void* pData, short nDataSiz, WW8_DPHEAD const * pHd,
1581         SfxAllItemSet &rSet);
1582     SdrObject *ReadLine(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1583     SdrObject *ReadRect(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1584     SdrObject *ReadElipse(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1585     SdrObject *ReadArc(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1586     SdrObject *ReadPolyLine(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1587     void InsertTxbxStyAttrs( SfxItemSet& rS, sal_uInt16 nColl );
1588     void InsertAttrsAsDrawingAttrs(WW8_CP nStartCp, WW8_CP nEndCp, ManTypes eType, bool bONLYnPicLocFc=false);
1589 
1590     bool GetTxbxTextSttEndCp(WW8_CP& rStartCp, WW8_CP& rEndCp, sal_uInt16 nTxBxS,
1591         sal_uInt16 nSequence);
1592     sal_Int32 GetRangeAsDrawingString(OUString& rString, long StartCp, long nEndCp, ManTypes eType);
1593     std::unique_ptr<OutlinerParaObject> ImportAsOutliner(OUString &rString, WW8_CP nStartCp, WW8_CP nEndCp, ManTypes eType);
1594     void InsertTxbxText(SdrTextObj* pTextObj, Size const * pObjSiz,
1595         sal_uInt16 nTxBxS, sal_uInt16 nSequence, long nPosCp, SwFrameFormat const * pFlyFormat,
1596         bool bMakeSdrGrafObj, bool& rbEraseTextObj,
1597         bool* pbTestTxbxContainsText = nullptr, long* pnStartCp = nullptr,
1598         long* pnEndCp = nullptr, bool* pbContainsGraphics = nullptr,
1599         SvxMSDffImportRec const * pRecord = nullptr);
1600     bool TxbxChainContainsRealText( sal_uInt16 nTxBxS,
1601                                     long&  rStartCp,
1602                                     long&  rEndCp );
1603     SdrObject *ReadTextBox(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1604     SdrObject *ReadCaptionBox(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1605     SdrObject *ReadGroup(WW8_DPHEAD const * pHd, SfxAllItemSet &rSet);
1606     SdrObject *ReadGrafPrimitive(short& rLeft, SfxAllItemSet &rSet);
1607     void ReadGrafLayer1( WW8PLCFspecial* pPF, long nGrafAnchorCp );
1608     SdrObject* CreateContactObject(SwFrameFormat* pFlyFormat);
1609     RndStdIds ProcessEscherAlign(SvxMSDffImportRec* pRecord, WW8_FSPA *pFSPA,
1610         SfxItemSet &rFlySet);
1611     bool MiserableRTLGraphicsHack(SwTwips &rLeft, SwTwips nWidth,
1612         sal_Int16 eHoriOri, sal_Int16 eHoriRel);
1613     SwFrameFormat* Read_GrafLayer( long nGrafAnchorCp );
1614     SwFlyFrameFormat* ImportReplaceableDrawables( SdrObject* &rpObject,
1615         SdrObject* &rpOurNewObject, SvxMSDffImportRec* pRecord, WW8_FSPA *pF,
1616         SfxItemSet &rFlySet );
1617     SwFlyFrameFormat *ConvertDrawTextToFly( SdrObject* &rpObject,
1618         SdrObject* &rpOurNewObject, SvxMSDffImportRec const * pRecord,
1619         RndStdIds eAnchor, WW8_FSPA const *pF, SfxItemSet &rFlySet );
1620     SwFrameFormat* MungeTextIntoDrawBox(SvxMSDffImportRec *pRecord,
1621         long nGrafAnchorCp, SwFrameFormat *pRetFrameFormat);
1622 
1623     void GrafikCtor();
1624     void GrafikDtor();
1625 
1626 // other stuff
1627     OUString GetFieldResult( WW8FieldDesc const * pF );
1628     void MakeTagString( OUString& rStr, const OUString& rOrg );
1629     void UpdateFields();
1630     OUString ConvertFFileName(const OUString& rRaw);
1631     WW8_CP Read_F_Tag(WW8FieldDesc* pF);
1632     void InsertTagField( const sal_uInt16 nId, const OUString& rTagText );
1633     long ImportExtSprm(WW8PLCFManResult* pRes);
1634     void EndExtSprm(sal_uInt16 nSprmId);
1635     void ReadDocInfo();
1636 
1637 // Ver8 lists
1638 
1639     void RegisterNumFormatOnTextNode(sal_uInt16 nCurrentLFO, sal_uInt8 nCurrentLevel,
1640                                  const bool bSetAttr = true);
1641 
1642     void RegisterNumFormatOnStyle(sal_uInt16 nStyle);
1643     void SetStylesList(sal_uInt16 nStyle, sal_uInt16 nCurrentLFO,
1644         sal_uInt8 nCurrentLevel);
1645     void RegisterNumFormat(sal_uInt16 nCurrentLFO, sal_uInt8 nCurrentLevel);
1646 
1647 // to be replaced by calls in the appropriate extended SvxMSDffManager
1648 
1649     const OUString* GetAnnotationAuthor(sal_uInt16 nIdx);
1650 
1651     void GetSmartTagInfo(SwFltRDFMark& rMark);
1652 
1653     // interfaces for the toggle attributes
1654     void SetToggleAttr(sal_uInt8 nAttrId, bool bOn);
1655     void SetToggleBiDiAttr(sal_uInt8 nAttrId, bool bOn);
1656     void ChkToggleAttr_( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask );
1657 
ChkToggleAttr(sal_uInt16 nOldStyle81Mask,sal_uInt16 nNewStyle81Mask)1658     void ChkToggleAttr( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask )
1659     {
1660         if( nOldStyle81Mask != nNewStyle81Mask &&
1661             m_xCtrlStck->GetToggleAttrFlags() )
1662             ChkToggleAttr_( nOldStyle81Mask, nNewStyle81Mask );
1663     }
1664 
1665     void ChkToggleBiDiAttr_( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask );
1666 
ChkToggleBiDiAttr(sal_uInt16 nOldStyle81Mask,sal_uInt16 nNewStyle81Mask)1667     void ChkToggleBiDiAttr( sal_uInt16 nOldStyle81Mask, sal_uInt16 nNewStyle81Mask )
1668     {
1669         if( nOldStyle81Mask != nNewStyle81Mask &&
1670             m_xCtrlStck->GetToggleBiDiAttrFlags() )
1671             ChkToggleBiDiAttr_( nOldStyle81Mask, nNewStyle81Mask );
1672     }
1673 
1674     void PopTableDesc();
1675     void MoveInsideFly(const SwFrameFormat *pFlyFormat);
1676     SwTwips MoveOutsideFly(SwFrameFormat *pFlyFormat, const SwPosition &rPos,
1677         bool bTableJoin = true);
1678 
1679     void SetOutlineStyles();
1680 
1681     bool SetSpacing(SwPaM &rMyPam, int nSpace, bool bIsUpper);
1682     bool SetUpperSpacing(SwPaM &pMyPam, int nSpace);
1683     bool SetLowerSpacing(SwPaM &rMyPam, int nSpace);
1684 
IsInlineEscherHack() const1685     bool IsInlineEscherHack() const
1686         { return !m_aFieldStack.empty() && m_aFieldStack.back().mnFieldId == 95; };
1687 
1688     void StoreMacroCmds();
1689 
1690     // #i84783#
1691     // determine object attribute "Layout in Table Cell"
1692     bool IsObjectLayoutInTableCell( const sal_uInt32 nLayoutInTableCell ) const;
1693     void ReadGlobalTemplateSettings( const OUString& sCreatedFrom, const css::uno::Reference< css::container::XNameContainer >& xPrjNameMap );
1694     SwWW8ImplReader(const SwWW8ImplReader &) = delete;
1695     SwWW8ImplReader& operator=(const SwWW8ImplReader&) = delete;
1696 public:     // really private, but can only be done public
1697     ~SwWW8ImplReader();
1698     sal_uInt16 GetToggleAttrFlags() const;
1699     sal_uInt16 GetToggleBiDiAttrFlags() const;
1700     void SetToggleAttrFlags(sal_uInt16 nFlags);
1701     void SetToggleBiDiAttrFlags(sal_uInt16 nFlags);
GetCurrAttrCP() const1702     WW8_CP GetCurrAttrCP() const {return m_aCurrAttrCP;}
1703     bool IsParaEndInCPs(sal_Int32 , sal_Int32,bool bSdOD=true) const;
1704     //Clear the para end position recorded in reader intermittently for the least impact on loading performance
1705     void ClearParaEndPosition();
1706 
1707     long Read_Footnote(WW8PLCFManResult* pRes);
1708     sal_uInt16 End_Footnote();
1709     long Read_Field(WW8PLCFManResult* pRes);
1710     sal_uInt16 End_Field();
1711     long Read_Book(WW8PLCFManResult*);
1712     long Read_And(WW8PLCFManResult* pRes);
1713     long Read_AtnBook(WW8PLCFManResult*);
1714     long Read_FactoidBook(WW8PLCFManResult*);
1715 
1716     // attributes
1717 
1718     void Read_Special(sal_uInt16, const sal_uInt8*, short nLen);
1719     void Read_Obj(sal_uInt16, const sal_uInt8*, short nLen);
1720     void Read_PicLoc(sal_uInt16, const sal_uInt8* pData, short nLen );
1721     void Read_BoldUsw(sal_uInt16 nId, const sal_uInt8*, short nLen);
1722     void Read_Bidi(sal_uInt16 nId, const sal_uInt8*, short nLen);
1723     void Read_BoldBiDiUsw(sal_uInt16 nId, const sal_uInt8*, short nLen);
1724     void Read_AmbiguousSPRM(sal_uInt16 nId, const sal_uInt8*, short nLen);
1725     void Read_SubSuper(         sal_uInt16, const sal_uInt8*, short nLen );
1726     bool ConvertSubToGraphicPlacement();
1727     static SwFrameFormat *ContainsSingleInlineGraphic(const SwPaM &rRegion);
1728     void Read_SubSuperProp(     sal_uInt16, const sal_uInt8*, short nLen );
1729     void Read_Underline(        sal_uInt16, const sal_uInt8*, short nLen );
1730     void Read_TextColor(         sal_uInt16, const sal_uInt8*, short nLen );
1731     void openFont(sal_uInt16 nFCode, sal_uInt16 nId);
1732     void closeFont(sal_uInt16 nId);
1733     void Read_FontCode(         sal_uInt16, const sal_uInt8*, short nLen );
1734     void Read_FontSize(         sal_uInt16, const sal_uInt8*, short nLen );
1735     void Read_CharSet(sal_uInt16 , const sal_uInt8* pData, short nLen);
1736     void Read_Language(         sal_uInt16, const sal_uInt8*, short nLen );
1737     void Read_CColl(            sal_uInt16, const sal_uInt8*, short nLen );
1738     void Read_Kern(             sal_uInt16, const sal_uInt8* pData, short nLen );
1739     void Read_FontKern(         sal_uInt16, const sal_uInt8* pData, short nLen );
1740     void Read_Emphasis(         sal_uInt16, const sal_uInt8* pData, short nLen );
1741     void Read_ScaleWidth(       sal_uInt16, const sal_uInt8* pData, short nLen );
1742     void Read_Relief(           sal_uInt16, const sal_uInt8* pData, short nLen);
1743     void Read_TextAnim(      sal_uInt16, const sal_uInt8* pData, short nLen);
1744 
1745     void Read_NoLineNumb(       sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1746 
1747     void Read_LR(               sal_uInt16 nId, const sal_uInt8*, short nLen );
1748     void Read_UL(               sal_uInt16 nId, const sal_uInt8*, short nLen );
1749     void Read_ParaAutoBefore(sal_uInt16 , const sal_uInt8 *pData, short nLen);
1750     void Read_ParaAutoAfter(sal_uInt16 , const sal_uInt8 *pData, short nLen);
1751     void Read_ParaContextualSpacing( sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1752     void Read_LineSpace(        sal_uInt16, const sal_uInt8*, short nLen );
1753 
1754     void SetRelativeJustify( bool bRel );
1755     bool IsRelativeJustify();
1756     bool IsRelativeJustify( sal_uInt16 nColl );
1757     void Read_Justify(sal_uInt16, const sal_uInt8*, short nLen);
1758 
1759     void Read_IdctHint(sal_uInt16, const sal_uInt8*, short nLen);
1760     bool IsRightToLeft();
1761     void Read_RTLJustify(sal_uInt16, const sal_uInt8*, short nLen);
1762     void Read_Hyphenation(      sal_uInt16, const sal_uInt8* pData, short nLen );
1763     void Read_WidowControl(     sal_uInt16, const sal_uInt8* pData, short nLen );
1764     void Read_AlignFont(        sal_uInt16, const sal_uInt8* pData, short nLen );
1765     void Read_UsePgsuSettings(  sal_uInt16, const sal_uInt8* pData, short nLen );
1766     void Read_KeepLines(        sal_uInt16, const sal_uInt8* pData, short nLen );
1767     void Read_KeepParas(        sal_uInt16, const sal_uInt8* pData, short nLen );
1768     void Read_BreakBefore(      sal_uInt16, const sal_uInt8* pData, short nLen );
1769     void Read_ApoPPC(sal_uInt16, const sal_uInt8* pData, short);
1770 
1771     void Read_BoolItem(         sal_uInt16 nId, const sal_uInt8*, short nLen );
1772 
1773     void Read_Border(           sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1774     void Read_CharBorder(sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1775     void Read_Tab(              sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1776     void Read_Symbol(sal_uInt16, const sal_uInt8* pData, short nLen);
1777     void Read_FieldVanish(        sal_uInt16 nId, const sal_uInt8* pData, short nLen );
1778 
1779     // Revision Marks ( == Redlining )
1780 
1781     // insert or delete content (change char attributes resp.)
1782     void Read_CRevisionMark(RedlineType eType, const sal_uInt8* pData, short nLen);
1783     // insert new content
1784     void Read_CFRMark(sal_uInt16 , const sal_uInt8* pData, short nLen);
1785     // delete old content
1786     void Read_CFRMarkDel(sal_uInt16 , const sal_uInt8* pData, short nLen);
1787     // change properties of content (e.g. char formatting)
1788     void Read_CPropRMark(sal_uInt16 , const sal_uInt8* pData, short nLen); // complex!
1789 
1790     void Read_TabRowEnd(        sal_uInt16, const sal_uInt8* pData, short nLen );
1791     void Read_TabCellEnd(        sal_uInt16, const sal_uInt8* pData, short nLen );
1792     bool ParseTabPos(WW8_TablePos *aTabPos, WW8PLCFx_Cp_FKP* pPap);
1793     void Read_Shade(            sal_uInt16, const sal_uInt8* pData, short nLen );
1794     void Read_ANLevelNo(        sal_uInt16, const sal_uInt8* pData, short nLen );
1795     void Read_ANLevelDesc(      sal_uInt16, const sal_uInt8* pData, short nLen );
1796 
1797     // outline level Ver8
1798     void Read_POutLvl(sal_uInt16, const sal_uInt8* pData, short nLen);
1799 
1800     void Read_OLST(             sal_uInt16, const sal_uInt8* pData, short nLen );
1801 
1802     void Read_CharShadow(       sal_uInt16, const sal_uInt8* pData, short nLen );
1803     void Read_CharHighlight(    sal_uInt16, const sal_uInt8* pData, short nLen );
1804                                         // Ver8-Listen
1805 
1806     void Read_ListLevel(        sal_uInt16 nId, const sal_uInt8* pData, short nLen);
1807 
1808     /**
1809      * read and interpret the sprmPIlfo used to determine which list
1810      * contains the paragraph.
1811      * @param     nId   unused (sprm value, 0x460b for sprmPIlfo).
1812      * @param[in] pData operand.
1813      * @param[in] nLen  size of the operand (pData) in byte, should be 2.
1814      *                  -1 to indicate the actual level is finished.
1815      */
1816     void Read_LFOPosition(      sal_uInt16 nId, const sal_uInt8* pData, short nLen);
1817     bool SetTextFormatCollAndListLevel(const SwPaM& rRg, SwWW8StyInf& rStyleInfo);
1818 
1819     void Read_StyleCode(sal_uInt16, const sal_uInt8* pData, short nLen);
1820     void Read_Majority(sal_uInt16, const sal_uInt8* , short );
1821     void Read_DoubleLine_Rotate( sal_uInt16, const sal_uInt8* pDATA, short nLen);
1822 
1823     void Read_TextForeColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1824     void Read_TextBackColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1825     void Read_ParaBackColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1826     void Read_ParaBiDi(sal_uInt16, const sal_uInt8* pData, short nLen);
1827     static Color ExtractColour(const sal_uInt8* &rpData, bool bVer67);
1828 
1829     void Read_TextVerticalAdjustment(sal_uInt16, const sal_uInt8* pData, short nLen);
1830     void Read_UnderlineColor(sal_uInt16, const sal_uInt8* pData, short nLen);
1831     long MapBookmarkVariables(const WW8FieldDesc* pF, OUString &rOrigName,
1832         const OUString &rData);
1833     OUString GetMappedBookmark(const OUString &rOrigName);
1834 
1835     // fields
1836     eF_ResT Read_F_Input(WW8FieldDesc*, OUString& rStr);
1837     eF_ResT Read_F_InputVar(WW8FieldDesc*, OUString& rStr);
1838     eF_ResT Read_F_ANumber( WW8FieldDesc*, OUString& );
1839     eF_ResT Read_F_DocInfo( WW8FieldDesc* pF, OUString& rStr );
1840     eF_ResT Read_F_Author( WW8FieldDesc*, OUString& );
1841     eF_ResT Read_F_TemplName( WW8FieldDesc*, OUString& );
1842     SvNumFormatType GetTimeDatePara(OUString const & rStr, sal_uInt32& rFormat, LanguageType &rLang,
1843         int nWhichDefault, bool bHijri = false);
1844     bool ForceFieldLanguage(SwField &rField, LanguageType nLang);
1845     eF_ResT Read_F_DateTime( WW8FieldDesc*, OUString& rStr );
1846     eF_ResT Read_F_FileName( WW8FieldDesc*, OUString& rStr);
1847     eF_ResT Read_F_Num( WW8FieldDesc* pF, OUString& );
1848     eF_ResT Read_F_CurPage( WW8FieldDesc*, OUString& );
1849     eF_ResT Read_F_Ref( WW8FieldDesc* pF, OUString& );
1850 
1851     eF_ResT Read_F_Set( WW8FieldDesc*, OUString& rStr );
1852     eF_ResT Read_F_PgRef( WW8FieldDesc*, OUString& rStr );
1853     eF_ResT Read_F_NoteReference( WW8FieldDesc* pF, OUString& rStr );
1854 
1855     eF_ResT Read_F_Tox( WW8FieldDesc* pF, OUString& rStr );
1856     eF_ResT Read_F_Symbol( WW8FieldDesc*, OUString& rStr );
1857     eF_ResT Read_F_Embedd( WW8FieldDesc*, OUString& rStr );
1858     eF_ResT Read_F_FormTextBox( WW8FieldDesc* pF, OUString& rStr);
1859     eF_ResT Read_F_FormCheckBox( WW8FieldDesc* pF, OUString& rStr );
1860     eF_ResT Read_F_FormListBox( WW8FieldDesc* pF, OUString& rStr);
1861     css::awt::Size MiserableDropDownFormHack(const OUString &rString,
1862         css::uno::Reference<css::beans::XPropertySet> const & rPropSet);
1863 
1864     eF_ResT Read_F_Macro( WW8FieldDesc*, OUString& rStr);
1865     eF_ResT Read_F_DBField( WW8FieldDesc*, OUString& rStr );
1866     eF_ResT Read_F_DBNext( WW8FieldDesc*, OUString& );
1867     eF_ResT Read_F_DBNum( WW8FieldDesc*, OUString& );
1868     eF_ResT Read_F_Equation( WW8FieldDesc*, OUString& );
1869     void Read_SubF_Ruby( msfilter::util::WW8ReadFieldParams& rReadParam);
1870     eF_ResT Read_F_IncludePicture( WW8FieldDesc*, OUString& rStr );
1871     eF_ResT Read_F_IncludeText(    WW8FieldDesc*, OUString& rStr );
1872     eF_ResT Read_F_Seq( WW8FieldDesc*, OUString& rStr );
1873     /// Reads a STYLEREF field.
1874     eF_ResT Read_F_Styleref(WW8FieldDesc*, OUString& rStr);
1875 
1876     eF_ResT Read_F_OCX(WW8FieldDesc*, OUString&);
1877     eF_ResT Read_F_Hyperlink(WW8FieldDesc*, OUString& rStr);
1878     eF_ResT Read_F_Shape(WW8FieldDesc* pF, OUString& rStr);
1879     eF_ResT Read_F_HTMLControl( WW8FieldDesc* pF, OUString& rStr);
1880 
1881     short ImportSprm(const sal_uInt8* pPos, sal_Int32 nMemLen, sal_uInt16 nId = 0);
1882 
1883     bool SearchRowEnd(WW8PLCFx_Cp_FKP* pPap,WW8_CP &rStartCp, int nLevel) const;
1884     /// Seek to the end of the table with pPap, returns true on success.
1885     bool SearchTableEnd(WW8PLCFx_Cp_FKP* pPap) const;
1886     bool FloatingTableConversion(WW8PLCFx_Cp_FKP* pPap);
1887 
GetFib() const1888     const WW8Fib& GetFib() const    { return *m_xWwFib; }
GetDoc() const1889     SwDoc& GetDoc() const           { return m_rDoc; }
GetCurrentColl() const1890     sal_uInt16 GetCurrentColl()  const     { return m_nCurrentColl; }
SetNCurrentColl(sal_uInt16 nColl)1891     void SetNCurrentColl( sal_uInt16 nColl ) { m_nCurrentColl = nColl;    }
1892     std::unique_ptr<SfxItemSet> SetCurrentItemSet(std::unique_ptr<SfxItemSet> pItemSet);
1893     sal_uInt16 StyleUsingLFO( sal_uInt16 nLFOIndex ) const ;
1894     const SwFormat* GetStyleWithOrgWWName( OUString const & rName ) const ;
1895 
1896     static bool GetPictGrafFromStream(Graphic& rGraphic, SvStream& rSrc);
1897     static void PicRead( SvStream *pDataStream, WW8_PIC *pPic, bool bVer67);
1898     static bool ImportOleWMF(const tools::SvRef<SotStorage>& xSrc1, GDIMetaFile& rWMF, long& rX,
1899                              long& rY);
1900     static Color GetCol(sal_uInt8 nIco);
1901 
1902     SwWW8ImplReader( sal_uInt8 nVersionPara, SotStorage* pStorage, SvStream* pSt,
1903         SwDoc& rD, const OUString& rBaseURL, bool bNewDoc, bool bSkipImages, SwPosition const &rPos );
1904 
GetBaseURL() const1905     const OUString& GetBaseURL() const { return m_sBaseURL; }
1906     // load a complete doc file
1907     ErrCode LoadDoc(WW8Glossary *pGloss=nullptr);
1908     rtl_TextEncoding GetCurrentCharSet();
1909     rtl_TextEncoding GetCurrentCJKCharSet();
1910     rtl_TextEncoding GetCharSetFromLanguage();
1911     rtl_TextEncoding GetCJKCharSetFromLanguage();
1912 
1913     void PostProcessAttrs();
1914     void ReadEmbeddedData(SvStream& rStrm, SwDocShell const * pDocShell, struct HyperLinksTable& hlStr);
1915     void NotifyMacroEventRead();
1916 };
1917 
1918 bool CanUseRemoteLink(const OUString &rGrfName);
1919 void UseListIndent(SwWW8StyInf &rStyle, const SwNumFormat &rFormat);
1920 void SetStyleIndent(SwWW8StyInf &rStyleInfo, const SwNumFormat &rFormat);
1921 // #i103711#
1922 // #i105414#
1923 void SyncIndentWithList( SvxLRSpaceItem &rLR,
1924                          const SwNumFormat &rFormat,
1925                          const bool bFirstLineOfStSet,
1926                          const bool bLeftIndentSet );
1927 long GetListFirstLineIndent(const SwNumFormat &rFormat);
1928 OUString BookmarkToWriter(const OUString &rBookmark);
1929 bool RTLGraphicsHack(SwTwips &rLeft, SwTwips nWidth,
1930     sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft,
1931     SwTwips nPageRight, SwTwips nPageSize);
1932 void MatchEscherMirrorIntoFlySet(const SvxMSDffImportRec &rRecord,
1933     SfxItemSet &rFlySet);
1934 #endif
1935 
1936 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1937