LibreOffice Module sw (master)  1
ww8glsy.cxx
Go to the documentation of this file.
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 #include <memory>
21 #include <tools/urlobj.hxx>
22 #include <svl/urihelper.hxx>
23 #include <osl/diagnose.h>
24 #include <ndtxt.hxx>
25 #include <pam.hxx>
26 #include <poolfmt.hxx>
27 #include <shellio.hxx>
28 #include <docsh.hxx>
29 #include <fmtanchr.hxx>
30 #include <frmfmt.hxx>
31 #include <doc.hxx>
33 #include <frameformats.hxx>
34 #include "ww8glsy.hxx"
35 #include "ww8par.hxx"
36 
38  : rStrm(refStrm)
39  , xStg(pStg)
40  , nStrings(0)
41 {
42  refStrm->SetEndian(SvStreamEndian::LITTLE);
43  WW8Fib aWwFib(*refStrm, nVersion);
44 
45  if (aWwFib.m_nFibBack >= 0x6A) //Word97
46  {
48  aWwFib.m_fWhichTableStm ? OUString(SL::a1Table) : OUString(SL::a0Table),
49  StreamMode::STD_READ);
50 
51  if (xTableStream.is() && ERRCODE_NONE == xTableStream->GetError())
52  {
53  xTableStream->SetEndian(SvStreamEndian::LITTLE);
54  xGlossary = std::make_shared<WW8GlossaryFib>(*refStrm, nVersion, aWwFib);
55  }
56  }
57 }
58 
60 {
61  bool bRet=false;
62  for( sal_uInt16 nCnt = pDoc->GetSpzFrameFormats()->size(); nCnt; )
63  {
64  const SwFrameFormat* pFrameFormat = (*pDoc->GetSpzFrameFormats())[ --nCnt ];
65  if ( RES_FLYFRMFMT != pFrameFormat->Which() &&
66  RES_DRAWFRMFMT != pFrameFormat->Which() )
67  continue;
68  const SwFormatAnchor& rAnchor = pFrameFormat->GetAnchor();
69  SwPosition const*const pAPos = rAnchor.GetContentAnchor();
70  if (pAPos &&
71  ((RndStdIds::FLY_AT_PARA == rAnchor.GetAnchorId()) ||
72  (RndStdIds::FLY_AT_CHAR == rAnchor.GetAnchorId())) &&
73  rIdx == pAPos->nNode.GetIndex() )
74  {
75  bRet=true;
76  break;
77  }
78  }
79  return bRet;
80 }
81 
83  bool bSaveRelFile, const std::vector<OUString>& rStrings,
84  const std::vector<ww::bytes>& rExtra)
85 {
86  // this code will be called after reading all text into the
87  // empty sections
88  const OUString aOldURL( rBlocks.GetBaseURL() );
89  bool bRet=false;
90  if( bSaveRelFile )
91  {
92  rBlocks.SetBaseURL(
94  INetURLObject(), rBlocks.GetFileName(),
96  }
97  else
98  rBlocks.SetBaseURL( OUString() );
99 
100  SwNodeIndex aDocEnd( pD->GetNodes().GetEndOfContent() );
101  SwNodeIndex aStart( *aDocEnd.GetNode().StartOfSectionNode(), 1 );
102 
103  // search the first NormalStartNode
104  while( !( aStart.GetNode().IsStartNode() && SwNormalStartNode ==
105  aStart.GetNode().GetStartNode()->GetStartNodeType()) &&
106  aStart < aDocEnd )
107  ++aStart;
108 
109  if( aStart < aDocEnd )
110  {
112  (RES_POOLCOLL_STANDARD, false);
113  sal_uInt16 nGlosEntry = 0;
114  SwContentNode* pCNd = nullptr;
115  do {
116  SwPaM aPam( aStart );
117  {
118  SwNodeIndex& rIdx = aPam.GetPoint()->nNode;
119  ++rIdx;
120  pCNd = rIdx.GetNode().GetTextNode();
121  if( nullptr == pCNd )
122  {
123  pCNd = pD->GetNodes().MakeTextNode( rIdx, pColl );
124  rIdx = *pCNd;
125  }
126  }
127  aPam.GetPoint()->nContent.Assign( pCNd, 0 );
128  aPam.SetMark();
129  {
130  SwNodeIndex& rIdx = aPam.GetPoint()->nNode;
131  rIdx = aStart.GetNode().EndOfSectionIndex() - 1;
132  if(( nullptr == ( pCNd = rIdx.GetNode().GetContentNode() ) )
133  || HasBareGraphicEnd(pD,rIdx))
134  {
135  ++rIdx;
136  pCNd = pD->GetNodes().MakeTextNode( rIdx, pColl );
137  rIdx = *pCNd;
138  }
139  }
140  aPam.GetPoint()->nContent.Assign( pCNd, pCNd->Len() );
141 
142  // now we have the right selection for one entry. Copy this to
143  // the defined TextBlock, but only if it is not an autocorrection
144  // entry (== -1) otherwise the group indicates the group in the
145  // sttbfglsystyle list that this entry belongs to. Unused at the
146  // moment
147  const ww::bytes &rData = rExtra[nGlosEntry];
148  sal_uInt16 n = SVBT16ToUInt16( &(rData[2]) );
149  if(n != 0xFFFF)
150  {
151  rBlocks.ClearDoc();
152  const OUString &rLNm = rStrings[nGlosEntry];
153 
154  OUString sShortcut = rLNm;
155 
156  // Need to check make sure the shortcut is not already being used
157  sal_Int32 nStart = 0;
158  sal_uInt16 nCurPos = rBlocks.GetIndex( sShortcut );
159  while( sal_uInt16(-1) != nCurPos )
160  {
161  sShortcut = rLNm + OUString::number(++nStart); // add a Number to it
162  nCurPos = rBlocks.GetIndex( sShortcut );
163  }
164 
165  if( rBlocks.BeginPutDoc( sShortcut, sShortcut )) // Make the shortcut and the name the same
166 
167  {
168  SwDoc* pGlDoc = rBlocks.GetDoc();
169  SwNodeIndex aIdx( pGlDoc->GetNodes().GetEndOfContent(),
170  -1 );
171  pCNd = aIdx.GetNode().GetContentNode();
172  SwPosition aPos(aIdx, SwIndex(pCNd, pCNd ? pCNd->Len() : 0));
174  rBlocks.PutDoc();
175  }
176  }
177  aStart = aStart.GetNode().EndOfSectionIndex() + 1;
178  ++nGlosEntry;
179  } while( aStart.GetNode().IsStartNode() &&
180  SwNormalStartNode == aStart.GetNode().
181  GetStartNode()->GetStartNodeType());
182  bRet=true;
183  }
184 
185 // this code will be called after reading all text into the empty sections
186 
187  rBlocks.SetBaseURL( aOldURL );
188  return bRet;
189 }
190 
191 bool WW8Glossary::Load( SwTextBlocks &rBlocks, bool bSaveRelFile )
192 {
193  bool bRet=false;
194  if (xGlossary && xGlossary->IsGlossaryFib() && rBlocks.StartPutMuchBlockEntries())
195  {
196  //read the names of the autotext entries
197  std::vector<OUString> aStrings;
198  std::vector<ww::bytes> aData;
199 
200  rtl_TextEncoding eStructCharSet =
201  WW8Fib::GetFIBCharset(xGlossary->m_chseTables, xGlossary->m_lid);
202 
203  WW8ReadSTTBF(true, *xTableStream, xGlossary->m_fcSttbfglsy,
204  xGlossary->m_lcbSttbfglsy, 0, eStructCharSet, aStrings, &aData );
205 
206  rStrm->Seek(0);
207 
208  nStrings = static_cast< sal_uInt16 >(aStrings.size());
209  if ( 0 != nStrings )
210  {
211  SfxObjectShellLock xDocSh(new SwDocShell(SfxObjectCreateMode::INTERNAL));
212  if (xDocSh->DoInitNew())
213  {
214  SwDoc *pD = static_cast<SwDocShell*>((&xDocSh))->GetDoc();
215 
216  SwNodeIndex aIdx(
218  if( !aIdx.GetNode().IsTextNode() )
219  {
220  OSL_ENSURE( false, "Where is the TextNode?" );
221  pD->GetNodes().GoNext( &aIdx );
222  }
223  SwPaM aPamo( aIdx );
224  aPamo.GetPoint()->nContent.Assign(aIdx.GetNode().GetContentNode(),
225  0);
226  std::unique_ptr<SwWW8ImplReader> xRdr(new SwWW8ImplReader(
227  xGlossary->m_nVersion, xStg.get(), rStrm.get(), *pD, rBlocks.GetBaseURL(),
228  true, false, *aPamo.GetPoint()));
229  xRdr->LoadDoc(this);
230  bRet = MakeEntries(pD, rBlocks, bSaveRelFile, aStrings, aData);
231  }
232  xDocSh->DoClose();
233  rBlocks.EndPutMuchBlockEntries();
234  }
235  }
236  return bRet;
237 }
238 
240 {
241  sal_uInt32 nGlossaryFibOffset = 0;
242  if ( rFib.m_fDot ) // it's a template
243  {
244  if ( rFib.m_pnNext )
245  nGlossaryFibOffset = ( rFib.m_pnNext * 512 );
246  }
247  return nGlossaryFibOffset;
248 }
249 
250 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
tools::SvRef< SotStorage > xStg
Definition: ww8glsy.hxx:78
bool is() const
virtual sal_Int32 Len() const
Definition: node.cxx:1246
constexpr OUStringLiteral a0Table
Definition: ww8scan.hxx:47
Represents the style of a paragraph.
Definition: fmtcol.hxx:56
Marks a position in the document model.
Definition: pam.hxx:35
std::shared_ptr< WW8GlossaryFib > xGlossary
Definition: ww8glsy.hxx:75
sal_uInt16 PutDoc()
Definition: swblocks.cxx:398
static bool HasBareGraphicEnd(SwDoc *pD, SwNodeIndex const &rIdx)
Definition: ww8glsy.cxx:59
SwNodeIndex nNode
Definition: pam.hxx:37
std::vector< sal_uInt8 > bytes
Definition: types.hxx:29
bool m_fDot
Definition: ww8scan.hxx:1147
sal_Int64 n
Definition: doc.hxx:188
const ContentProperties & rData
SwNode & GetNode() const
Definition: ndindex.hxx:119
WW8Glossary(tools::SvRef< SotStorageStream > &refStrm, sal_uInt8 nVersion, SotStorage *pStg)
Definition: ww8glsy.cxx:37
bool Load(SwTextBlocks &rBlocks, bool bSaveRelFile)
Definition: ww8glsy.cxx:191
tools::SvRef< SotStorageStream > xTableStream
Definition: ww8glsy.hxx:76
IDocumentContentOperations const & getIDocumentContentOperations() const
Definition: doc.cxx:315
const SwFrameFormats * GetSpzFrameFormats() const
Definition: doc.hxx:744
constexpr TypedWhichId< SwFlyFrameFormat > RES_FLYFRMFMT(156)
constexpr TypedWhichId< SwDrawFrameFormat > RES_DRAWFRMFMT(159)
SwIndex nContent
Definition: pam.hxx:38
static bool MakeEntries(SwDoc *pD, SwTextBlocks &rBlocks, bool bSaveRelFile, const std::vector< OUString > &rStrings, const std::vector< ww::bytes > &rExtra)
Definition: ww8glsy.cxx:82
IDocumentStylePoolAccess const & getIDocumentStylePoolAccess() const
Definition: doc.cxx:426
check if target position is in fly anchored at source range
sal_uLong GetIndex() const
Definition: ndindex.hxx:152
constexpr OUStringLiteral aData
Definition: ww8scan.hxx:48
SwNode & GetEndOfContent() const
Regular ContentSection (i.e. the BodyText).
Definition: ndarr.hxx:163
SwDoc * GetDoc()
returns Doc. But be careful!
Definition: docsh.hxx:203
PaM is Point and Mark: a selection of the document model.
Definition: pam.hxx:136
T * get() const
static SwNodePtr GetStartNode(SwOutlineNodes const *pOutlNds, int nOutlineLevel, SwOutlineNodes::size_type *nOutl)
Definition: docglbl.cxx:89
Style of a layout element.
Definition: frmfmt.hxx:58
void SetBaseURL(const OUString &rURL)
Definition: swblocks.cxx:565
const SwFormatAnchor & GetAnchor(bool=true) const
Definition: fmtanchr.hxx:81
const SwStartNode * StartOfSectionNode() const
Definition: node.hxx:132
const SwPosition * GetPoint() const
Definition: pam.hxx:207
virtual bool CopyRange(SwPaM &rPam, SwPosition &rPos, SwCopyFlags flags) const =0
Copy a selected content range to a position.
SwIndex & Assign(SwIndexReg *, sal_Int32)
Definition: index.cxx:206
RndStdIds GetAnchorId() const
Definition: fmtanchr.hxx:65
SVL_DLLPUBLIC Link< OUString *, bool > const & GetMaybeFileHdl()
tools::SvRef< SotStorageStream > OpenSotStream(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE)
const SwPosition * GetContentAnchor() const
Definition: fmtanchr.hxx:67
SwContentNode * GetContentNode()
Definition: node.hxx:616
FlyAnchors.
Definition: fmtanchr.hxx:34
Marks a character position inside a document model node.
Definition: index.hxx:33
void WW8ReadSTTBF(bool bVer8, SvStream &rStrm, sal_uInt32 nStart, sal_Int32 nLen, sal_uInt16 nExtraLen, rtl_TextEncoding eCS, std::vector< OUString > &rArray, std::vector< ww::bytes > *pExtraArray, std::vector< OUString > *pValueArray)
reads array of strings (see MS documentation: String Table stored in File) returns NOT the original p...
Definition: ww8scan.cxx:4146
void EndPutMuchBlockEntries()
Definition: swblocks.cxx:552
Marks a node in the document model.
Definition: ndindex.hxx:31
constexpr OUStringLiteral a1Table
Definition: ww8scan.hxx:46
SwDoc * GetDoc()
Definition: swblocks.cxx:470
sal_uInt16 nStrings
Definition: ww8glsy.hxx:79
bool BeginPutDoc(const OUString &, const OUString &)
Definition: swblocks.cxx:374
sal_uInt16 Which() const
for Querying of Writer-functions.
Definition: format.hxx:82
sal_uLong EndOfSectionIndex() const
Definition: node.hxx:678
OUString GetBaseURL() const
Definition: swblocks.cxx:558
#define ERRCODE_NONE
unsigned char sal_uInt8
sal_uInt16 GetIndex(const OUString &) const
Definition: swblocks.cxx:260
bool DoInitNew(SfxMedium *pMedium=nullptr)
SwNodes & GetNodes()
Definition: doc.hxx:409
virtual SwTextFormatColl * GetTextCollFromPool(sal_uInt16 nId, bool bRegardLanguage=true)=0
Return "Auto-Collection with ID.
static sal_uInt32 FindGlossaryFibOffset(const WW8Fib &rFib)
Definition: ww8glsy.cxx:239
sal_uInt16 m_nFibBack
Definition: ww8scan.hxx:1168
bool m_fWhichTableStm
Definition: ww8scan.hxx:1153
FIB - the File Information Block.
Definition: ww8scan.hxx:1104
WW8_PN m_pnNext
Definition: ww8scan.hxx:1145
void ClearDoc()
Definition: swblocks.cxx:477
size_t size() const
static rtl_TextEncoding GetFIBCharset(sal_uInt16 chs, LanguageType nLidLocale)
Definition: ww8scan.cxx:6665
virtual void SetMark()
Unless this is called, the getter method of Mark will return Point.
Definition: pam.cxx:478
tools::SvRef< SotStorageStream > & rStrm
Definition: ww8glsy.hxx:77
void SvStream & rStrm
SwContentNode * GoNext(SwNodeIndex *) const
Definition: nodes.cxx:1293
bool StartPutMuchBlockEntries()
Definition: swblocks.cxx:544
OUString const & GetFileName() const
Definition: swblocks.cxx:486
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
Definition: ndtxt.hxx:850
SwTextNode * MakeTextNode(const SwNodeIndex &rWhere, SwTextFormatColl *pColl, bool bNewFrames=true)
Implementations of "Make...Node" are in the given .cxx-files.
Definition: ndtxt.cxx:105
SVL_DLLPUBLIC OUString SmartRel2Abs(INetURLObject const &rTheBaseURIRef, OUString const &rTheRelURIRef, Link< OUString *, bool > const &rMaybeFileHdl=Link< OUString *, bool >(), bool bCheckFileExists=true, bool bIgnoreFragment=false, INetURLObject::EncodeMechanism eEncodeMechanism=INetURLObject::EncodeMechanism::WasEncoded, INetURLObject::DecodeMechanism eDecodeMechanism=INetURLObject::DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, FSysStyle eStyle=FSysStyle::Detect)