LCOV - code coverage report
Current view: top level - sw/source/core/swg - SwXMLTextBlocks.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 188 315 59.7 %
Date: 2014-11-03 Functions: 25 33 75.8 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10