Line data Source code
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 <com/sun/star/embed/ElementModes.hpp>
21 : #include <com/sun/star/embed/XTransactedObject.hpp>
22 : #include <rtl/ustring.hxx>
23 : #include <sot/stg.hxx>
24 : #include <sfx2/docfile.hxx>
25 : #include <tools/urlobj.hxx>
26 : #include <unotools/localfilehelper.hxx>
27 : #include <unotools/ucbstreamhelper.hxx>
28 :
29 : #include <comphelper/storagehelper.hxx>
30 : #include <doc.hxx>
31 : #include <IDocumentUndoRedo.hxx>
32 : #include <IDocumentStylePoolAccess.hxx>
33 : #include <docsh.hxx>
34 : #include <pam.hxx>
35 : #include <swblocks.hxx>
36 : #include <ndtxt.hxx>
37 : #include <shellio.hxx>
38 : #include <poolfmt.hxx>
39 : #include <SwXMLTextBlocks.hxx>
40 : #include <SwXMLBlockImport.hxx>
41 : #include <SwXMLBlockExport.hxx>
42 : #include <swerror.h>
43 :
44 : using namespace ::com::sun::star;
45 :
46 162 : void SwXMLTextBlocks::InitBlockMode ( const uno::Reference < embed::XStorage >& rStorage )
47 : {
48 162 : xBlkRoot = rStorage;
49 162 : xRoot = 0;
50 162 : }
51 :
52 272 : void SwXMLTextBlocks::ResetBlockMode ( )
53 : {
54 272 : xBlkRoot = 0;
55 272 : xRoot = 0;
56 272 : }
57 :
58 118 : SwXMLTextBlocks::SwXMLTextBlocks( const OUString& rFile )
59 : : SwImpBlocks(rFile)
60 : , bAutocorrBlock(false)
61 : , bBlock(false)
62 : , nFlags(0)
63 118 : , nCurBlk(0)
64 : {
65 118 : SwDocShell* pDocSh = new SwDocShell ( SFX_CREATE_MODE_INTERNAL );
66 118 : if( !pDocSh->DoInitNew( 0 ) )
67 118 : return;
68 118 : bReadOnly = true;
69 118 : pDoc = pDocSh->GetDoc();
70 118 : xDocShellRef = pDocSh;
71 118 : pDoc->SetOle2Link( Link() );
72 118 : pDoc->GetIDocumentUndoRedo().DoUndo(false);
73 118 : pDoc->acquire();
74 118 : uno::Reference< embed::XStorage > refStg;
75 118 : if( !aDateModified.GetDate() || !aTimeModified.GetTime() )
76 4 : Touch(); // If it's created anew -> get a new timestamp
77 :
78 : try
79 : {
80 118 : refStg = comphelper::OStorageHelper::GetStorageFromURL( rFile, embed::ElementModes::READWRITE );
81 118 : bReadOnly = false;
82 : }
83 0 : catch(const uno::Exception&)
84 : {
85 : //FIXME: couldn't open the file - maybe it's readonly
86 : }
87 118 : if( !refStg.is())
88 : {
89 : try
90 : {
91 0 : refStg = comphelper::OStorageHelper::GetStorageFromURL( rFile, embed::ElementModes::READ );
92 : }
93 0 : catch(const uno::Exception&)
94 : {
95 : OSL_FAIL("exception while creating AutoText storage");
96 : }
97 : }
98 118 : InitBlockMode ( refStg );
99 118 : ReadInfo();
100 118 : ResetBlockMode ();
101 118 : bInfoChanged = false;
102 : }
103 :
104 0 : SwXMLTextBlocks::SwXMLTextBlocks( const uno::Reference < embed::XStorage >& rStg, const OUString& rName )
105 : : SwImpBlocks( rName )
106 : , bAutocorrBlock(false)
107 : , bBlock(false)
108 : , nFlags(0)
109 0 : , nCurBlk(0)
110 : {
111 0 : SwDocShell* pDocSh = new SwDocShell ( SFX_CREATE_MODE_INTERNAL );
112 0 : if( !pDocSh->DoInitNew( 0 ) )
113 0 : return;
114 0 : bReadOnly = false;
115 0 : pDoc = pDocSh->GetDoc();
116 0 : xDocShellRef = pDocSh;
117 0 : pDoc->SetOle2Link( Link() );
118 0 : pDoc->GetIDocumentUndoRedo().DoUndo(false);
119 0 : pDoc->acquire();
120 :
121 0 : InitBlockMode ( rStg );
122 0 : ReadInfo();
123 0 : bInfoChanged = false;
124 : }
125 :
126 354 : SwXMLTextBlocks::~SwXMLTextBlocks()
127 : {
128 118 : if ( bInfoChanged )
129 8 : WriteInfo();
130 118 : ResetBlockMode ();
131 118 : if(xDocShellRef.Is())
132 118 : xDocShellRef->DoClose();
133 118 : xDocShellRef = 0;
134 118 : if( pDoc && !pDoc->release() )
135 118 : delete pDoc;
136 236 : }
137 :
138 22 : void SwXMLTextBlocks::ClearDoc()
139 : {
140 22 : SwDocShell * pDocShell = pDoc->GetDocShell();
141 22 : pDocShell->InvalidateModel();
142 22 : pDocShell->ReactivateModel();
143 :
144 22 : pDoc->ClearDoc();
145 22 : pDocShell->ClearEmbeddedObjects();
146 22 : }
147 :
148 14 : void SwXMLTextBlocks::AddName( const OUString& rShort, const OUString& rLong, bool bOnlyTxt )
149 : {
150 14 : aPackageName = GeneratePackageName( rShort );
151 14 : AddName(rShort, rLong, aPackageName, bOnlyTxt);
152 14 : }
153 :
154 82 : void SwXMLTextBlocks::AddName( const OUString& rShort, const OUString& rLong,
155 : const OUString& rPackageName, bool bOnlyTxt )
156 : {
157 82 : sal_uInt16 nIdx = GetIndex( rShort );
158 82 : if (nIdx != USHRT_MAX)
159 : {
160 0 : delete aNames[nIdx];
161 0 : aNames.erase( aNames.begin() + nIdx );
162 : }
163 82 : SwBlockName* pNew = new SwBlockName( rShort, rLong, rPackageName );
164 82 : pNew->bIsOnlyTxtFlagInit = true;
165 82 : pNew->bIsOnlyTxt = bOnlyTxt;
166 82 : aNames.insert( pNew );
167 82 : bInfoChanged = true;
168 82 : }
169 :
170 10 : sal_uLong SwXMLTextBlocks::Delete( sal_uInt16 n )
171 : {
172 10 : const OUString aPckName (aNames[n]->aPackageName);
173 20 : uno::Reference < container::XNameAccess > xAccess( xBlkRoot, uno::UNO_QUERY );
174 30 : if ( xAccess.is() &&
175 20 : xAccess->hasByName( aPckName ) && xBlkRoot->isStreamElement( aPckName ) )
176 : {
177 : try
178 : {
179 0 : xBlkRoot->removeElement ( aPckName );
180 0 : uno::Reference < embed::XTransactedObject > xTrans( xBlkRoot, uno::UNO_QUERY );
181 0 : if ( xTrans.is() )
182 0 : xTrans->commit();
183 0 : return 0;
184 : }
185 0 : catch (const uno::Exception&)
186 : {
187 0 : return ERR_SWG_WRITE_ERROR;
188 : }
189 : }
190 20 : return 0;
191 : }
192 :
193 2 : sal_uLong SwXMLTextBlocks::Rename( sal_uInt16 nIdx, const OUString& rNewShort, const OUString& )
194 : {
195 : OSL_ENSURE( xBlkRoot.is(), "No storage set" );
196 2 : if(!xBlkRoot.is())
197 0 : return 0;
198 2 : OUString aOldName (aNames[nIdx]->aPackageName);
199 2 : aShort = rNewShort;
200 2 : aPackageName = GeneratePackageName( aShort );
201 :
202 2 : if(aOldName != aPackageName)
203 : {
204 2 : if (IsOnlyTextBlock ( nIdx ) )
205 : {
206 2 : OUString sExt(".xml");
207 4 : OUString aOldStreamName( aOldName ); aOldStreamName += sExt;
208 4 : OUString aNewStreamName( aPackageName ); aNewStreamName += sExt;
209 :
210 2 : xRoot = xBlkRoot->openStorageElement( aOldName, embed::ElementModes::READWRITE );
211 : try
212 : {
213 2 : xRoot->renameElement ( aOldStreamName, aNewStreamName );
214 : }
215 0 : catch(const container::ElementExistException&)
216 : {
217 : SAL_WARN("sw", "Couldn't rename " << aOldStreamName << " to " << aNewStreamName);
218 : }
219 4 : uno::Reference < embed::XTransactedObject > xTrans( xRoot, uno::UNO_QUERY );
220 2 : if ( xTrans.is() )
221 2 : xTrans->commit();
222 4 : xRoot = 0;
223 : }
224 :
225 : try
226 : {
227 2 : xBlkRoot->renameElement ( aOldName, aPackageName );
228 : }
229 0 : catch(const container::ElementExistException&)
230 : {
231 : SAL_WARN("sw", "Couldn't rename " << aOldName << " to " << aPackageName);
232 : }
233 : }
234 4 : uno::Reference < embed::XTransactedObject > xTrans( xBlkRoot, uno::UNO_QUERY );
235 2 : if ( xTrans.is() )
236 2 : xTrans->commit();
237 : // No need to commit xBlkRoot here as SwTextBlocks::Rename calls
238 : // WriteInfo which does the commit
239 4 : return 0;
240 : }
241 :
242 0 : sal_uLong SwXMLTextBlocks::CopyBlock( SwImpBlocks& rDestImp, OUString& rShort,
243 : const OUString& rLong)
244 : {
245 0 : sal_uLong nError = 0;
246 0 : OpenFile(true);
247 0 : rDestImp.OpenFile(false);
248 0 : const OUString aGroup( rShort );
249 0 : bool bTextOnly = IsOnlyTextBlock ( rShort ) ;//pImp->pBlkRoot->IsStream( aGroup );
250 0 : sal_uInt16 nIndex = GetIndex ( rShort );
251 0 : OUString sDestShortName( GetPackageName (nIndex) );
252 0 : sal_uInt16 nIdx = 0;
253 :
254 : OSL_ENSURE( xBlkRoot.is(), "No storage set" );
255 0 : if(!xBlkRoot.is())
256 0 : return ERR_SWG_WRITE_ERROR;
257 :
258 0 : uno::Reference < container::XNameAccess > xAccess( ((SwXMLTextBlocks&)rDestImp).xBlkRoot, uno::UNO_QUERY );
259 0 : while ( xAccess->hasByName( sDestShortName ) )
260 : {
261 0 : ++nIdx;
262 : // If someone is that crazy ...
263 0 : if(USHRT_MAX == nIdx)
264 : {
265 0 : CloseFile();
266 0 : rDestImp.CloseFile();
267 0 : return ERR_SWG_WRITE_ERROR;
268 : }
269 0 : sDestShortName += OUString::number( nIdx );
270 : }
271 :
272 : try
273 : {
274 0 : uno::Reference < embed::XStorage > rSourceRoot = xBlkRoot->openStorageElement( aGroup, embed::ElementModes::READ );
275 0 : uno::Reference < embed::XStorage > rDestRoot = ((SwXMLTextBlocks&)rDestImp).xBlkRoot->openStorageElement( sDestShortName, embed::ElementModes::READWRITE );
276 0 : rSourceRoot->copyToStorage( rDestRoot );
277 : }
278 0 : catch (const uno::Exception&)
279 : {
280 0 : nError = ERR_SWG_WRITE_ERROR;
281 : }
282 :
283 0 : if(!nError)
284 : {
285 0 : rShort = sDestShortName;
286 0 : ((SwXMLTextBlocks&)rDestImp).AddName( rShort, rLong, bTextOnly );
287 0 : ((SwXMLTextBlocks&)rDestImp).MakeBlockList();
288 : }
289 0 : CloseFile();
290 0 : rDestImp.CloseFile();
291 0 : return nError;
292 : }
293 :
294 2 : sal_uLong SwXMLTextBlocks::StartPutBlock( const OUString& rShort, const OUString& rPackageName )
295 : {
296 : OSL_ENSURE( xBlkRoot.is(), "No storage set" );
297 2 : if(!xBlkRoot.is())
298 0 : return 0;
299 2 : GetIndex ( rShort );
300 : try
301 : {
302 2 : xRoot = xBlkRoot->openStorageElement( rPackageName, embed::ElementModes::READWRITE );
303 :
304 2 : uno::Reference< beans::XPropertySet > xRootProps( xRoot, uno::UNO_QUERY_THROW );
305 4 : OUString aPropName( "MediaType" );
306 4 : OUString aMime( SotExchange::GetFormatMimeType( SOT_FORMATSTR_ID_STARWRITER_8 ) );
307 4 : xRootProps->setPropertyValue( aPropName, uno::makeAny( aMime ) );
308 : }
309 0 : catch (const uno::Exception&)
310 : {
311 : }
312 2 : return 0;
313 : }
314 :
315 2 : sal_uLong SwXMLTextBlocks::BeginPutDoc( const OUString& rShort, const OUString& rLong )
316 : {
317 : // Store in base class
318 2 : aShort = rShort;
319 2 : aLong = rLong;
320 2 : aPackageName = GeneratePackageName( rShort );
321 2 : SetIsTextOnly( rShort, false);
322 2 : return StartPutBlock (rShort, aPackageName);
323 : }
324 :
325 2 : sal_uLong SwXMLTextBlocks::PutBlock( SwPaM& , const OUString& )
326 : {
327 2 : sal_uLong nRes = 0;
328 2 : sal_uInt16 nCommitFlags = nFlags & (SWXML_CONVBLOCK|SWXML_NOROOTCOMMIT);
329 :
330 2 : nFlags |= nCommitFlags;
331 :
332 2 : WriterRef xWrt;
333 2 : ::GetXMLWriter ( OUString(), GetBaseURL(), xWrt);
334 4 : SwWriter aWriter (xRoot, *pDoc );
335 :
336 2 : xWrt->bBlock = true;
337 2 : nRes = aWriter.Write ( xWrt );
338 2 : xWrt->bBlock = false;
339 : // Save OLE objects if there are some
340 2 : SwDocShell *pDocSh = pDoc->GetDocShell();
341 :
342 2 : bool bHasChildren = pDocSh && pDocSh->GetEmbeddedObjectContainer().HasEmbeddedObjects();
343 2 : if( !nRes && bHasChildren )
344 : {
345 : // we have to write to the temporary storage first, since the used below functions are optimized
346 : // TODO/LATER: it is only a temporary solution, that should be changed soon, the used methods should be
347 : // called without optimization
348 0 : bool bOK = false;
349 :
350 0 : if ( xRoot.is() )
351 : {
352 0 : SfxMedium* pTmpMedium = NULL;
353 : try
354 : {
355 : uno::Reference< embed::XStorage > xTempStorage =
356 0 : ::comphelper::OStorageHelper::GetTemporaryStorage();
357 :
358 0 : xRoot->copyToStorage( xTempStorage );
359 :
360 : // TODO/LATER: no progress bar?!
361 : // TODO/MBA: strange construct
362 0 : pTmpMedium = new SfxMedium( xTempStorage, GetBaseURL() );
363 0 : bool bTmpOK = pDocSh->SaveAsChildren( *pTmpMedium );
364 0 : if( bTmpOK )
365 0 : bTmpOK = pDocSh->SaveCompletedChildren( false );
366 :
367 0 : xTempStorage->copyToStorage( xRoot );
368 0 : bOK = bTmpOK;
369 : }
370 0 : catch(const uno::Exception&)
371 : {
372 : }
373 :
374 0 : if ( pTmpMedium )
375 0 : DELETEZ( pTmpMedium );
376 : }
377 :
378 0 : if( !bOK )
379 0 : nRes = ERR_SWG_WRITE_ERROR;
380 : }
381 :
382 : try
383 : {
384 2 : uno::Reference < embed::XTransactedObject > xTrans( xRoot, uno::UNO_QUERY );
385 2 : if ( xTrans.is() )
386 2 : xTrans->commit();
387 2 : xRoot = 0;
388 2 : if ( !nCommitFlags )
389 : {
390 2 : uno::Reference < embed::XTransactedObject > xTmpTrans( xBlkRoot, uno::UNO_QUERY );
391 2 : if ( xTmpTrans.is() )
392 2 : xTmpTrans->commit();
393 2 : }
394 : }
395 0 : catch (const uno::Exception&)
396 : {
397 : }
398 :
399 : //TODO/LATER: error handling
400 4 : return 0;
401 : }
402 :
403 2 : sal_uLong SwXMLTextBlocks::PutDoc()
404 : {
405 2 : SwPaM* pPaM = MakePaM();
406 2 : sal_uLong nErr = PutBlock(*pPaM, aLong);
407 2 : delete pPaM;
408 2 : return nErr;
409 : }
410 :
411 0 : sal_uLong SwXMLTextBlocks::GetText( sal_uInt16 nIdx, OUString& rText )
412 : {
413 0 : return GetBlockText( aNames[ nIdx ]->aShort, rText );
414 : }
415 :
416 0 : sal_uLong SwXMLTextBlocks::GetText( const OUString& rShort, OUString& rText )
417 : {
418 0 : return GetBlockText( rShort, rText );
419 : }
420 :
421 26 : sal_uLong SwXMLTextBlocks::MakeBlockList()
422 : {
423 26 : WriteInfo();
424 26 : return 0;
425 : }
426 :
427 0 : bool SwXMLTextBlocks::PutMuchEntries( bool bOn )
428 : {
429 0 : bool bRet = false;
430 0 : if( bOn )
431 : {
432 0 : if( bInPutMuchBlocks )
433 : {
434 : OSL_ENSURE( false, "Nested calls are not allowed");
435 : }
436 0 : else if( !IsFileChanged() )
437 : {
438 0 : bRet = 0 == OpenFile( false );
439 0 : if( bRet )
440 : {
441 0 : nFlags |= SWXML_NOROOTCOMMIT;
442 0 : bInPutMuchBlocks = true;
443 : }
444 : }
445 : }
446 0 : else if( bInPutMuchBlocks )
447 : {
448 0 : nFlags &= ~SWXML_NOROOTCOMMIT;
449 0 : if( xBlkRoot.is() )
450 : {
451 : try
452 : {
453 0 : uno::Reference < embed::XTransactedObject > xTrans( xBlkRoot, uno::UNO_QUERY );
454 0 : if ( xTrans.is() )
455 0 : xTrans->commit();
456 0 : MakeBlockList();
457 0 : CloseFile();
458 0 : Touch();
459 0 : bInPutMuchBlocks = false;
460 0 : bRet = true;
461 : }
462 0 : catch (const uno::Exception&)
463 : {
464 : }
465 : }
466 : }
467 0 : return bRet;
468 : }
469 :
470 44 : sal_uLong SwXMLTextBlocks::OpenFile( bool bRdOnly )
471 : {
472 44 : if( bAutocorrBlock )
473 0 : return 0;
474 44 : sal_uLong nRet = 0;
475 : try
476 : {
477 : uno::Reference < embed::XStorage > refStg = comphelper::OStorageHelper::GetStorageFromURL( aFile,
478 44 : bRdOnly ? embed::ElementModes::READ : embed::ElementModes::READWRITE );
479 44 : InitBlockMode ( refStg );
480 : }
481 0 : catch (const uno::Exception&)
482 : {
483 : //TODO/LATER: error handling
484 0 : nRet = 1;
485 : }
486 :
487 44 : return nRet;
488 : }
489 :
490 36 : void SwXMLTextBlocks::CloseFile()
491 : {
492 36 : if ( !bAutocorrBlock )
493 : {
494 36 : if (bInfoChanged)
495 0 : WriteInfo();
496 36 : ResetBlockMode();
497 : }
498 36 : }
499 :
500 14 : void SwXMLTextBlocks::SetIsTextOnly( const OUString& rShort, bool bNewValue )
501 : {
502 14 : sal_uInt16 nIdx = GetIndex ( rShort );
503 14 : if (nIdx != USHRT_MAX)
504 2 : aNames[nIdx]->bIsOnlyTxt = bNewValue;
505 14 : }
506 :
507 0 : void SwXMLTextBlocks::SetIsTextOnly( sal_uInt16 nIdx, bool bNewValue )
508 : {
509 0 : aNames[nIdx]->bIsOnlyTxt = bNewValue;
510 0 : }
511 :
512 0 : bool SwXMLTextBlocks::IsOnlyTextBlock( const OUString& rShort ) const
513 : {
514 0 : sal_uInt16 nIdx = GetIndex ( rShort );
515 0 : bool bRet = false;
516 0 : if (nIdx != USHRT_MAX)
517 : {
518 0 : bRet = aNames[nIdx]->bIsOnlyTxt;
519 : }
520 0 : return bRet;
521 : }
522 30 : bool SwXMLTextBlocks::IsOnlyTextBlock( sal_uInt16 nIdx ) const
523 : {
524 30 : return aNames[nIdx]->bIsOnlyTxt;
525 : }
526 :
527 114 : bool SwXMLTextBlocks::IsFileUCBStorage( const OUString & rFileName)
528 : {
529 114 : OUString aName( rFileName );
530 228 : INetURLObject aObj( aName );
531 114 : if ( aObj.GetProtocol() == INET_PROT_NOT_VALID )
532 : {
533 0 : OUString aURL;
534 0 : ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aName, aURL );
535 0 : aObj.SetURL( aURL );
536 0 : aName = aObj.GetMainURL( INetURLObject::NO_DECODE );
537 : }
538 :
539 114 : SvStream * pStm = ::utl::UcbStreamHelper::CreateStream( aName, STREAM_STD_READ );
540 114 : bool bRet = UCBStorage::IsStorageFile( pStm );
541 114 : delete pStm;
542 228 : return bRet;
543 : }
544 :
545 0 : short SwXMLTextBlocks::GetFileType ( void ) const
546 : {
547 0 : return SWBLK_XML;
548 : }
549 :
550 30 : OUString SwXMLTextBlocks::GeneratePackageName ( const OUString& rShort )
551 : {
552 30 : OString sByte(OUStringToOString(rShort, RTL_TEXTENCODING_UTF7));
553 60 : OUStringBuffer aBuf(OStringToOUString(sByte, RTL_TEXTENCODING_ASCII_US));
554 30 : const sal_Int32 nLen = aBuf.getLength();
555 466 : for (sal_Int32 nPos=0; nPos<nLen; ++nPos)
556 : {
557 436 : switch (aBuf[nPos])
558 : {
559 : case '!':
560 : case '/':
561 : case ':':
562 : case '.':
563 : case '\\':
564 0 : aBuf[nPos] = '_';
565 0 : break;
566 : default:
567 436 : break;
568 : }
569 : }
570 60 : return aBuf.makeStringAndClear();
571 : }
572 :
573 12 : sal_uLong SwXMLTextBlocks::PutText( const OUString& rShort, const OUString& rName,
574 : const OUString& rText )
575 : {
576 12 : sal_uLong nRes = 0;
577 12 : aShort = rShort;
578 12 : aLong = rName;
579 12 : aCur = rText;
580 12 : SetIsTextOnly( aShort, true );
581 12 : aPackageName = GeneratePackageName( rShort );
582 12 : ClearDoc();
583 12 : nRes = PutBlockText( rShort, rName, rText, aPackageName );
584 12 : return nRes;
585 : }
586 :
587 20 : void SwXMLTextBlocks::MakeBlockText( const OUString& rText )
588 : {
589 40 : SwTxtNode* pTxtNode = pDoc->GetNodes()[ pDoc->GetNodes().GetEndOfContent().
590 40 : GetIndex() - 1 ]->GetTxtNode();
591 20 : if( pTxtNode->GetTxtColl() == pDoc->GetDfltTxtFmtColl() )
592 0 : pTxtNode->ChgFmtColl( pDoc->getIDocumentStylePoolAccess().GetTxtCollFromPool( RES_POOLCOLL_STANDARD ));
593 :
594 20 : sal_Int32 nPos = 0;
595 36 : do
596 : {
597 36 : if ( nPos )
598 : {
599 16 : pTxtNode = (SwTxtNode*)pTxtNode->AppendNode( SwPosition( *pTxtNode ) );
600 : }
601 36 : SwIndex aIdx( pTxtNode );
602 36 : pTxtNode->InsertText( rText.getToken( 0, '\015', nPos ), aIdx );
603 36 : } while ( -1 != nPos );
604 290 : }
605 :
606 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|