LCOV - code coverage report
Current view: top level - sfx2/source/doc - doctempl.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 220 773 28.5 %
Date: 2012-08-25 Functions: 39 83 47.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 187 1370 13.6 %

           Branch data     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                 :            : 
      21                 :            : #include <limits.h>
      22                 :            : #include <com/sun/star/uno/Any.h>
      23                 :            : #include <osl/mutex.hxx>
      24                 :            : #include <osl/thread.hxx>
      25                 :            : 
      26                 :            : #include <vcl/svapp.hxx>
      27                 :            : #include <vcl/settings.hxx>
      28                 :            : #include <unotools/localedatawrapper.hxx>
      29                 :            : #include <unotools/pathoptions.hxx>
      30                 :            : #include <tools/resary.hxx>
      31                 :            : #include <tools/string.hxx>
      32                 :            : #include <tools/urlobj.hxx>
      33                 :            : #include <svtools/ehdl.hxx>
      34                 :            : #include <svtools/sfxecode.hxx>
      35                 :            : #include <comphelper/processfactory.hxx>
      36                 :            : #include <ucbhelper/content.hxx>
      37                 :            : #include <com/sun/star/beans/PropertyAttribute.hpp>
      38                 :            : #include <com/sun/star/beans/PropertyValue.hpp>
      39                 :            : #include <com/sun/star/beans/XPropertyContainer.hpp>
      40                 :            : #include <com/sun/star/beans/XPropertySet.hpp>
      41                 :            : #include <com/sun/star/beans/XPropertySetInfo.hpp>
      42                 :            : #include <com/sun/star/document/XTypeDetection.hpp>
      43                 :            : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
      44                 :            : #include <com/sun/star/frame/XComponentLoader.hpp>
      45                 :            : #include <com/sun/star/frame/DocumentTemplates.hpp>
      46                 :            : #include <com/sun/star/frame/XDocumentTemplates.hpp>
      47                 :            : #include <com/sun/star/io/XInputStream.hpp>
      48                 :            : #include <com/sun/star/io/XPersist.hpp>
      49                 :            : #include <com/sun/star/lang/XLocalizable.hpp>
      50                 :            : #include <com/sun/star/sdbc/XResultSet.hpp>
      51                 :            : #include <com/sun/star/sdbc/XRow.hpp>
      52                 :            : #include <com/sun/star/ucb/ContentInfo.hpp>
      53                 :            : #include <com/sun/star/ucb/InsertCommandArgument.hpp>
      54                 :            : #include <com/sun/star/ucb/NameClash.hpp>
      55                 :            : #include <com/sun/star/ucb/TransferInfo.hpp>
      56                 :            : #include <com/sun/star/ucb/XCommandProcessor.hpp>
      57                 :            : #include <com/sun/star/ucb/XContent.hpp>
      58                 :            : #include <com/sun/star/ucb/XContentAccess.hpp>
      59                 :            : #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
      60                 :            : #include <com/sun/star/ucb/XAnyCompare.hpp>
      61                 :            : #include <com/sun/star/ucb/NumberedSortingInfo.hpp>
      62                 :            : #include <com/sun/star/embed/ElementModes.hpp>
      63                 :            : #include <com/sun/star/embed/XTransactedObject.hpp>
      64                 :            : 
      65                 :            : #include "sfxurlrelocator.hxx"
      66                 :            : 
      67                 :            : using namespace ::com::sun::star;
      68                 :            : using namespace ::com::sun::star::beans;
      69                 :            : using namespace ::com::sun::star::frame;
      70                 :            : using namespace ::com::sun::star::io;
      71                 :            : using namespace ::com::sun::star::lang;
      72                 :            : using namespace ::com::sun::star::sdbc;
      73                 :            : using namespace ::com::sun::star::uno;
      74                 :            : using namespace ::com::sun::star::ucb;
      75                 :            : using namespace ::com::sun::star::document;
      76                 :            : using namespace ::rtl;
      77                 :            : using namespace ::ucbhelper;
      78                 :            : 
      79                 :            : 
      80                 :            : #include <sfx2/doctempl.hxx>
      81                 :            : #include <sfx2/docfac.hxx>
      82                 :            : #include <sfx2/docfile.hxx>
      83                 :            : #include <sfx2/objsh.hxx>
      84                 :            : #include "sfxtypes.hxx"
      85                 :            : #include <sfx2/app.hxx>
      86                 :            : #include "sfx2/sfxresid.hxx"
      87                 :            : #include <sfx2/templatelocnames.hrc>
      88                 :            : #include "doc.hrc"
      89                 :            : #include <sfx2/fcontnr.hxx>
      90                 :            : #include <svtools/templatefoldercache.hxx>
      91                 :            : 
      92                 :            : #include <comphelper/storagehelper.hxx>
      93                 :            : #include <unotools/ucbhelper.hxx>
      94                 :            : 
      95                 :            : #include <vector>
      96                 :            : using ::std::vector;
      97                 :            : using ::std::advance;
      98                 :            : 
      99                 :            : //========================================================================
     100                 :            : 
     101                 :            : #define TITLE                   "Title"
     102                 :            : #define TARGET_URL              "TargetURL"
     103                 :            : 
     104                 :            : #define TARGET_DIR_URL          "TargetDirURL"
     105                 :            : #define COMMAND_TRANSFER        "transfer"
     106                 :            : 
     107                 :            : #define SERVICENAME_DOCINFO             "com.sun.star.document.DocumentProperties"
     108                 :            : #define SERVICENAME_DESKTOP             "com.sun.star.frame.Desktop"
     109                 :            : 
     110                 :            : //========================================================================
     111                 :            : 
     112                 :            : class RegionData_Impl;
     113                 :            : 
     114                 :            : namespace DocTempl {
     115                 :            : 
     116                 :         20 : class DocTempl_EntryData_Impl
     117                 :            : {
     118                 :            :     RegionData_Impl*    mpParent;
     119                 :            : 
     120                 :            :     // the following member must be SfxObjectShellLock since it controlls that SfxObjectShell lifetime by design
     121                 :            :     // and users of this class expect it to be so.
     122                 :            :     SfxObjectShellLock  mxObjShell;
     123                 :            : 
     124                 :            :     OUString            maTitle;
     125                 :            :     OUString            maOwnURL;
     126                 :            :     OUString            maTargetURL;
     127                 :            :     sal_Bool            mbIsOwner   : 1;
     128                 :            :     sal_Bool            mbDidConvert: 1;
     129                 :            : 
     130                 :            : private:
     131                 :          0 :     RegionData_Impl*    GetParent() const { return mpParent; }
     132                 :            : 
     133                 :            : public:
     134                 :            :                         DocTempl_EntryData_Impl( RegionData_Impl* pParent,
     135                 :            :                                         const OUString& rTitle );
     136                 :            : 
     137                 :          0 :     const OUString&     GetTitle() const { return maTitle; }
     138                 :            :     const OUString&     GetTargetURL();
     139                 :            :     const OUString&     GetHierarchyURL();
     140                 :            : 
     141                 :          0 :     void                SetTitle( const OUString& rTitle ) { maTitle = rTitle; }
     142                 :         20 :     void                SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; }
     143                 :         20 :     void                SetHierarchyURL( const OUString& rURL) { maOwnURL = rURL; }
     144                 :            : 
     145                 :            :     int                 Compare( const OUString& rTitle ) const;
     146                 :            : 
     147                 :            :     SfxObjectShellRef   CreateObjectShell();
     148                 :            :     sal_Bool                DeleteObjectShell();
     149                 :            : };
     150                 :            : 
     151                 :            : }
     152                 :            : 
     153                 :            : using namespace ::DocTempl;
     154                 :            : 
     155                 :            : // ------------------------------------------------------------------------
     156                 :            : 
     157                 :            : class RegionData_Impl
     158                 :            : {
     159                 :            :     const SfxDocTemplate_Impl*  mpParent;
     160                 :            :     vector< DocTempl_EntryData_Impl* > maEntries;
     161                 :            :     OUString                    maTitle;
     162                 :            :     OUString                    maOwnURL;
     163                 :            :     OUString                    maTargetURL;
     164                 :            : 
     165                 :            : private:
     166                 :            :     size_t                      GetEntryPos( const OUString& rTitle,
     167                 :            :                                              sal_Bool& rFound ) const;
     168                 :          2 :     const SfxDocTemplate_Impl*  GetParent() const { return mpParent; }
     169                 :            : 
     170                 :            : public:
     171                 :            :                         RegionData_Impl( const SfxDocTemplate_Impl* pParent,
     172                 :            :                                          const OUString& rTitle );
     173                 :            :                         ~RegionData_Impl();
     174                 :            : 
     175                 :          0 :     void                SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; }
     176                 :          0 :     void                SetHierarchyURL( const OUString& rURL) { maOwnURL = rURL; }
     177                 :            : 
     178                 :            :     DocTempl_EntryData_Impl*     GetEntry( size_t nIndex ) const;
     179                 :            :     DocTempl_EntryData_Impl*     GetEntry( const OUString& rName ) const;
     180                 :            : 
     181                 :          8 :     const OUString&     GetTitle() const { return maTitle; }
     182                 :            :     const OUString&     GetTargetURL();
     183                 :            :     const OUString&     GetHierarchyURL();
     184                 :            : 
     185                 :            :     size_t              GetCount() const;
     186                 :            : 
     187                 :          0 :     void                SetTitle( const OUString& rTitle ) { maTitle = rTitle; }
     188                 :            : 
     189                 :            :     void                AddEntry( const OUString& rTitle,
     190                 :            :                                   const OUString& rTargetURL,
     191                 :            :                                   size_t *pPos = NULL );
     192                 :            :     void                DeleteEntry( size_t nIndex );
     193                 :            : 
     194                 :            :     int                 Compare( const OUString& rTitle ) const
     195                 :            :                             { return maTitle.compareTo( rTitle ); }
     196                 :            :     int                 Compare( RegionData_Impl* pCompareWith ) const;
     197                 :            : };
     198                 :            : 
     199                 :            : typedef vector< RegionData_Impl* > RegionList_Impl;
     200                 :            : 
     201                 :            : // ------------------------------------------------------------------------
     202                 :            : 
     203                 :            : class SfxDocTemplate_Impl : public SvRefBase
     204                 :            : {
     205                 :            :     uno::Reference< XPersist >               mxInfo;
     206                 :            :     uno::Reference< XDocumentTemplates >     mxTemplates;
     207                 :            : 
     208                 :            :     ::osl::Mutex        maMutex;
     209                 :            :     OUString            maRootURL;
     210                 :            :     OUString            maStandardGroup;
     211                 :            :     RegionList_Impl     maRegions;
     212                 :            :     sal_Bool            mbConstructed;
     213                 :            : 
     214                 :            :     uno::Reference< XAnyCompareFactory > m_rCompareFactory;
     215                 :            : 
     216                 :            :     // the following member is intended to prevent clearing of the global data when it is in use
     217                 :            :     // TODO/LATER: it still does not make the implementation complete thread-safe
     218                 :            :     sal_Int32           mnLockCounter;
     219                 :            : 
     220                 :            : private:
     221                 :            :     void                Clear();
     222                 :            : 
     223                 :            : public:
     224                 :            :                         SfxDocTemplate_Impl();
     225                 :            :                         ~SfxDocTemplate_Impl();
     226                 :            : 
     227                 :            :     void                IncrementLock();
     228                 :            :     void                DecrementLock();
     229                 :            : 
     230                 :            :     sal_Bool            Construct( );
     231                 :            :     void                CreateFromHierarchy( Content &rTemplRoot );
     232                 :            :     void                ReInitFromComponent();
     233                 :            :     void                AddRegion( const OUString& rTitle,
     234                 :            :                                    Content& rContent );
     235                 :            : 
     236                 :            :     void                Rescan();
     237                 :            : 
     238                 :            :     void                DeleteRegion( size_t nIndex );
     239                 :            : 
     240                 :          2 :     size_t              GetRegionCount() const
     241                 :          2 :                             { return maRegions.size(); }
     242                 :            :     RegionData_Impl*    GetRegion( const OUString& rName ) const;
     243                 :            :     RegionData_Impl*    GetRegion( size_t nIndex ) const;
     244                 :            : 
     245                 :            :     sal_Bool            GetTitleFromURL( const OUString& rURL, OUString& aTitle );
     246                 :            :     sal_Bool            InsertRegion( RegionData_Impl *pData, size_t nPos = size_t(-1) );
     247                 :          2 :     OUString            GetRootURL() const { return maRootURL; }
     248                 :            : 
     249                 :          0 :     uno::Reference< XDocumentTemplates >     getDocTemplates() { return mxTemplates; }
     250                 :            : };
     251                 :            : 
     252                 :            : // ------------------------------------------------------------------------
     253                 :            : 
     254                 :            : class DocTemplLocker_Impl
     255                 :            : {
     256                 :            :     SfxDocTemplate_Impl& m_aDocTempl;
     257                 :            : public:
     258                 :         16 :     DocTemplLocker_Impl( SfxDocTemplate_Impl& aDocTempl )
     259                 :         16 :     : m_aDocTempl( aDocTempl )
     260                 :            :     {
     261                 :         16 :         m_aDocTempl.IncrementLock();
     262                 :         16 :     }
     263                 :            : 
     264                 :         16 :     ~DocTemplLocker_Impl()
     265                 :            :     {
     266                 :         16 :         m_aDocTempl.DecrementLock();
     267                 :         16 :     }
     268                 :            : };
     269                 :            : 
     270                 :            : // ------------------------------------------------------------------------
     271                 :            : 
     272                 :            : #ifndef SFX_DECL_DOCTEMPLATES_DEFINED
     273                 :            : #define SFX_DECL_DOCTEMPLATES_DEFINED
     274                 :            : SV_DECL_REF(SfxDocTemplate_Impl)
     275                 :            : #endif
     276                 :            : 
     277 [ +  - ][ +  + ]:        111 : SV_IMPL_REF(SfxDocTemplate_Impl)
         [ +  + ][ +  + ]
                 [ +  + ]
     278                 :            : 
     279                 :            : // ------------------------------------------------------------------------
     280                 :            : 
     281                 :            : SfxDocTemplate_Impl *gpTemplateData = 0;
     282                 :            : 
     283                 :            : // -----------------------------------------------------------------------
     284                 :            : 
     285                 :            : static sal_Bool getTextProperty_Impl( Content& rContent,
     286                 :            :                                       const OUString& rPropName,
     287                 :            :                                       OUString& rPropValue );
     288                 :            : 
     289                 :            : //========================================================================
     290                 :            : 
     291                 :          0 : String SfxDocumentTemplates::GetFullRegionName
     292                 :            : (
     293                 :            :     sal_uInt16 nIdx                     // Region Index
     294                 :            : )   const
     295                 :            : 
     296                 :            : /*  [Description]
     297                 :            : 
     298                 :            :     Returns the logical name of a region and its path
     299                 :            : 
     300                 :            :     [Return value]                 Reference to the Region name
     301                 :            : 
     302                 :            : */
     303                 :            : 
     304                 :            : {
     305                 :            :     // First: find the RegionData for the index
     306         [ #  # ]:          0 :     String aName;
     307                 :            : 
     308         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     309                 :            : 
     310 [ #  # ][ #  # ]:          0 :     if ( pImp->Construct() )
     311                 :            :     {
     312         [ #  # ]:          0 :         RegionData_Impl *pData1 = pImp->GetRegion( nIdx );
     313                 :            : 
     314         [ #  # ]:          0 :         if ( pData1 )
     315         [ #  # ]:          0 :             aName = pData1->GetTitle();
     316                 :            : 
     317                 :            :         // --**-- here was some code which appended the path to the
     318                 :            :         //      group if there was more than one with the same name.
     319                 :            :         //      this should not happen anymore
     320                 :            :     }
     321                 :            : 
     322         [ #  # ]:          0 :     return aName;
     323                 :            : }
     324                 :            : 
     325                 :            : //------------------------------------------------------------------------
     326                 :            : 
     327                 :          0 : const String& SfxDocumentTemplates::GetRegionName
     328                 :            : (
     329                 :            :     sal_uInt16 nIdx                 // Region Index
     330                 :            : )   const
     331                 :            : 
     332                 :            : /*  [Description]
     333                 :            : 
     334                 :            :     Returns the logical name of a region
     335                 :            : 
     336                 :            :     [Return value]
     337                 :            : 
     338                 :            :     const String&                   Reference to the Region name
     339                 :            : 
     340                 :            : */
     341                 :            : {
     342 [ #  # ][ #  # ]:          0 :     static String maTmpString;
         [ #  # ][ #  # ]
     343                 :            : 
     344         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     345                 :            : 
     346 [ #  # ][ #  # ]:          0 :     if ( pImp->Construct() )
     347                 :            :     {
     348         [ #  # ]:          0 :         RegionData_Impl *pData = pImp->GetRegion( nIdx );
     349                 :            : 
     350         [ #  # ]:          0 :         if ( pData )
     351         [ #  # ]:          0 :             maTmpString = pData->GetTitle();
     352                 :            :         else
     353         [ #  # ]:          0 :             maTmpString.Erase();
     354                 :            :     }
     355                 :            :     else
     356         [ #  # ]:          0 :         maTmpString.Erase();
     357                 :            : 
     358         [ #  # ]:          0 :     return maTmpString;
     359                 :            : }
     360                 :            : 
     361                 :            : //------------------------------------------------------------------------
     362                 :            : 
     363                 :          2 : sal_uInt16 SfxDocumentTemplates::GetRegionCount() const
     364                 :            : 
     365                 :            : /*  [Description]
     366                 :            : 
     367                 :            :     Returns the number of Regions
     368                 :            : 
     369                 :            :     [Return value]
     370                 :            : 
     371                 :            :     sal_uInt16                  Number of Regions
     372                 :            : */
     373                 :            : {
     374         [ +  - ]:          2 :     DocTemplLocker_Impl aLocker( *pImp );
     375                 :            : 
     376 [ +  - ][ -  + ]:          2 :     if ( !pImp->Construct() )
     377                 :          0 :         return 0;
     378                 :            : 
     379                 :          2 :     sal_uIntPtr nCount = pImp->GetRegionCount();
     380                 :            : 
     381         [ +  - ]:          2 :     return (sal_uInt16) nCount;
     382                 :            : }
     383                 :            : 
     384                 :            : //------------------------------------------------------------------------
     385                 :            : 
     386                 :          0 : sal_Bool SfxDocumentTemplates::IsRegionLoaded( sal_uInt16 nIdx ) const
     387                 :            : {
     388         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     389                 :            : 
     390 [ #  # ][ #  # ]:          0 :     if ( !pImp->Construct() )
     391                 :          0 :         return sal_False;
     392                 :            : 
     393         [ #  # ]:          0 :     RegionData_Impl *pData = pImp->GetRegion( nIdx );
     394                 :            : 
     395         [ #  # ]:          0 :     if ( pData )
     396                 :          0 :         return sal_True;
     397                 :            :     else
     398         [ #  # ]:          0 :         return sal_False;
     399                 :            : }
     400                 :            : 
     401                 :            : //------------------------------------------------------------------------
     402                 :            : 
     403                 :          0 : sal_uInt16 SfxDocumentTemplates::GetCount
     404                 :            : (
     405                 :            :     sal_uInt16 nRegion              /* Region index whose number is
     406                 :            :                                    to be determined */
     407                 :            : 
     408                 :            : )   const
     409                 :            : 
     410                 :            : /*  [Description]
     411                 :            : 
     412                 :            :     Number of entries in Region
     413                 :            : 
     414                 :            :     [Return value]                 Number of entries
     415                 :            : */
     416                 :            : 
     417                 :            : {
     418         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     419                 :            : 
     420 [ #  # ][ #  # ]:          0 :     if ( !pImp->Construct() )
     421                 :          0 :         return 0;
     422                 :            : 
     423         [ #  # ]:          0 :     RegionData_Impl *pData = pImp->GetRegion( nRegion );
     424                 :          0 :     sal_uIntPtr            nCount = 0;
     425                 :            : 
     426         [ #  # ]:          0 :     if ( pData )
     427                 :          0 :         nCount = pData->GetCount();
     428                 :            : 
     429         [ #  # ]:          0 :     return (sal_uInt16) nCount;
     430                 :            : }
     431                 :            : 
     432                 :            : //------------------------------------------------------------------------
     433                 :            : 
     434                 :          0 : const String& SfxDocumentTemplates::GetName
     435                 :            : (
     436                 :            :     sal_uInt16 nRegion,     //  Region Index, in which the entry lies
     437                 :            :     sal_uInt16 nIdx         //  Index of the entry
     438                 :            : )   const
     439                 :            : 
     440                 :            : /*  [Description]
     441                 :            : 
     442                 :            :     Returns the logical name of an entry in Region
     443                 :            : 
     444                 :            :     [Return value]
     445                 :            : 
     446                 :            :     const String&           Entry Name
     447                 :            : */
     448                 :            : 
     449                 :            : {
     450         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     451                 :            : 
     452 [ #  # ][ #  # ]:          0 :     static String maTmpString;
         [ #  # ][ #  # ]
     453                 :            : 
     454 [ #  # ][ #  # ]:          0 :     if ( pImp->Construct() )
     455                 :            :     {
     456                 :          0 :         DocTempl_EntryData_Impl  *pEntry = NULL;
     457         [ #  # ]:          0 :         RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
     458                 :            : 
     459         [ #  # ]:          0 :         if ( pRegion )
     460         [ #  # ]:          0 :             pEntry = pRegion->GetEntry( nIdx );
     461                 :            : 
     462         [ #  # ]:          0 :         if ( pEntry )
     463         [ #  # ]:          0 :             maTmpString = pEntry->GetTitle();
     464                 :            :         else
     465         [ #  # ]:          0 :             maTmpString.Erase();
     466                 :            :     }
     467                 :            :     else
     468         [ #  # ]:          0 :         maTmpString.Erase();
     469                 :            : 
     470         [ #  # ]:          0 :     return maTmpString;
     471                 :            : }
     472                 :            : 
     473                 :            : //------------------------------------------------------------------------
     474                 :            : 
     475                 :          0 : String SfxDocumentTemplates::GetFileName
     476                 :            : (
     477                 :            :     sal_uInt16 nRegion,     //  Region Index, in which the entry lies
     478                 :            :     sal_uInt16 nIdx         //  Index of the entry
     479                 :            : )   const
     480                 :            : 
     481                 :            : /*  [Description]
     482                 :            : 
     483                 :            :     Returns the file name of an entry in Region
     484                 :            : 
     485                 :            :     [Return value]                 File name of the entry
     486                 :            : */
     487                 :            : {
     488         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     489                 :            : 
     490 [ #  # ][ #  # ]:          0 :     if ( !pImp->Construct() )
     491         [ #  # ]:          0 :         return String();
     492                 :            : 
     493                 :          0 :     DocTempl_EntryData_Impl  *pEntry = NULL;
     494         [ #  # ]:          0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
     495                 :            : 
     496         [ #  # ]:          0 :     if ( pRegion )
     497         [ #  # ]:          0 :         pEntry = pRegion->GetEntry( nIdx );
     498                 :            : 
     499         [ #  # ]:          0 :     if ( pEntry )
     500                 :            :     {
     501 [ #  # ][ #  # ]:          0 :         INetURLObject aURLObj( pEntry->GetTargetURL() );
     502                 :            :         return aURLObj.getName( INetURLObject::LAST_SEGMENT, true,
     503 [ #  # ][ #  # ]:          0 :                                 INetURLObject::DECODE_WITH_CHARSET );
                 [ #  # ]
     504                 :            :     }
     505                 :            :     else
     506 [ #  # ][ #  # ]:          0 :         return String();
     507                 :            : }
     508                 :            : 
     509                 :            : //------------------------------------------------------------------------
     510                 :            : 
     511                 :          0 : String SfxDocumentTemplates::GetPath
     512                 :            : (
     513                 :            :     sal_uInt16  nRegion,    //  Region Index, in which the entry lies
     514                 :            :     sal_uInt16  nIdx        //  Index of the entry
     515                 :            : )   const
     516                 :            : 
     517                 :            : /*  [Description]
     518                 :            : 
     519                 :            :     Returns the file name with full path to the file assigned to an entry
     520                 :            : 
     521                 :            :     [Return value]
     522                 :            : 
     523                 :            :     String                  File name with full path
     524                 :            : */
     525                 :            : {
     526         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     527                 :            : 
     528 [ #  # ][ #  # ]:          0 :     if ( !pImp->Construct() )
     529         [ #  # ]:          0 :         return String();
     530                 :            : 
     531                 :          0 :     DocTempl_EntryData_Impl  *pEntry = NULL;
     532         [ #  # ]:          0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
     533                 :            : 
     534         [ #  # ]:          0 :     if ( pRegion )
     535         [ #  # ]:          0 :         pEntry = pRegion->GetEntry( nIdx );
     536                 :            : 
     537         [ #  # ]:          0 :     if ( pEntry )
     538 [ #  # ][ #  # ]:          0 :         return pEntry->GetTargetURL();
     539                 :            :     else
     540 [ #  # ][ #  # ]:          0 :         return String();
     541                 :            : }
     542                 :            : 
     543                 :            : //------------------------------------------------------------------------
     544                 :            : 
     545                 :          0 : ::rtl::OUString SfxDocumentTemplates::GetTemplateTargetURLFromComponent( const ::rtl::OUString& aGroupName,
     546                 :            :                                                                          const ::rtl::OUString& aTitle )
     547                 :            : {
     548         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     549                 :            : 
     550         [ #  # ]:          0 :     INetURLObject aTemplateObj( pImp->GetRootURL() );
     551                 :            : 
     552                 :            :     aTemplateObj.insertName( aGroupName, false,
     553                 :            :                         INetURLObject::LAST_SEGMENT, true,
     554         [ #  # ]:          0 :                         INetURLObject::ENCODE_ALL );
     555                 :            : 
     556                 :            :     aTemplateObj.insertName( aTitle, false,
     557                 :            :                         INetURLObject::LAST_SEGMENT, true,
     558         [ #  # ]:          0 :                         INetURLObject::ENCODE_ALL );
     559                 :            : 
     560                 :            : 
     561                 :          0 :     ::rtl::OUString aResult;
     562         [ #  # ]:          0 :     Content aTemplate;
     563                 :          0 :     uno::Reference< XCommandEnvironment > aCmdEnv;
     564 [ #  # ][ #  # ]:          0 :     if ( Content::create( aTemplateObj.GetMainURL( INetURLObject::NO_DECODE ), aCmdEnv, aTemplate ) )
                 [ #  # ]
     565                 :            :     {
     566                 :          0 :         OUString aPropName( TARGET_URL  );
     567         [ #  # ]:          0 :         getTextProperty_Impl( aTemplate, aPropName, aResult );
     568 [ #  # ][ #  # ]:          0 :         aResult = SvtPathOptions().SubstituteVariable( aResult );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     569                 :            :     }
     570                 :            : 
     571 [ #  # ][ #  # ]:          0 :     return aResult;
                 [ #  # ]
     572                 :            : }
     573                 :            : 
     574                 :            : //------------------------------------------------------------------------
     575                 :            : 
     576                 :            : /** Convert a resource string - a template name - to its localised pair if it exists.
     577                 :            :     @param nSourceResIds
     578                 :            :         Resource ID where the list of original en-US template names begin.
     579                 :            :     @param nDestResIds
     580                 :            :         Resource ID where the list of localised template names begin.
     581                 :            :     @param nCount
     582                 :            :         The number of names that have been localised.
     583                 :            :     @param rString
     584                 :            :         Name to be translated.
     585                 :            :     @return
     586                 :            :         The localised pair of rString or rString if the former does not exist.
     587                 :            : */
     588                 :         20 : OUString SfxDocumentTemplates::ConvertResourceString (
     589                 :            :     int nSourceResIds, int nDestResIds, int nCount, const OUString& rString )
     590                 :            : {
     591         [ +  - ]:        110 :     for( int i = 0; i < nCount; ++i )
     592                 :            :     {
     593 [ +  - ][ +  + ]:        110 :         if( rString == SFX2_RESSTR(nSourceResIds + i))
     594         [ +  - ]:         20 :             return SFX2_RESSTR(nDestResIds + i);
     595                 :            :     }
     596                 :         20 :     return rString;
     597                 :            : }
     598                 :            : 
     599                 :            : //------------------------------------------------------------------------
     600                 :            : 
     601                 :          0 : sal_Bool SfxDocumentTemplates::CopyOrMove
     602                 :            : (
     603                 :            :     sal_uInt16  nTargetRegion,      //  Target Region Index
     604                 :            :     sal_uInt16  nTargetIdx,         //  Target position Index
     605                 :            :     sal_uInt16  nSourceRegion,      //  Source Region Index
     606                 :            :     sal_uInt16  nSourceIdx,         /*  Index to be copied / to moved template */
     607                 :            :     sal_Bool    bMove           //  Copy / Move
     608                 :            : )
     609                 :            : 
     610                 :            : /*  [Description]
     611                 :            : 
     612                 :            :     Copy or move a document template
     613                 :            : 
     614                 :            :     [Return value]
     615                 :            : 
     616                 :            :     sal_Bool            sal_True,   Action could be performed
     617                 :            :                         sal_False,  Action could not be performed
     618                 :            : 
     619                 :            :     [Cross-references]
     620                 :            : 
     621                 :            :     <SfxDocumentTemplates::Move(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16)>
     622                 :            :     <SfxDocumentTemplates::Copy(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16)>
     623                 :            : */
     624                 :            : 
     625                 :            : {
     626                 :            :     /* to perform a copy or move, we need to send a transfer command to
     627                 :            :        the destination folder with the URL of the source as parameter.
     628                 :            :        ( If the destination content doesn't support the transfer command,
     629                 :            :        we could try a copy ( and delete ) instead. )
     630                 :            :        We need two transfers ( one for the real template and one for its
     631                 :            :        representation in the hierarchy )
     632                 :            :        ...
     633                 :            :     */
     634                 :            : 
     635         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     636                 :            : 
     637 [ #  # ][ #  # ]:          0 :     if ( !pImp->Construct() )
     638                 :          0 :         return sal_False;
     639                 :            : 
     640                 :            :     // Don't copy or move any folders
     641         [ #  # ]:          0 :     if( nSourceIdx == USHRT_MAX )
     642                 :          0 :         return sal_False ;
     643                 :            : 
     644         [ #  # ]:          0 :     if ( nSourceRegion == nTargetRegion )
     645                 :            :     {
     646                 :            :         SAL_WARN( "sfx2.doc", "Don't know, what to do!" );
     647                 :          0 :         return sal_False;
     648                 :            :     }
     649                 :            : 
     650         [ #  # ]:          0 :     RegionData_Impl *pSourceRgn = pImp->GetRegion( nSourceRegion );
     651         [ #  # ]:          0 :     if ( !pSourceRgn )
     652                 :          0 :         return sal_False;
     653                 :            : 
     654         [ #  # ]:          0 :     DocTempl_EntryData_Impl *pSource = pSourceRgn->GetEntry( nSourceIdx );
     655         [ #  # ]:          0 :     if ( !pSource )
     656                 :          0 :         return sal_False;
     657                 :            : 
     658         [ #  # ]:          0 :     RegionData_Impl *pTargetRgn = pImp->GetRegion( nTargetRegion );
     659         [ #  # ]:          0 :     if ( !pTargetRgn )
     660                 :          0 :         return sal_False;
     661                 :            : 
     662                 :          0 :     OUString aTitle = pSource->GetTitle();
     663                 :            : 
     664         [ #  # ]:          0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
     665                 :            : 
     666 [ #  # ][ #  # ]:          0 :     if ( xTemplates->addTemplate( pTargetRgn->GetTitle(),
     667                 :            :                                   aTitle,
     668   [ #  #  #  # ]:          0 :                                   pSource->GetTargetURL() ) )
     669                 :            :     {
     670                 :            : 
     671 [ #  # ][ #  # ]:          0 :         INetURLObject aSourceObj( pSource->GetTargetURL() );
     672                 :            : 
     673         [ #  # ]:          0 :         ::rtl::OUString aNewTargetURL = GetTemplateTargetURLFromComponent( pTargetRgn->GetTitle(), aTitle );
     674         [ #  # ]:          0 :         if ( aNewTargetURL.isEmpty() )
     675                 :          0 :             return sal_False;
     676                 :            : 
     677         [ #  # ]:          0 :         if ( bMove )
     678                 :            :         {
     679                 :            :             // --**-- delete the original file
     680         [ #  # ]:          0 :             sal_Bool bDeleted = xTemplates->removeTemplate( pSourceRgn->GetTitle(),
     681         [ #  # ]:          0 :                                                             pSource->GetTitle() );
     682         [ #  # ]:          0 :             if ( bDeleted )
     683         [ #  # ]:          0 :                 pSourceRgn->DeleteEntry( nSourceIdx );
     684                 :            :             else
     685                 :            :             {
     686 [ #  # ][ #  # ]:          0 :                 if ( xTemplates->removeTemplate( pTargetRgn->GetTitle(), aTitle ) )
                 [ #  # ]
     687                 :          0 :                     return sal_False; // will trigger tetry with copy instead of move
     688                 :            : 
     689                 :            :                 // if it is not possible to remove just created template ( must be possible! )
     690                 :            :                 // it is better to report success here, since at least the copy has succeeded
     691                 :            :                 // TODO/LATER: solve it more gracefully in future
     692                 :            :             }
     693                 :            :         }
     694                 :            : 
     695                 :            :         // todo: fix SfxDocumentTemplates to handle size_t instead of sal_uInt16
     696                 :          0 :         size_t temp_nTargetIdx = nTargetIdx;
     697         [ #  # ]:          0 :         pTargetRgn->AddEntry( aTitle, aNewTargetURL, &temp_nTargetIdx );
     698                 :            : 
     699         [ #  # ]:          0 :         return sal_True;
     700                 :            :     }
     701                 :            : 
     702                 :            :     // --**-- if the current file is opened,
     703                 :            :     // it must be re-opened afterwards.
     704                 :            : 
     705         [ #  # ]:          0 :     return sal_False;
     706                 :            : }
     707                 :            : 
     708                 :            : //------------------------------------------------------------------------
     709                 :            : 
     710                 :          0 : sal_Bool SfxDocumentTemplates::Move
     711                 :            : (
     712                 :            :     sal_uInt16 nTargetRegion,       //  Target Region Index
     713                 :            :     sal_uInt16 nTargetIdx,          //  Target position Index
     714                 :            :     sal_uInt16 nSourceRegion,       //  Source Region Index
     715                 :            :     sal_uInt16 nSourceIdx           /*  Index to be copied / to moved template */
     716                 :            : )
     717                 :            : 
     718                 :            : /*  [Description]
     719                 :            : 
     720                 :            :     Moving a template
     721                 :            : 
     722                 :            :     [Return value]
     723                 :            : 
     724                 :            :     sal_Bool            sal_True,   Action could be performed
     725                 :            :                         sal_False,  Action could not be performed
     726                 :            : 
     727                 :            :     [Cross-references]
     728                 :            : 
     729                 :            :     <SfxDocumentTemplates::CopyOrMove(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16,sal_Bool)>
     730                 :            : */
     731                 :            : {
     732         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     733                 :            : 
     734                 :            :     return CopyOrMove( nTargetRegion, nTargetIdx,
     735 [ #  # ][ #  # ]:          0 :                        nSourceRegion, nSourceIdx, sal_True );
     736                 :            : }
     737                 :            : 
     738                 :            : //------------------------------------------------------------------------
     739                 :            : 
     740                 :          0 : sal_Bool SfxDocumentTemplates::Copy
     741                 :            : (
     742                 :            :     sal_uInt16 nTargetRegion,       //  Target Region Index
     743                 :            :     sal_uInt16 nTargetIdx,          //  Target position Index
     744                 :            :     sal_uInt16 nSourceRegion,       //  Source Region Index
     745                 :            :     sal_uInt16 nSourceIdx           /*  Index to be copied / to moved template */
     746                 :            : )
     747                 :            : 
     748                 :            : /*  [Description]
     749                 :            : 
     750                 :            :     Copying a template
     751                 :            : 
     752                 :            :     [Return value]
     753                 :            : 
     754                 :            :     sal_Bool            sal_True,   Action could be performed
     755                 :            :                         sal_False,  Action could not be performed
     756                 :            : 
     757                 :            :     [Cross-references]
     758                 :            : 
     759                 :            :     <SfxDocumentTemplates::CopyOrMove(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16,sal_Bool)>
     760                 :            : */
     761                 :            : 
     762                 :            : {
     763         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     764                 :            : 
     765                 :            :     return CopyOrMove( nTargetRegion, nTargetIdx,
     766 [ #  # ][ #  # ]:          0 :                        nSourceRegion, nSourceIdx, sal_False );
     767                 :            : }
     768                 :            : 
     769                 :            : //------------------------------------------------------------------------
     770                 :            : 
     771                 :          0 : sal_Bool SfxDocumentTemplates::CopyTo
     772                 :            : (
     773                 :            :     sal_uInt16          nRegion,    //  Region of the template to be exported
     774                 :            :     sal_uInt16          nIdx,       //  Index of the template to be exported
     775                 :            :     const String&   rName       /*  File name under which the template is to
     776                 :            :                                     be created */
     777                 :            : )   const
     778                 :            : 
     779                 :            : /*  [Description]
     780                 :            : 
     781                 :            :     Exporting a template into the file system
     782                 :            : 
     783                 :            :     [Return value]
     784                 :            : 
     785                 :            :     sal_Bool            sal_True,   Action could be performed
     786                 :            :                         sal_False,  Action could not be performed
     787                 :            : 
     788                 :            :     [Cross-references]
     789                 :            : 
     790                 :            :     <SfxDocumentTemplates::CopyFrom(sal_uInt16,sal_uInt16,String&)>
     791                 :            : */
     792                 :            : 
     793                 :            : {
     794         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     795                 :            : 
     796 [ #  # ][ #  # ]:          0 :     if ( ! pImp->Construct() )
     797                 :          0 :         return sal_False;
     798                 :            : 
     799         [ #  # ]:          0 :     RegionData_Impl *pSourceRgn = pImp->GetRegion( nRegion );
     800         [ #  # ]:          0 :     if ( !pSourceRgn )
     801                 :          0 :         return sal_False;
     802                 :            : 
     803         [ #  # ]:          0 :     DocTempl_EntryData_Impl *pSource = pSourceRgn->GetEntry( nIdx );
     804         [ #  # ]:          0 :     if ( !pSource )
     805                 :          0 :         return sal_False;
     806                 :            : 
     807 [ #  # ][ #  # ]:          0 :     INetURLObject aTargetURL( rName );
     808                 :            : 
     809                 :            :     OUString aTitle( aTargetURL.getName( INetURLObject::LAST_SEGMENT, true,
     810         [ #  # ]:          0 :                                          INetURLObject::DECODE_WITH_CHARSET ) );
     811         [ #  # ]:          0 :     aTargetURL.removeSegment();
     812                 :            : 
     813         [ #  # ]:          0 :     OUString aParentURL = aTargetURL.GetMainURL( INetURLObject::NO_DECODE );
     814                 :            : 
     815                 :          0 :     uno::Reference< XCommandEnvironment > aCmdEnv;
     816         [ #  # ]:          0 :     Content aTarget;
     817                 :            : 
     818                 :            :     try
     819                 :            :     {
     820 [ #  # ][ #  # ]:          0 :         aTarget = Content( aParentURL, aCmdEnv );
                 [ #  # ]
     821                 :            : 
     822                 :          0 :         TransferInfo aTransferInfo;
     823                 :          0 :         aTransferInfo.MoveData = sal_False;
     824         [ #  # ]:          0 :         aTransferInfo.SourceURL = pSource->GetTargetURL();
     825                 :          0 :         aTransferInfo.NewTitle = aTitle;
     826                 :          0 :         aTransferInfo.NameClash = NameClash::OVERWRITE;
     827                 :            : 
     828         [ #  # ]:          0 :         Any aArg = makeAny( aTransferInfo );
     829                 :          0 :         OUString aCmd( COMMAND_TRANSFER  );
     830                 :            : 
     831      [ #  #  # ]:          0 :         aTarget.executeCommand( aCmd, aArg );
                 [ #  # ]
     832                 :            :     }
     833         [ #  # ]:          0 :     catch ( ContentCreationException& )
     834                 :          0 :     { return sal_False; }
     835         [ #  # ]:          0 :     catch ( Exception& )
     836                 :          0 :     { return sal_False; }
     837                 :            : 
     838 [ #  # ][ #  # ]:          0 :     return sal_True;
                 [ #  # ]
     839                 :            : }
     840                 :            : 
     841                 :            : //------------------------------------------------------------------------
     842                 :            : 
     843                 :          0 : sal_Bool SfxDocumentTemplates::CopyFrom
     844                 :            : (
     845                 :            :     sal_uInt16      nRegion,        /*  Region in which the template is to be
     846                 :            :                                     imported */
     847                 :            :     sal_uInt16      nIdx,           //  Index of the new template in this Region
     848                 :            :     String&     rName           /*  File name of the template to be imported
     849                 :            :                                     as an out parameter of the (automatically
     850                 :            :                                     generated from the file name) logical name
     851                 :            :                                     of the template */
     852                 :            : )
     853                 :            : 
     854                 :            : /*  [Description]
     855                 :            : 
     856                 :            :     Import a template from the file system
     857                 :            : 
     858                 :            :     [Return value]                 Sucess (sal_True) or serfpTargetDirectory->GetContent());
     859                 :            : 
     860                 :            :     sal_Bool            sal_True,   Action could be performed
     861                 :            :                         sal_False,  Action could not be performed
     862                 :            : 
     863                 :            :     [Cross-references]
     864                 :            : 
     865                 :            :     <SfxDocumentTemplates::CopyTo(sal_uInt16,sal_uInt16,const String&)>
     866                 :            : */
     867                 :            : 
     868                 :            : {
     869         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
     870                 :            : 
     871 [ #  # ][ #  # ]:          0 :     if ( ! pImp->Construct() )
     872                 :          0 :         return sal_False;
     873                 :            : 
     874         [ #  # ]:          0 :     RegionData_Impl *pTargetRgn = pImp->GetRegion( nRegion );
     875                 :            : 
     876         [ #  # ]:          0 :     if ( !pTargetRgn )
     877                 :          0 :         return sal_False;
     878                 :            : 
     879         [ #  # ]:          0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
     880         [ #  # ]:          0 :     if ( !xTemplates.is() )
     881                 :          0 :         return sal_False;
     882                 :            : 
     883                 :          0 :     OUString aTitle;
     884                 :          0 :     sal_Bool bTemplateAdded = sal_False;
     885                 :            : 
     886 [ #  # ][ #  # ]:          0 :     if( pImp->GetTitleFromURL( rName, aTitle ) )
                 [ #  # ]
     887                 :            :     {
     888 [ #  # ][ #  # ]:          0 :         bTemplateAdded = xTemplates->addTemplate( pTargetRgn->GetTitle(), aTitle, rName );
                 [ #  # ]
     889                 :            :     }
     890                 :            :     else
     891                 :            :     {
     892                 :          0 :         OUString aService( SERVICENAME_DESKTOP  );
     893 [ #  # ][ #  # ]:          0 :         uno::Reference< XComponentLoader > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance( aService ),
     894 [ #  # ][ #  # ]:          0 :                                                 UNO_QUERY );
     895                 :            : 
     896         [ #  # ]:          0 :         Sequence< PropertyValue > aArgs( 1 );
     897         [ #  # ]:          0 :         aArgs[0].Name = ::rtl::OUString("Hidden");
     898 [ #  # ][ #  # ]:          0 :         aArgs[0].Value <<= sal_True;
     899                 :            : 
     900 [ #  # ][ #  # ]:          0 :         INetURLObject   aTemplURL( rName );
     901                 :          0 :         uno::Reference< XDocumentPropertiesSupplier > xDocPropsSupplier;
     902                 :          0 :         uno::Reference< XStorable > xStorable;
     903                 :            :         try
     904                 :            :         {
     905                 :            :             xStorable = uno::Reference< XStorable >(
     906         [ #  # ]:          0 :                 xDesktop->loadComponentFromURL( aTemplURL.GetMainURL(INetURLObject::NO_DECODE),
     907                 :            :                                                 OUString("_blank"),
     908                 :            :                                                 0,
     909                 :          0 :                                                 aArgs ),
     910 [ #  # ][ #  # ]:          0 :                 UNO_QUERY );
         [ #  # ][ #  # ]
     911                 :            : 
     912                 :            :             xDocPropsSupplier = uno::Reference< XDocumentPropertiesSupplier >(
     913 [ #  # ][ #  # ]:          0 :                 xStorable, UNO_QUERY );
                 [ #  # ]
     914                 :            :         }
     915         [ #  # ]:          0 :         catch( Exception& )
     916                 :            :         {
     917                 :            :         }
     918                 :            : 
     919         [ #  # ]:          0 :         if( xStorable.is() )
     920                 :            :         {
     921                 :            :             // get Title from XDocumentPropertiesSupplier
     922         [ #  # ]:          0 :             if( xDocPropsSupplier.is() )
     923                 :            :             {
     924                 :            :                 uno::Reference< XDocumentProperties > xDocProps
     925 [ #  # ][ #  # ]:          0 :                     = xDocPropsSupplier->getDocumentProperties();
     926         [ #  # ]:          0 :                 if (xDocProps.is() ) {
     927 [ #  # ][ #  # ]:          0 :                     aTitle = xDocProps->getTitle();
     928                 :          0 :                 }
     929                 :            :             }
     930                 :            : 
     931         [ #  # ]:          0 :             if( aTitle.isEmpty() )
     932                 :            :             {
     933         [ #  # ]:          0 :                 INetURLObject aURL( aTemplURL );
     934         [ #  # ]:          0 :                 aURL.CutExtension();
     935                 :            :                 aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
     936 [ #  # ][ #  # ]:          0 :                                         INetURLObject::DECODE_WITH_CHARSET );
     937                 :            :             }
     938                 :            : 
     939                 :            :             // write a template using XStorable interface
     940 [ #  # ][ #  # ]:          0 :             bTemplateAdded = xTemplates->storeTemplate( pTargetRgn->GetTitle(), aTitle, xStorable );
     941 [ #  # ][ #  # ]:          0 :         }
     942                 :            :     }
     943                 :            : 
     944                 :            : 
     945         [ #  # ]:          0 :     if( bTemplateAdded )
     946                 :            :     {
     947 [ #  # ][ #  # ]:          0 :         INetURLObject aTemplObj( pTargetRgn->GetHierarchyURL() );
     948                 :            :         aTemplObj.insertName( aTitle, false,
     949                 :            :                               INetURLObject::LAST_SEGMENT, true,
     950         [ #  # ]:          0 :                               INetURLObject::ENCODE_ALL );
     951         [ #  # ]:          0 :         OUString aTemplURL = aTemplObj.GetMainURL( INetURLObject::NO_DECODE );
     952                 :            : 
     953                 :          0 :         uno::Reference< XCommandEnvironment > aCmdEnv;
     954         [ #  # ]:          0 :         Content aTemplCont;
     955                 :            : 
     956 [ #  # ][ #  # ]:          0 :         if( Content::create( aTemplURL, aCmdEnv, aTemplCont ) )
     957                 :            :         {
     958                 :          0 :             OUString aTemplName;
     959                 :          0 :             OUString aPropName( TARGET_URL  );
     960                 :            : 
     961 [ #  # ][ #  # ]:          0 :             if( getTextProperty_Impl( aTemplCont, aPropName, aTemplName ) )
     962                 :            :             {
     963         [ #  # ]:          0 :                 if ( nIdx == USHRT_MAX )
     964                 :          0 :                     nIdx = 0;
     965                 :            :                 else
     966                 :          0 :                     nIdx += 1;
     967                 :            : 
     968                 :            :                 // todo: fix SfxDocumentTemplates to handle size_t instead of sal_uInt16
     969                 :          0 :                 size_t temp_nIdx = nIdx;
     970         [ #  # ]:          0 :                 pTargetRgn->AddEntry( aTitle, aTemplName, &temp_nIdx );
     971         [ #  # ]:          0 :                 rName = aTitle;
     972                 :          0 :                 return sal_True;
     973                 :            :             }
     974                 :            :             else
     975                 :            :             {
     976                 :            :                 DBG_ASSERT( sal_False, "CopyFrom(): The content should contain target URL!" );
     977 [ #  # ][ #  # ]:          0 :             }
     978                 :            :         }
     979                 :            :         else
     980                 :            :         {
     981                 :            :             DBG_ASSERT( sal_False, "CopyFrom(): The content just was created!" );
     982 [ #  # ][ #  # ]:          0 :         }
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     983                 :            :     }
     984                 :            : 
     985         [ #  # ]:          0 :     return sal_False;
     986                 :            : }
     987                 :            : 
     988                 :            : //------------------------------------------------------------------------
     989                 :            : 
     990                 :          0 : sal_Bool SfxDocumentTemplates::Delete
     991                 :            : (
     992                 :            :     sal_uInt16 nRegion,             //  Region Index
     993                 :            :     sal_uInt16 nIdx                 /*  Index of the entry or USHRT_MAX,
     994                 :            :                                     if a directory is meant. */
     995                 :            : )
     996                 :            : 
     997                 :            : /*  [Description]
     998                 :            : 
     999                 :            :     Deleting an entry or a directory
    1000                 :            : 
    1001                 :            :     [Return value]
    1002                 :            : 
    1003                 :            :     sal_Bool            sal_True,   Action could be performed
    1004                 :            :                         sal_False,  Action could not be performed
    1005                 :            : 
    1006                 :            :     [Cross-references]
    1007                 :            : 
    1008                 :            :     <SfxDocumentTemplates::InsertDir(const String&,sal_uInt16)>
    1009                 :            :     <SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
    1010                 :            : */
    1011                 :            : 
    1012                 :            : {
    1013         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
    1014                 :            : 
    1015                 :            :     /* delete the template or folder in the hierarchy and in the
    1016                 :            :        template folder by sending a delete command to the content.
    1017                 :            :        Then remove the data from the lists
    1018                 :            :     */
    1019 [ #  # ][ #  # ]:          0 :     if ( ! pImp->Construct() )
    1020                 :          0 :         return sal_False;
    1021                 :            : 
    1022         [ #  # ]:          0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1023                 :            : 
    1024         [ #  # ]:          0 :     if ( !pRegion )
    1025                 :          0 :         return sal_False;
    1026                 :            : 
    1027                 :            :     sal_Bool bRet;
    1028         [ #  # ]:          0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
    1029                 :            : 
    1030         [ #  # ]:          0 :     if ( nIdx == USHRT_MAX )
    1031                 :            :     {
    1032 [ #  # ][ #  # ]:          0 :         bRet = xTemplates->removeGroup( pRegion->GetTitle() );
    1033         [ #  # ]:          0 :         if ( bRet )
    1034         [ #  # ]:          0 :             pImp->DeleteRegion( nRegion );
    1035                 :            :     }
    1036                 :            :     else
    1037                 :            :     {
    1038         [ #  # ]:          0 :         DocTempl_EntryData_Impl *pEntry = pRegion->GetEntry( nIdx );
    1039                 :            : 
    1040         [ #  # ]:          0 :         if ( !pEntry )
    1041                 :          0 :             return sal_False;
    1042                 :            : 
    1043         [ #  # ]:          0 :         bRet = xTemplates->removeTemplate( pRegion->GetTitle(),
    1044         [ #  # ]:          0 :                                            pEntry->GetTitle() );
    1045         [ #  # ]:          0 :         if( bRet )
    1046         [ #  # ]:          0 :             pRegion->DeleteEntry( nIdx );
    1047                 :            :     }
    1048                 :            : 
    1049         [ #  # ]:          0 :     return bRet;
    1050                 :            : }
    1051                 :            : 
    1052                 :            : //------------------------------------------------------------------------
    1053                 :            : 
    1054                 :          0 : sal_Bool SfxDocumentTemplates::InsertDir
    1055                 :            : (
    1056                 :            :     const String&   rText,      //  the logical name of the new Region
    1057                 :            :     sal_uInt16          nRegion     //  Region Index
    1058                 :            : )
    1059                 :            : 
    1060                 :            : /*  [Description]
    1061                 :            : 
    1062                 :            :     Insert an index
    1063                 :            : 
    1064                 :            :     [Return value]
    1065                 :            : 
    1066                 :            :     sal_Bool            sal_True,   Action could be performed
    1067                 :            :                         sal_False,  Action could not be performed
    1068                 :            : 
    1069                 :            :     [Cross-references]
    1070                 :            : 
    1071                 :            :     <SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
    1072                 :            : */
    1073                 :            : {
    1074         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
    1075                 :            : 
    1076 [ #  # ][ #  # ]:          0 :     if ( ! pImp->Construct() )
    1077                 :          0 :         return sal_False;
    1078                 :            : 
    1079 [ #  # ][ #  # ]:          0 :     RegionData_Impl *pRegion = pImp->GetRegion( rText );
    1080                 :            : 
    1081         [ #  # ]:          0 :     if ( pRegion )
    1082                 :          0 :         return sal_False;
    1083                 :            : 
    1084         [ #  # ]:          0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
    1085                 :            : 
    1086 [ #  # ][ #  # ]:          0 :     if ( xTemplates->addGroup( rText ) )
         [ #  # ][ #  # ]
    1087                 :            :     {
    1088 [ #  # ][ #  # ]:          0 :         RegionData_Impl* pNewRegion = new RegionData_Impl( pImp, rText );
                 [ #  # ]
    1089                 :            : 
    1090 [ #  # ][ #  # ]:          0 :         if ( ! pImp->InsertRegion( pNewRegion, nRegion ) )
    1091                 :            :         {
    1092 [ #  # ][ #  # ]:          0 :             delete pNewRegion;
    1093                 :          0 :             return sal_False;
    1094                 :            :         }
    1095                 :          0 :         return sal_True;
    1096                 :            :     }
    1097                 :            : 
    1098         [ #  # ]:          0 :     return sal_False;
    1099                 :            : }
    1100                 :            : 
    1101                 :            : //------------------------------------------------------------------------
    1102                 :            : 
    1103                 :          0 : sal_Bool SfxDocumentTemplates::SetName
    1104                 :            : (
    1105                 :            :     const String&   rName,      //  Der zu setzende Name
    1106                 :            :     sal_uInt16          nRegion,    //  Region Index
    1107                 :            :     sal_uInt16          nIdx        /*  Index of the entry oder USHRT_MAX,
    1108                 :            :                                     if a directory is meant. */
    1109                 :            : )
    1110                 :            : 
    1111                 :            : /*  [Description]
    1112                 :            : 
    1113                 :            :     Change the name of an entry or a directory
    1114                 :            : 
    1115                 :            :     [Return value]
    1116                 :            : 
    1117                 :            :     sal_Bool            sal_True,   Action could be performed
    1118                 :            :                         sal_False,  Action could not be performed
    1119                 :            : 
    1120                 :            : */
    1121                 :            : 
    1122                 :            : {
    1123         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
    1124                 :            : 
    1125 [ #  # ][ #  # ]:          0 :     if ( ! pImp->Construct() )
    1126                 :          0 :         return sal_False;
    1127                 :            : 
    1128         [ #  # ]:          0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1129                 :          0 :     DocTempl_EntryData_Impl *pEntry = NULL;
    1130                 :            : 
    1131         [ #  # ]:          0 :     if ( !pRegion )
    1132                 :          0 :         return sal_False;
    1133                 :            : 
    1134         [ #  # ]:          0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
    1135                 :          0 :     OUString aEmpty;
    1136                 :            : 
    1137         [ #  # ]:          0 :     if ( nIdx == USHRT_MAX )
    1138                 :            :     {
    1139 [ #  # ][ #  # ]:          0 :         if ( pRegion->GetTitle() == OUString( rName ) )
    1140                 :          0 :             return sal_True;
    1141                 :            : 
    1142                 :            :         // we have to rename a region
    1143 [ #  # ][ #  # ]:          0 :         if ( xTemplates->renameGroup( pRegion->GetTitle(), rName ) )
         [ #  # ][ #  # ]
    1144                 :            :         {
    1145         [ #  # ]:          0 :             pRegion->SetTitle( rName );
    1146                 :          0 :             pRegion->SetTargetURL( aEmpty );
    1147                 :          0 :             pRegion->SetHierarchyURL( aEmpty );
    1148                 :          0 :             return sal_True;
    1149                 :            :         }
    1150                 :            :     }
    1151                 :            :     else
    1152                 :            :     {
    1153         [ #  # ]:          0 :         pEntry = pRegion->GetEntry( nIdx );
    1154                 :            : 
    1155         [ #  # ]:          0 :         if ( !pEntry )
    1156                 :          0 :             return sal_False;
    1157                 :            : 
    1158 [ #  # ][ #  # ]:          0 :         if ( pEntry->GetTitle() == OUString( rName ) )
    1159                 :          0 :             return sal_True;
    1160                 :            : 
    1161   [ #  #  #  # ]:          0 :         if ( xTemplates->renameTemplate( pRegion->GetTitle(),
    1162                 :          0 :                                          pEntry->GetTitle(),
    1163   [ #  #  #  # ]:          0 :                                          rName ) )
    1164                 :            :         {
    1165         [ #  # ]:          0 :             pEntry->SetTitle( rName );
    1166                 :          0 :             pEntry->SetTargetURL( aEmpty );
    1167                 :          0 :             pEntry->SetHierarchyURL( aEmpty );
    1168                 :          0 :             return sal_True;
    1169                 :            :         }
    1170                 :            :     }
    1171                 :            : 
    1172         [ #  # ]:          0 :     return sal_False;
    1173                 :            : }
    1174                 :            : 
    1175                 :            : //------------------------------------------------------------------------
    1176                 :            : 
    1177                 :          0 : sal_Bool SfxDocumentTemplates::Rescan()
    1178                 :            : 
    1179                 :            : /*  [Description]
    1180                 :            : 
    1181                 :            :     Comparison of administrative data with the current state on disk.
    1182                 :            :     The logical name for which no file exists, will be removed from the
    1183                 :            :     administrative structure. Files for which no record exists will be included.
    1184                 :            : 
    1185                 :            :     [Return value]
    1186                 :            : 
    1187                 :            :     sal_Bool            sal_True,   Action could be performed
    1188                 :            :                         sal_False,  Action could not be performed
    1189                 :            : 
    1190                 :            :     [Cross-references]
    1191                 :            : 
    1192                 :            :     <SfxTemplateDir::Scan(sal_Bool bDirectory, sal_Bool bSave)>
    1193                 :            :     <SfxTemplateDir::Freshen(const SfxTemplateDir &rNew)>
    1194                 :            : */
    1195                 :            : {
    1196         [ #  # ]:          0 :     if ( !pImp->Construct() )
    1197                 :          0 :         return sal_False;
    1198                 :            : 
    1199                 :          0 :     pImp->Rescan();
    1200                 :            : 
    1201                 :          0 :     return sal_True;
    1202                 :            : }
    1203                 :            : 
    1204                 :            : //------------------------------------------------------------------------
    1205                 :            : 
    1206                 :          0 : SfxObjectShellRef SfxDocumentTemplates::CreateObjectShell
    1207                 :            : (
    1208                 :            :     sal_uInt16 nRegion,         //  Region Index
    1209                 :            :     sal_uInt16 nIdx             //  Index of the entry
    1210                 :            : )
    1211                 :            : 
    1212                 :            : /*  [Description]
    1213                 :            : 
    1214                 :            :     Access to the document shell of an entry
    1215                 :            : 
    1216                 :            :     [Return value]
    1217                 :            : 
    1218                 :            :     SfxObjectShellRef         Referece to the ObjectShell
    1219                 :            : 
    1220                 :            :     [Cross-references]
    1221                 :            : 
    1222                 :            :     <SfxTemplateDirEntry::CreateObjectShell()>
    1223                 :            :     <SfxDocumentTemplates::DeleteObjectShell(sal_uInt16, sal_uInt16)>
    1224                 :            : */
    1225                 :            : 
    1226                 :            : {
    1227         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
    1228                 :            : 
    1229 [ #  # ][ #  # ]:          0 :     if ( !pImp->Construct() )
    1230                 :          0 :         return NULL;
    1231                 :            : 
    1232         [ #  # ]:          0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1233                 :          0 :     DocTempl_EntryData_Impl *pEntry = NULL;
    1234                 :            : 
    1235         [ #  # ]:          0 :     if ( pRegion )
    1236         [ #  # ]:          0 :         pEntry = pRegion->GetEntry( nIdx );
    1237                 :            : 
    1238         [ #  # ]:          0 :     if ( pEntry )
    1239         [ #  # ]:          0 :         return pEntry->CreateObjectShell();
    1240                 :            :     else
    1241         [ #  # ]:          0 :         return NULL;
    1242                 :            : }
    1243                 :            : 
    1244                 :            : //------------------------------------------------------------------------
    1245                 :            : 
    1246                 :          0 : sal_Bool SfxDocumentTemplates::DeleteObjectShell
    1247                 :            : (
    1248                 :            :     sal_uInt16 nRegion,         //  Region Index
    1249                 :            :     sal_uInt16 nIdx             //  Index of the entry
    1250                 :            : )
    1251                 :            : 
    1252                 :            : /*  [Description]
    1253                 :            : 
    1254                 :            :     Releasing the ObjectShell of an entry
    1255                 :            : 
    1256                 :            :     [Return value]
    1257                 :            : 
    1258                 :            :     sal_Bool            sal_True,   Action could be performed
    1259                 :            :                         sal_False,  Action could not be performed
    1260                 :            : 
    1261                 :            :     [Cross-references]
    1262                 :            : 
    1263                 :            :     <SfxTemplateDirEntry::DeleteObjectShell()>
    1264                 :            :     <SfxDocumentTemplates::CreateObjectShell(sal_uInt16, sal_uInt16)>
    1265                 :            : */
    1266                 :            : 
    1267                 :            : {
    1268         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
    1269                 :            : 
    1270 [ #  # ][ #  # ]:          0 :     if ( ! pImp->Construct() )
    1271                 :          0 :         return sal_True;
    1272                 :            : 
    1273         [ #  # ]:          0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1274                 :          0 :     DocTempl_EntryData_Impl *pEntry = NULL;
    1275                 :            : 
    1276         [ #  # ]:          0 :     if ( pRegion )
    1277         [ #  # ]:          0 :         pEntry = pRegion->GetEntry( nIdx );
    1278                 :            : 
    1279         [ #  # ]:          0 :     if ( pEntry )
    1280         [ #  # ]:          0 :         return pEntry->DeleteObjectShell();
    1281                 :            :     else
    1282         [ #  # ]:          0 :         return sal_True;
    1283                 :            : }
    1284                 :            : 
    1285                 :            : //------------------------------------------------------------------------
    1286                 :            : 
    1287                 :         14 : sal_Bool SfxDocumentTemplates::GetFull
    1288                 :            : (
    1289                 :            :     const String &rRegion,      // Region Name
    1290                 :            :     const String &rName,        // Template Name
    1291                 :            :     String &rPath               // Out: Path + File name
    1292                 :            : )
    1293                 :            : 
    1294                 :            : /*  [Description]
    1295                 :            : 
    1296                 :            :     Returns Path + File name of the template specified by rRegion and rName.
    1297                 :            : 
    1298                 :            :     [Return value]
    1299                 :            : 
    1300                 :            :     sal_Bool            sal_True,   Action could be performed
    1301                 :            :                         sal_False,  Action could not be performed
    1302                 :            : 
    1303                 :            :     [Cross-references]
    1304                 :            : 
    1305                 :            :     <SfxDocumentTemplates::GetLogicNames(const String&,String&,String&)>
    1306                 :            : */
    1307                 :            : 
    1308                 :            : {
    1309         [ +  - ]:         14 :     DocTemplLocker_Impl aLocker( *pImp );
    1310                 :            : 
    1311                 :            :     // We don't search for empty names!
    1312         [ -  + ]:         14 :     if ( ! rName.Len() )
    1313                 :          0 :         return sal_False;
    1314                 :            : 
    1315 [ +  - ][ +  + ]:         14 :     if ( ! pImp->Construct() )
    1316                 :         12 :         return sal_False;
    1317                 :            : 
    1318                 :          2 :     DocTempl_EntryData_Impl* pEntry = NULL;
    1319         [ +  - ]:          2 :     const sal_uInt16 nCount = GetRegionCount();
    1320                 :            : 
    1321         [ +  + ]:          8 :     for ( sal_uInt16 i = 0; i < nCount; ++i )
    1322                 :            :     {
    1323         [ +  - ]:          6 :         RegionData_Impl *pRegion = pImp->GetRegion( i );
    1324                 :            : 
    1325   [ +  -  -  + ]:         18 :         if( pRegion &&
         [ #  # ][ +  - ]
    1326 [ #  # ][ #  # ]:         12 :             ( !rRegion.Len() || ( rRegion == String( pRegion->GetTitle() ) ) ) )
         [ -  + ][ #  # ]
                 [ #  # ]
    1327                 :            :         {
    1328 [ +  - ][ +  - ]:          6 :             pEntry = pRegion->GetEntry( rName );
    1329                 :            : 
    1330         [ -  + ]:          6 :             if ( pEntry )
    1331                 :            :             {
    1332 [ #  # ][ #  # ]:          0 :                 rPath = pEntry->GetTargetURL();
    1333                 :          0 :                 break;
    1334                 :            :             }
    1335                 :            :         }
    1336                 :            :     }
    1337                 :            : 
    1338         [ +  - ]:         14 :     return ( pEntry != NULL );
    1339                 :            : }
    1340                 :            : 
    1341                 :            : //------------------------------------------------------------------------
    1342                 :            : 
    1343                 :          0 : sal_Bool SfxDocumentTemplates::GetLogicNames
    1344                 :            : (
    1345                 :            :     const String &rPath,            // Full Path to the template
    1346                 :            :     String &rRegion,                // Out: Region name
    1347                 :            :     String &rName                   // Out: Template name
    1348                 :            : ) const
    1349                 :            : 
    1350                 :            : /*  [Description]
    1351                 :            : 
    1352                 :            :     Returns and logical path name to the template specified by rPath
    1353                 :            : 
    1354                 :            :     [Return value]
    1355                 :            : 
    1356                 :            :     sal_Bool            sal_True,   Action could be performed
    1357                 :            :                         sal_False,  Action could not be performed
    1358                 :            : 
    1359                 :            :     [Cross-references]
    1360                 :            : 
    1361                 :            :     <SfxDocumentTemplates::GetFull(const String&,const String&,DirEntry&)>
    1362                 :            : */
    1363                 :            : 
    1364                 :            : {
    1365         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
    1366                 :            : 
    1367 [ #  # ][ #  # ]:          0 :     if ( ! pImp->Construct() )
    1368                 :          0 :         return sal_False;
    1369                 :            : 
    1370         [ #  # ]:          0 :     INetURLObject aFullPath;
    1371                 :            : 
    1372                 :          0 :     aFullPath.SetSmartProtocol( INET_PROT_FILE );
    1373 [ #  # ][ #  # ]:          0 :     aFullPath.SetURL( rPath );
    1374         [ #  # ]:          0 :     OUString aPath( aFullPath.GetMainURL( INetURLObject::NO_DECODE ) );
    1375                 :            : 
    1376                 :          0 :     RegionData_Impl *pData = NULL;
    1377                 :          0 :     DocTempl_EntryData_Impl  *pEntry = NULL;
    1378                 :          0 :     sal_Bool         bFound = sal_False;
    1379                 :            : 
    1380         [ #  # ]:          0 :     sal_uIntPtr nCount = GetRegionCount();
    1381                 :            : 
    1382 [ #  # ][ #  # ]:          0 :     for ( sal_uIntPtr i=0; !bFound && (i<nCount); i++ )
                 [ #  # ]
    1383                 :            :     {
    1384         [ #  # ]:          0 :         pData = pImp->GetRegion( i );
    1385         [ #  # ]:          0 :         if ( pData )
    1386                 :            :         {
    1387                 :          0 :             sal_uIntPtr nChildCount = pData->GetCount();
    1388                 :            : 
    1389 [ #  # ][ #  # ]:          0 :             for ( sal_uIntPtr j=0; !bFound && (j<nChildCount); j++ )
                 [ #  # ]
    1390                 :            :             {
    1391         [ #  # ]:          0 :                 pEntry = pData->GetEntry( j );
    1392 [ #  # ][ #  # ]:          0 :                 if ( pEntry->GetTargetURL() == aPath )
    1393                 :            :                 {
    1394                 :          0 :                     bFound = sal_True;
    1395                 :            :                 }
    1396                 :            :             }
    1397                 :            :         }
    1398                 :            :     }
    1399                 :            : 
    1400         [ #  # ]:          0 :     if ( bFound )
    1401                 :            :     {
    1402         [ #  # ]:          0 :         rRegion = pData->GetTitle();
    1403         [ #  # ]:          0 :         rName = pEntry->GetTitle();
    1404                 :            :     }
    1405                 :            : 
    1406 [ #  # ][ #  # ]:          0 :     return bFound;
    1407                 :            : }
    1408                 :            : 
    1409                 :            : //------------------------------------------------------------------------
    1410                 :            : 
    1411                 :         14 : SfxDocumentTemplates::SfxDocumentTemplates()
    1412                 :            : 
    1413                 :            : /*  [Description]
    1414                 :            : 
    1415                 :            :     Constructor
    1416                 :            : */
    1417                 :            : {
    1418         [ +  - ]:         14 :     if ( !gpTemplateData )
    1419 [ +  - ][ +  - ]:         14 :         gpTemplateData = new SfxDocTemplate_Impl;
    1420                 :            : 
    1421         [ +  - ]:         14 :     pImp = gpTemplateData;
    1422                 :         14 : }
    1423                 :            : 
    1424                 :            : //-------------------------------------------------------------------------
    1425                 :            : 
    1426                 :          9 : void SfxDocumentTemplates::Construct()
    1427                 :            : 
    1428                 :            : //  Delayed build-up of administrative data
    1429                 :            : 
    1430                 :            : {
    1431                 :          9 : }
    1432                 :            : 
    1433                 :            : //------------------------------------------------------------------------
    1434                 :            : 
    1435                 :         11 : SfxDocumentTemplates::~SfxDocumentTemplates()
    1436                 :            : 
    1437                 :            : /*  [Description]
    1438                 :            : 
    1439                 :            :     Destructor
    1440                 :            :     Release of administrative data
    1441                 :            : */
    1442                 :            : 
    1443                 :            : {
    1444         [ +  - ]:         11 :     pImp = NULL;
    1445                 :         11 : }
    1446                 :            : 
    1447                 :          0 : void SfxDocumentTemplates::Update( sal_Bool _bSmart )
    1448                 :            : {
    1449 [ #  # ][ #  # ]:          0 :     if  (   !_bSmart                                                // don't be smart
                 [ #  # ]
    1450 [ #  # ][ #  # ]:          0 :         ||  ::svt::TemplateFolderCache( sal_True ).needsUpdate()    // update is really necessary
         [ #  # ][ #  # ]
    1451                 :            :         )
    1452                 :            :     {
    1453         [ #  # ]:          0 :         if ( pImp->Construct() )
    1454                 :          0 :             pImp->Rescan();
    1455                 :            :     }
    1456                 :          0 : }
    1457                 :            : 
    1458                 :          0 : void SfxDocumentTemplates::ReInitFromComponent()
    1459                 :            : {
    1460                 :          0 :     pImp->ReInitFromComponent();
    1461                 :          0 : }
    1462                 :            : 
    1463                 :            : 
    1464                 :          0 : sal_Bool SfxDocumentTemplates::HasUserContents( sal_uInt16 nRegion, sal_uInt16 nIdx ) const
    1465                 :            : {
    1466         [ #  # ]:          0 :     DocTemplLocker_Impl aLocker( *pImp );
    1467                 :            : 
    1468                 :          0 :     sal_Bool bResult = sal_False;
    1469                 :            : 
    1470         [ #  # ]:          0 :     RegionData_Impl* pRegion = pImp->GetRegion( nRegion );
    1471                 :            : 
    1472         [ #  # ]:          0 :     if ( pRegion )
    1473                 :            :     {
    1474         [ #  # ]:          0 :         ::rtl::OUString aRegionTargetURL = pRegion->GetTargetURL();
    1475         [ #  # ]:          0 :         if ( !aRegionTargetURL.isEmpty() )
    1476                 :            :         {
    1477                 :          0 :             sal_uInt16 nLen = 0;
    1478                 :          0 :             sal_uInt16 nStartInd = 0;
    1479                 :            : 
    1480         [ #  # ]:          0 :             if( nIdx == USHRT_MAX )
    1481                 :            :             {
    1482                 :            :                 // this is a folder
    1483                 :            :                 // check whether there is at least one editable template
    1484                 :          0 :                 nLen = ( sal_uInt16 )pRegion->GetCount();
    1485                 :          0 :                 nStartInd = 0;
    1486         [ #  # ]:          0 :                 if ( nLen == 0 )
    1487                 :          0 :                     bResult = sal_True; // the writing part of empty folder with writing URL can be removed
    1488                 :            :             }
    1489                 :            :             else
    1490                 :            :             {
    1491                 :            :                 // this is a template
    1492                 :            :                 // check whether the template is inserted by user
    1493                 :          0 :                 nLen = 1;
    1494                 :          0 :                 nStartInd = nIdx;
    1495                 :            :             }
    1496                 :            : 
    1497         [ #  # ]:          0 :             for ( sal_uInt16 nInd = nStartInd; nInd < nStartInd + nLen; nInd++ )
    1498                 :            :             {
    1499         [ #  # ]:          0 :                 DocTempl_EntryData_Impl* pEntryData = pRegion->GetEntry( nInd );
    1500         [ #  # ]:          0 :                 if ( pEntryData )
    1501                 :            :                 {
    1502         [ #  # ]:          0 :                     ::rtl::OUString aEntryTargetURL = pEntryData->GetTargetURL();
    1503 [ #  # ][ #  # ]:          0 :                     if ( !aEntryTargetURL.isEmpty()
                 [ #  # ]
    1504         [ #  # ]:          0 :                       && ::utl::UCBContentHelper::IsSubPath( aRegionTargetURL, aEntryTargetURL ) )
    1505                 :            :                     {
    1506                 :          0 :                         bResult = sal_True;
    1507                 :            :                         break;
    1508         [ #  # ]:          0 :                     }
    1509                 :            :                 }
    1510                 :            :             }
    1511                 :          0 :         }
    1512                 :            :     }
    1513                 :            : 
    1514         [ #  # ]:          0 :     return bResult;
    1515                 :            : }
    1516                 :            : 
    1517                 :            : // -----------------------------------------------------------------------
    1518                 :         20 : DocTempl_EntryData_Impl::DocTempl_EntryData_Impl( RegionData_Impl* pParent,
    1519                 :         20 :                                 const OUString& rTitle )
    1520                 :            : {
    1521                 :         20 :     mpParent    = pParent;
    1522                 :            :     maTitle     = SfxDocumentTemplates::ConvertResourceString(
    1523         [ +  - ]:         20 :                   STR_TEMPLATE_NAME1_DEF, STR_TEMPLATE_NAME1, NUM_TEMPLATE_NAMES, rTitle );
    1524                 :         20 :     mbIsOwner   = sal_False;
    1525                 :         20 :     mbDidConvert= sal_False;
    1526                 :         20 : }
    1527                 :            : 
    1528                 :            : // -----------------------------------------------------------------------
    1529                 :        110 : int DocTempl_EntryData_Impl::Compare( const OUString& rTitle ) const
    1530                 :            : {
    1531                 :        110 :     return maTitle.compareTo( rTitle );
    1532                 :            : }
    1533                 :            : 
    1534                 :            : // -----------------------------------------------------------------------
    1535                 :          0 : SfxObjectShellRef DocTempl_EntryData_Impl::CreateObjectShell()
    1536                 :            : {
    1537         [ #  # ]:          0 :     if( ! mxObjShell.Is() )
    1538                 :            :     {
    1539                 :          0 :         mbIsOwner = sal_False;
    1540                 :          0 :         sal_Bool bDum = sal_False;
    1541         [ #  # ]:          0 :         SfxApplication *pSfxApp = SFX_APP();
    1542 [ #  # ][ #  # ]:          0 :         String          aTargetURL = GetTargetURL();
    1543                 :            : 
    1544 [ #  # ][ #  # ]:          0 :         mxObjShell = pSfxApp->DocAlreadyLoaded( aTargetURL, sal_True, bDum );
                 [ #  # ]
    1545                 :            : 
    1546         [ #  # ]:          0 :         if( ! mxObjShell.Is() )
    1547                 :            :         {
    1548                 :          0 :             mbIsOwner = sal_True;
    1549                 :            :             SfxMedium *pMed=new SfxMedium(
    1550 [ #  # ][ #  # ]:          0 :                 aTargetURL,(STREAM_STD_READWRITE | STREAM_SHARE_DENYALL) );
    1551                 :          0 :             const SfxFilter* pFilter = NULL;
    1552         [ #  # ]:          0 :             pMed->UseInteractionHandler(sal_True);
    1553 [ #  # ][ #  # ]:          0 :             if( pSfxApp->GetFilterMatcher().GuessFilter(
           [ #  #  #  # ]
           [ #  #  #  # ]
                 [ #  # ]
    1554         [ #  # ]:          0 :                 *pMed, &pFilter, SFX_FILTER_TEMPLATE, 0 ) ||
    1555                 :          0 :                 (pFilter && !pFilter->IsOwnFormat()) ||
    1556                 :          0 :                 (pFilter && !pFilter->UsesStorage()) )
    1557                 :            :             {
    1558                 :            :                 SfxErrorContext aEc( ERRCTX_SFX_LOADTEMPLATE,
    1559         [ #  # ]:          0 :                                      aTargetURL );
    1560 [ #  # ][ #  # ]:          0 :                 delete pMed;
    1561                 :          0 :                 mbDidConvert=sal_True;
    1562                 :            :                 sal_uIntPtr lErr;
    1563         [ #  # ]:          0 :                 if ( mxObjShell.Is() ) {
    1564         [ #  # ]:          0 :                     lErr = pSfxApp->LoadTemplate( mxObjShell,aTargetURL);
    1565         [ #  # ]:          0 :                     if( lErr != ERRCODE_NONE )
    1566         [ #  # ]:          0 :                         ErrorHandler::HandleError(lErr);
    1567         [ #  # ]:          0 :                 }
    1568                 :            : 
    1569                 :            :             }
    1570         [ #  # ]:          0 :             else if (pFilter)
    1571                 :            :             {
    1572                 :          0 :                 mbDidConvert=sal_False;
    1573 [ #  # ][ #  # ]:          0 :                 mxObjShell = SfxObjectShell::CreateObject( pFilter->GetServiceName(), SFX_CREATE_MODE_ORGANIZER );
         [ #  # ][ #  # ]
    1574         [ #  # ]:          0 :                 if ( mxObjShell.Is() )
    1575                 :            :                 {
    1576         [ #  # ]:          0 :                     mxObjShell->DoInitNew(0);
    1577                 :            :                     // TODO/LATER: make sure that we don't use binary templates!
    1578 [ #  # ][ #  # ]:          0 :                     if( mxObjShell->LoadFrom( *pMed ) )
    1579                 :            :                     {
    1580         [ #  # ]:          0 :                         mxObjShell->DoSaveCompleted( pMed );
    1581                 :            :                     }
    1582                 :            :                     else
    1583         [ #  # ]:          0 :                         mxObjShell.Clear();
    1584                 :            :                 }
    1585                 :            :             }
    1586         [ #  # ]:          0 :         }
    1587                 :            :     }
    1588                 :            : 
    1589                 :          0 :     return (SfxObjectShellRef)(SfxObjectShell*) mxObjShell;
    1590                 :            : }
    1591                 :            : 
    1592                 :            : //------------------------------------------------------------------------
    1593                 :          0 : sal_Bool DocTempl_EntryData_Impl::DeleteObjectShell()
    1594                 :            : {
    1595                 :          0 :     sal_Bool bRet = sal_True;
    1596                 :            : 
    1597         [ #  # ]:          0 :     if ( mxObjShell.Is() )
    1598                 :            :     {
    1599         [ #  # ]:          0 :         if( mxObjShell->IsModified() )
    1600                 :            :         {
    1601                 :            :             // Here we also save, if the Template is being processed ...
    1602                 :          0 :             bRet = sal_False;
    1603                 :            : 
    1604         [ #  # ]:          0 :             if ( mbIsOwner )
    1605                 :            :             {
    1606         [ #  # ]:          0 :                 if( mbDidConvert )
    1607                 :            :                 {
    1608                 :            :                     bRet=mxObjShell->PreDoSaveAs_Impl(
    1609                 :          0 :                         GetTargetURL(),
    1610         [ #  # ]:          0 :                         mxObjShell->GetFactory().GetFilterContainer()->GetAnyFilter( SFX_FILTER_EXPORT | SFX_FILTER_IMPORT, SFX_FILTER_INTERNAL )->GetFilterName(), 0 );
    1611                 :            :                 }
    1612                 :            :                 else
    1613                 :            :                 {
    1614         [ #  # ]:          0 :                     if( mxObjShell->Save() )
    1615                 :            :                     {
    1616 [ #  # ][ #  # ]:          0 :                         uno::Reference< embed::XTransactedObject > xTransacted( mxObjShell->GetStorage(), uno::UNO_QUERY );
                 [ #  # ]
    1617                 :            :                         DBG_ASSERT( xTransacted.is(), "Storage must implement XTransactedObject!\n" );
    1618         [ #  # ]:          0 :                         if ( xTransacted.is() )
    1619                 :            :                         {
    1620                 :            :                             try
    1621                 :            :                             {
    1622 [ #  # ][ #  # ]:          0 :                                 xTransacted->commit();
    1623                 :          0 :                                 bRet = sal_True;
    1624                 :            :                             }
    1625         [ #  # ]:          0 :                             catch( uno::Exception& )
    1626                 :            :                             {
    1627                 :            :                             }
    1628                 :          0 :                         }
    1629                 :            :                     }
    1630                 :            :                 }
    1631                 :            :             }
    1632                 :            :         }
    1633                 :            : 
    1634         [ #  # ]:          0 :         if( bRet )
    1635                 :            :         {
    1636                 :          0 :             mxObjShell.Clear();
    1637                 :            :         }
    1638                 :            :     }
    1639                 :          0 :     return bRet;
    1640                 :            : }
    1641                 :            : 
    1642                 :            : // -----------------------------------------------------------------------
    1643                 :          0 : const OUString& DocTempl_EntryData_Impl::GetHierarchyURL()
    1644                 :            : {
    1645         [ #  # ]:          0 :     if ( maOwnURL.isEmpty() )
    1646                 :            :     {
    1647 [ #  # ][ #  # ]:          0 :         INetURLObject aTemplateObj( GetParent()->GetHierarchyURL() );
    1648                 :            : 
    1649                 :          0 :         aTemplateObj.insertName( GetTitle(), false,
    1650                 :            :                      INetURLObject::LAST_SEGMENT, true,
    1651         [ #  # ]:          0 :                      INetURLObject::ENCODE_ALL );
    1652                 :            : 
    1653         [ #  # ]:          0 :         maOwnURL = aTemplateObj.GetMainURL( INetURLObject::NO_DECODE );
    1654         [ #  # ]:          0 :         DBG_ASSERT( !maOwnURL.isEmpty(), "GetHierarchyURL(): Could not create URL!" );
    1655                 :            :     }
    1656                 :            : 
    1657                 :          0 :     return maOwnURL;
    1658                 :            : }
    1659                 :            : 
    1660                 :            : // -----------------------------------------------------------------------
    1661                 :          0 : const OUString& DocTempl_EntryData_Impl::GetTargetURL()
    1662                 :            : {
    1663         [ #  # ]:          0 :     if ( maTargetURL.isEmpty() )
    1664                 :            :     {
    1665                 :          0 :         uno::Reference< XCommandEnvironment > aCmdEnv;
    1666         [ #  # ]:          0 :         Content aRegion;
    1667                 :            : 
    1668 [ #  # ][ #  # ]:          0 :         if ( Content::create( GetHierarchyURL(), aCmdEnv, aRegion ) )
                 [ #  # ]
    1669                 :            :         {
    1670                 :          0 :             OUString aPropName( TARGET_URL  );
    1671                 :            : 
    1672         [ #  # ]:          0 :             getTextProperty_Impl( aRegion, aPropName, maTargetURL );
    1673                 :            :         }
    1674                 :            :         else
    1675                 :            :         {
    1676                 :            :             SAL_WARN( "sfx2.doc", "GetTargetURL(): Could not create hierarchy content!" );
    1677         [ #  # ]:          0 :         }
    1678                 :            :     }
    1679                 :            : 
    1680                 :          0 :     return maTargetURL;
    1681                 :            : }
    1682                 :            : 
    1683                 :            : // -----------------------------------------------------------------------
    1684                 :          6 : RegionData_Impl::RegionData_Impl( const SfxDocTemplate_Impl* pParent,
    1685                 :          6 :                                   const OUString& rTitle )
    1686                 :            : {
    1687                 :          6 :     maTitle     = rTitle;
    1688                 :          6 :     mpParent    = pParent;
    1689                 :          6 : }
    1690                 :            : 
    1691                 :            : // -----------------------------------------------------------------------
    1692                 :          6 : RegionData_Impl::~RegionData_Impl()
    1693                 :            : {
    1694         [ +  + ]:         26 :     for ( size_t i = 0, n = maEntries.size(); i < n; ++i )
    1695 [ +  - ][ +  - ]:         20 :         delete maEntries[ i ];
    1696                 :          6 :     maEntries.clear();
    1697                 :          6 : }
    1698                 :            : 
    1699                 :            : // -----------------------------------------------------------------------
    1700                 :         26 : size_t RegionData_Impl::GetEntryPos( const OUString& rTitle, sal_Bool& rFound ) const
    1701                 :            : {
    1702                 :            : #if 1   // Don't use binary search today
    1703                 :            :     size_t i;
    1704                 :         26 :     size_t nCount = maEntries.size();
    1705                 :            : 
    1706         [ +  + ]:        136 :     for ( i=0; i<nCount; i++ )
    1707                 :            :     {
    1708                 :        110 :         DocTempl_EntryData_Impl *pData = maEntries[ i ];
    1709                 :            : 
    1710         [ -  + ]:        110 :         if ( pData->Compare( rTitle ) == 0 )
    1711                 :            :         {
    1712                 :          0 :             rFound = sal_True;
    1713                 :          0 :             return i;
    1714                 :            :         }
    1715                 :            :     }
    1716                 :            : 
    1717                 :         26 :     rFound = sal_False;
    1718                 :         26 :     return i;
    1719                 :            : 
    1720                 :            : #else
    1721                 :            :     // use binary search to find the correct position
    1722                 :            :     // in the maEntries list
    1723                 :            : 
    1724                 :            :     int     nCompVal = 1;
    1725                 :            :     size_t  nStart = 0;
    1726                 :            :     size_t  nEnd = maEntries.size() - 1;
    1727                 :            :     size_t  nMid;
    1728                 :            : 
    1729                 :            :     DocTempl_EntryData_Impl* pMid;
    1730                 :            : 
    1731                 :            :     rFound = sal_False;
    1732                 :            : 
    1733                 :            :     while ( nCompVal && ( nStart <= nEnd ) )
    1734                 :            :     {
    1735                 :            :         nMid = ( nEnd - nStart ) / 2 + nStart;
    1736                 :            :         pMid = maEntries[ nMid ];
    1737                 :            : 
    1738                 :            :         nCompVal = pMid->Compare( rTitle );
    1739                 :            : 
    1740                 :            :         if ( nCompVal < 0 )     // pMid < pData
    1741                 :            :             nStart = nMid + 1;
    1742                 :            :         else
    1743                 :            :             nEnd = nMid - 1;
    1744                 :            :     }
    1745                 :            : 
    1746                 :            :     if ( nCompVal == 0 )
    1747                 :            :     {
    1748                 :            :         rFound = sal_True;
    1749                 :            :     }
    1750                 :            :     else
    1751                 :            :     {
    1752                 :            :         if ( nCompVal < 0 )     // pMid < pData
    1753                 :            :             nMid++;
    1754                 :            :     }
    1755                 :            : 
    1756                 :            :     return nMid;
    1757                 :            : #endif
    1758                 :            : }
    1759                 :            : 
    1760                 :            : // -----------------------------------------------------------------------
    1761                 :         20 : void RegionData_Impl::AddEntry( const OUString& rTitle,
    1762                 :            :                                 const OUString& rTargetURL,
    1763                 :            :                                 size_t *pPos )
    1764                 :            : {
    1765 [ +  - ][ +  - ]:         20 :     INetURLObject aLinkObj( GetHierarchyURL() );
    1766                 :            :     aLinkObj.insertName( rTitle, false,
    1767                 :            :                       INetURLObject::LAST_SEGMENT, true,
    1768         [ +  - ]:         20 :                       INetURLObject::ENCODE_ALL );
    1769         [ +  - ]:         20 :     OUString aLinkURL = aLinkObj.GetMainURL( INetURLObject::NO_DECODE );
    1770                 :            : 
    1771                 :            :     DocTempl_EntryData_Impl* pEntry;
    1772                 :         20 :     sal_Bool        bFound = sal_False;
    1773         [ +  - ]:         20 :     size_t          nPos = GetEntryPos( rTitle, bFound );
    1774                 :            : 
    1775         [ -  + ]:         20 :     if ( bFound )
    1776                 :            :     {
    1777                 :          0 :         pEntry = maEntries[ nPos ];
    1778                 :            :     }
    1779                 :            :     else
    1780                 :            :     {
    1781         [ -  + ]:         20 :         if ( pPos )
    1782                 :          0 :             nPos = *pPos;
    1783                 :            : 
    1784 [ +  - ][ +  - ]:         20 :         pEntry = new DocTempl_EntryData_Impl( this, rTitle );
    1785                 :         20 :         pEntry->SetTargetURL( rTargetURL );
    1786                 :         20 :         pEntry->SetHierarchyURL( aLinkURL );
    1787         [ -  + ]:         20 :         if ( nPos < maEntries.size() ) {
    1788                 :          0 :             vector< DocTempl_EntryData_Impl* >::iterator it = maEntries.begin();
    1789         [ #  # ]:          0 :             advance( it, nPos );
    1790         [ #  # ]:          0 :             maEntries.insert( it, pEntry );
    1791                 :            :         }
    1792                 :            :         else
    1793         [ +  - ]:         20 :             maEntries.push_back( pEntry );
    1794         [ +  - ]:         20 :     }
    1795                 :         20 : }
    1796                 :            : 
    1797                 :            : // -----------------------------------------------------------------------
    1798                 :          0 : size_t RegionData_Impl::GetCount() const
    1799                 :            : {
    1800                 :          0 :     return maEntries.size();
    1801                 :            : }
    1802                 :            : 
    1803                 :            : // -----------------------------------------------------------------------
    1804                 :         20 : const OUString& RegionData_Impl::GetHierarchyURL()
    1805                 :            : {
    1806         [ +  + ]:         20 :     if ( maOwnURL.isEmpty() )
    1807                 :            :     {
    1808         [ +  - ]:          2 :         INetURLObject aRegionObj( GetParent()->GetRootURL() );
    1809                 :            : 
    1810                 :          2 :         aRegionObj.insertName( GetTitle(), false,
    1811                 :            :                      INetURLObject::LAST_SEGMENT, true,
    1812         [ +  - ]:          2 :                      INetURLObject::ENCODE_ALL );
    1813                 :            : 
    1814         [ +  - ]:          2 :         maOwnURL = aRegionObj.GetMainURL( INetURLObject::NO_DECODE );
    1815         [ +  - ]:          2 :         DBG_ASSERT( !maOwnURL.isEmpty(), "GetHierarchyURL(): Could not create URL!" );
    1816                 :            :     }
    1817                 :            : 
    1818                 :         20 :     return maOwnURL;
    1819                 :            : }
    1820                 :            : 
    1821                 :            : // -----------------------------------------------------------------------
    1822                 :          0 : const OUString& RegionData_Impl::GetTargetURL()
    1823                 :            : {
    1824         [ #  # ]:          0 :     if ( maTargetURL.isEmpty() )
    1825                 :            :     {
    1826                 :          0 :         uno::Reference< XCommandEnvironment > aCmdEnv;
    1827         [ #  # ]:          0 :         Content aRegion;
    1828                 :            : 
    1829 [ #  # ][ #  # ]:          0 :         if ( Content::create( GetHierarchyURL(), aCmdEnv, aRegion ) )
                 [ #  # ]
    1830                 :            :         {
    1831                 :          0 :             OUString aPropName( TARGET_DIR_URL  );
    1832                 :            : 
    1833         [ #  # ]:          0 :             getTextProperty_Impl( aRegion, aPropName, maTargetURL );
    1834                 :            :             // The targeturl must be substituted: $(baseinsturl) (#i32656#)
    1835 [ #  # ][ #  # ]:          0 :             maTargetURL = SvtPathOptions().SubstituteVariable( maTargetURL );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1836                 :            :         }
    1837                 :            :         else
    1838                 :            :         {
    1839                 :            :             SAL_WARN( "sfx2.doc", "GetTargetURL(): Could not create hierarchy content!" );
    1840         [ #  # ]:          0 :         }
    1841                 :            :     }
    1842                 :            : 
    1843                 :          0 :     return maTargetURL;
    1844                 :            : }
    1845                 :            : 
    1846                 :            : // -----------------------------------------------------------------------
    1847                 :          6 : DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( const OUString& rName ) const
    1848                 :            : {
    1849                 :          6 :     sal_Bool    bFound = sal_False;
    1850         [ +  - ]:          6 :     long        nPos = GetEntryPos( rName, bFound );
    1851                 :            : 
    1852         [ -  + ]:          6 :     if ( bFound )
    1853                 :          0 :         return maEntries[ nPos ];
    1854                 :            :     else
    1855                 :          6 :         return NULL;
    1856                 :            : }
    1857                 :            : 
    1858                 :            : // -----------------------------------------------------------------------
    1859                 :          0 : DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( size_t nIndex ) const
    1860                 :            : {
    1861         [ #  # ]:          0 :     if ( nIndex < maEntries.size() )
    1862                 :          0 :         return maEntries[ nIndex ];
    1863                 :          0 :     return NULL;
    1864                 :            : }
    1865                 :            : 
    1866                 :            : // -----------------------------------------------------------------------
    1867                 :          0 : void RegionData_Impl::DeleteEntry( size_t nIndex )
    1868                 :            : {
    1869         [ #  # ]:          0 :     if ( nIndex < maEntries.size() )
    1870                 :            :     {
    1871 [ #  # ][ #  # ]:          0 :         delete maEntries[ nIndex ];
    1872                 :          0 :         vector< DocTempl_EntryData_Impl*>::iterator it = maEntries.begin();
    1873         [ #  # ]:          0 :         advance( it, nIndex );
    1874         [ #  # ]:          0 :         maEntries.erase( it );
    1875                 :            :     }
    1876                 :          0 : }
    1877                 :            : 
    1878                 :            : // -----------------------------------------------------------------------
    1879                 :          6 : int RegionData_Impl::Compare( RegionData_Impl* pCompare ) const
    1880                 :            : {
    1881                 :          6 :     int nCompare = maTitle.compareTo( pCompare->maTitle );
    1882                 :            : 
    1883                 :          6 :     return nCompare;
    1884                 :            : }
    1885                 :            : 
    1886                 :            : // -----------------------------------------------------------------------
    1887                 :            : 
    1888                 :         14 : SfxDocTemplate_Impl::SfxDocTemplate_Impl()
    1889                 :            : : mbConstructed( sal_False )
    1890 [ +  - ][ +  - ]:         14 : , mnLockCounter( 0 )
    1891                 :            : {
    1892                 :         14 : }
    1893                 :            : 
    1894                 :            : // -----------------------------------------------------------------------
    1895         [ +  - ]:         11 : SfxDocTemplate_Impl::~SfxDocTemplate_Impl()
    1896                 :            : {
    1897         [ +  - ]:         11 :     Clear();
    1898                 :            : 
    1899                 :         11 :     gpTemplateData = NULL;
    1900         [ -  + ]:         22 : }
    1901                 :            : 
    1902                 :            : // -----------------------------------------------------------------------
    1903                 :         16 : void SfxDocTemplate_Impl::IncrementLock()
    1904                 :            : {
    1905         [ +  - ]:         16 :     ::osl::MutexGuard aGuard( maMutex );
    1906         [ +  - ]:         16 :     mnLockCounter++;
    1907                 :         16 : }
    1908                 :            : 
    1909                 :            : // -----------------------------------------------------------------------
    1910                 :         16 : void SfxDocTemplate_Impl::DecrementLock()
    1911                 :            : {
    1912         [ +  - ]:         16 :     ::osl::MutexGuard aGuard( maMutex );
    1913         [ +  - ]:         16 :     if ( mnLockCounter )
    1914         [ +  - ]:         16 :         mnLockCounter--;
    1915                 :         16 : }
    1916                 :            : 
    1917                 :            : // -----------------------------------------------------------------------
    1918                 :          6 : RegionData_Impl* SfxDocTemplate_Impl::GetRegion( size_t nIndex ) const
    1919                 :            : {
    1920         [ +  - ]:          6 :     if ( nIndex < maRegions.size() )
    1921                 :          6 :         return maRegions[ nIndex ];
    1922                 :          6 :     return NULL;
    1923                 :            : }
    1924                 :            : 
    1925                 :            : // -----------------------------------------------------------------------
    1926                 :          0 : RegionData_Impl* SfxDocTemplate_Impl::GetRegion( const OUString& rName )
    1927                 :            :     const
    1928                 :            : {
    1929         [ #  # ]:          0 :     for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
    1930                 :            :     {
    1931                 :          0 :         RegionData_Impl* pData = maRegions[ i ];
    1932         [ #  # ]:          0 :         if( pData->GetTitle() == rName )
    1933                 :          0 :             return pData;
    1934                 :            :     }
    1935                 :          0 :     return NULL;
    1936                 :            : }
    1937                 :            : 
    1938                 :            : // -----------------------------------------------------------------------
    1939                 :          0 : void SfxDocTemplate_Impl::DeleteRegion( size_t nIndex )
    1940                 :            : {
    1941         [ #  # ]:          0 :     if ( nIndex < maRegions.size() )
    1942                 :            :     {
    1943 [ #  # ][ #  # ]:          0 :         delete maRegions[ nIndex ];
    1944                 :          0 :         RegionList_Impl::iterator it = maRegions.begin();
    1945         [ #  # ]:          0 :         advance( it, nIndex );
    1946         [ #  # ]:          0 :         maRegions.erase( it );
    1947                 :            :     }
    1948                 :          0 : }
    1949                 :            : 
    1950                 :            : // -----------------------------------------------------------------------
    1951                 :            : /*  AddRegion adds a Region to the RegionList
    1952                 :            : */
    1953                 :          6 : void SfxDocTemplate_Impl::AddRegion( const OUString& rTitle,
    1954                 :            :                                      Content& rContent )
    1955                 :            : {
    1956                 :            :     RegionData_Impl* pRegion;
    1957 [ +  - ][ +  - ]:          6 :     pRegion = new RegionData_Impl( this, rTitle );
    1958                 :            : 
    1959 [ +  - ][ -  + ]:          6 :     if ( ! InsertRegion( pRegion ) )
    1960                 :            :     {
    1961 [ #  # ][ #  # ]:          0 :         delete pRegion;
    1962                 :          6 :         return;
    1963                 :            :     }
    1964                 :            : 
    1965                 :            :     // now get the content of the region
    1966                 :          6 :     uno::Reference< XResultSet > xResultSet;
    1967         [ +  - ]:          6 :     Sequence< OUString > aProps(2);
    1968         [ +  - ]:          6 :     aProps[0] = OUString(TITLE );
    1969         [ +  - ]:          6 :     aProps[1] = OUString(TARGET_URL );
    1970                 :            : 
    1971                 :            :     try
    1972                 :            :     {
    1973                 :          6 :         ResultSetInclude eInclude = INCLUDE_DOCUMENTS_ONLY;
    1974         [ +  - ]:          6 :         Sequence< NumberedSortingInfo >     aSortingInfo(1);
    1975         [ +  - ]:          6 :         aSortingInfo.getArray()->ColumnIndex = 1;
    1976         [ +  - ]:          6 :         aSortingInfo.getArray()->Ascending = sal_True;
    1977 [ +  - ][ +  - ]:          6 :         xResultSet = rContent.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
         [ +  - ][ #  # ]
    1978                 :            :     }
    1979         [ #  # ]:          0 :     catch ( Exception& ) {}
    1980                 :            : 
    1981         [ +  - ]:          6 :     if ( xResultSet.is() )
    1982                 :            :     {
    1983         [ +  - ]:          6 :         uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
    1984         [ +  - ]:          6 :         uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
    1985                 :            : 
    1986                 :            :         try
    1987                 :            :         {
    1988 [ +  - ][ +  - ]:         26 :             while ( xResultSet->next() )
                 [ +  + ]
    1989                 :            :             {
    1990 [ +  - ][ +  - ]:         20 :                 OUString aTitle( xRow->getString( 1 ) );
    1991 [ +  - ][ +  - ]:         20 :                 OUString aTargetDir( xRow->getString( 2 ) );
    1992                 :            : 
    1993         [ +  - ]:         20 :                 pRegion->AddEntry( aTitle, aTargetDir );
    1994         [ #  # ]:         20 :             }
    1995                 :            :         }
    1996         [ #  # ]:          6 :         catch ( Exception& ) {}
    1997         [ +  - ]:          6 :     }
    1998                 :            : }
    1999                 :            : 
    2000                 :            : // -----------------------------------------------------------------------
    2001                 :          2 : void SfxDocTemplate_Impl::CreateFromHierarchy( Content &rTemplRoot )
    2002                 :            : {
    2003                 :          2 :     uno::Reference< XResultSet > xResultSet;
    2004         [ +  - ]:          2 :     Sequence< OUString > aProps(1);
    2005         [ +  - ]:          2 :     aProps[0] = OUString(TITLE );
    2006                 :            : 
    2007                 :            :     try
    2008                 :            :     {
    2009                 :          2 :         ResultSetInclude eInclude = INCLUDE_FOLDERS_ONLY;
    2010         [ +  - ]:          2 :         Sequence< NumberedSortingInfo >     aSortingInfo(1);
    2011         [ +  - ]:          2 :         aSortingInfo.getArray()->ColumnIndex = 1;
    2012         [ +  - ]:          2 :         aSortingInfo.getArray()->Ascending = sal_True;
    2013 [ +  - ][ +  - ]:          2 :         xResultSet = rTemplRoot.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
         [ +  - ][ #  # ]
    2014                 :            :     }
    2015         [ #  # ]:          0 :     catch ( Exception& ) {}
    2016                 :            : 
    2017         [ +  - ]:          2 :     if ( xResultSet.is() )
    2018                 :            :     {
    2019                 :          2 :         uno::Reference< XCommandEnvironment > aCmdEnv;
    2020         [ +  - ]:          2 :         uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
    2021         [ +  - ]:          2 :         uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
    2022                 :            : 
    2023                 :            :         try
    2024                 :            :         {
    2025 [ +  - ][ +  - ]:          8 :             while ( xResultSet->next() )
                 [ +  + ]
    2026                 :            :             {
    2027 [ +  - ][ +  - ]:          6 :                 OUString aTitle( xRow->getString( 1 ) );
    2028                 :            : 
    2029 [ +  - ][ +  - ]:          6 :                 OUString aId = xContentAccess->queryContentIdentifierString();
    2030         [ +  - ]:          6 :                 Content  aContent = Content( aId, aCmdEnv );
    2031                 :            : 
    2032         [ +  - ]:          6 :                 AddRegion( aTitle, aContent );
    2033 [ +  - ][ #  # ]:          6 :             }
    2034                 :            :         }
    2035         [ #  # ]:          2 :         catch ( Exception& ) {}
    2036         [ +  - ]:          2 :     }
    2037                 :          2 : }
    2038                 :            : 
    2039                 :            : // ------------------------------------------------------------------------
    2040                 :         16 : sal_Bool SfxDocTemplate_Impl::Construct( )
    2041                 :            : {
    2042         [ +  - ]:         16 :     ::osl::MutexGuard aGuard( maMutex );
    2043                 :            : 
    2044         [ +  + ]:         16 :     if ( mbConstructed )
    2045                 :          2 :         return sal_True;
    2046                 :            : 
    2047         [ +  - ]:         14 :     uno::Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
    2048         [ +  - ]:         14 :     uno::Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
    2049                 :            : 
    2050                 :         14 :     OUString aService( SERVICENAME_DOCINFO  );
    2051 [ +  - ][ +  - ]:         14 :     uno::Reference< XPersist > xInfo( xFactory->createInstance( aService ), UNO_QUERY );
                 [ +  - ]
    2052         [ +  - ]:         14 :     mxInfo = xInfo;
    2053                 :            : 
    2054 [ +  - ][ +  - ]:         14 :     mxTemplates = frame::DocumentTemplates::create(xContext);
    2055                 :            : 
    2056         [ +  - ]:         14 :     uno::Reference< XLocalizable > xLocalizable( mxTemplates, UNO_QUERY );
    2057                 :            : 
    2058         [ +  - ]:         14 :     Sequence< Any > aCompareArg(1);
    2059 [ +  - ][ +  - ]:         14 :     *(aCompareArg.getArray()) <<= xLocalizable->getLocale();
         [ +  - ][ +  - ]
    2060                 :            :     m_rCompareFactory = uno::Reference< XAnyCompareFactory >(
    2061         [ +  - ]:         14 :                     xFactory->createInstanceWithArguments( OUString("com.sun.star.ucb.AnyCompareFactory"),
    2062                 :         14 :                                                            aCompareArg ),
    2063 [ +  - ][ +  - ]:         14 :                     UNO_QUERY );
                 [ +  - ]
    2064                 :            : 
    2065 [ +  - ][ +  - ]:         14 :     uno::Reference < XContent > aRootContent = mxTemplates->getContent();
    2066                 :         14 :     uno::Reference < XCommandEnvironment > aCmdEnv;
    2067                 :            : 
    2068         [ +  + ]:         14 :     if ( ! aRootContent.is() )
    2069                 :         12 :         return sal_False;
    2070                 :            : 
    2071                 :          2 :     mbConstructed = sal_True;
    2072 [ +  - ][ +  - ]:          2 :     maRootURL = aRootContent->getIdentifier()->getContentIdentifier();
         [ +  - ][ +  - ]
    2073                 :            : 
    2074 [ +  - ][ +  - ]:          2 :     ResStringArray  aLongNames( SfxResId( TEMPLATE_LONG_NAMES_ARY ) );
    2075                 :            : 
    2076         [ +  - ]:          2 :     if ( aLongNames.Count() )
    2077         [ +  - ]:          2 :         maStandardGroup = aLongNames.GetString( 0 );
    2078                 :            : 
    2079         [ +  - ]:          2 :     Content aTemplRoot( aRootContent, aCmdEnv );
    2080         [ +  - ]:          2 :     CreateFromHierarchy( aTemplRoot );
    2081                 :            : 
    2082 [ +  - ][ +  - ]:         16 :     return sal_True;
         [ +  - ][ +  - ]
    2083                 :            : }
    2084                 :            : 
    2085                 :            : // -----------------------------------------------------------------------
    2086                 :          0 : void SfxDocTemplate_Impl::ReInitFromComponent()
    2087                 :            : {
    2088         [ #  # ]:          0 :     uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
    2089         [ #  # ]:          0 :     if ( xTemplates.is() )
    2090                 :            :     {
    2091 [ #  # ][ #  # ]:          0 :         uno::Reference < XContent > aRootContent = xTemplates->getContent();
    2092                 :          0 :         uno::Reference < XCommandEnvironment > aCmdEnv;
    2093         [ #  # ]:          0 :         Content aTemplRoot( aRootContent, aCmdEnv );
    2094         [ #  # ]:          0 :         Clear();
    2095 [ #  # ][ #  # ]:          0 :         CreateFromHierarchy( aTemplRoot );
    2096                 :          0 :     }
    2097                 :          0 : }
    2098                 :            : 
    2099                 :            : // -----------------------------------------------------------------------
    2100                 :          6 : sal_Bool SfxDocTemplate_Impl::InsertRegion( RegionData_Impl *pNew, size_t nPos )
    2101                 :            : {
    2102         [ +  - ]:          6 :     ::osl::MutexGuard   aGuard( maMutex );
    2103                 :            : 
    2104                 :            :     // return false (not inserted) if the entry already exists
    2105         [ +  + ]:         12 :     for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
    2106         [ -  + ]:          6 :         if ( maRegions[ i ]->Compare( pNew ) == 0 )
    2107                 :          0 :             return sal_False;
    2108                 :            : 
    2109                 :          6 :     size_t newPos = nPos;
    2110         [ +  + ]:          6 :     if ( pNew->GetTitle() == maStandardGroup )
    2111                 :          2 :         newPos = 0;
    2112                 :            : 
    2113         [ +  + ]:          6 :     if ( newPos < maRegions.size() )
    2114                 :            :     {
    2115                 :          2 :         RegionList_Impl::iterator it = maRegions.begin();
    2116         [ +  - ]:          2 :         advance( it, newPos );
    2117         [ +  - ]:          2 :         maRegions.insert( it, pNew );
    2118                 :            :     }
    2119                 :            :     else
    2120         [ +  - ]:          4 :         maRegions.push_back( pNew );
    2121                 :            : 
    2122         [ +  - ]:          6 :     return sal_True;
    2123                 :            : }
    2124                 :            : 
    2125                 :            : // -----------------------------------------------------------------------
    2126                 :          0 : void SfxDocTemplate_Impl::Rescan()
    2127                 :            : {
    2128                 :          0 :     Clear();
    2129                 :            : 
    2130                 :            :     try
    2131                 :            :     {
    2132         [ #  # ]:          0 :         uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
    2133                 :            :         DBG_ASSERT( xTemplates.is(), "SfxDocTemplate_Impl::Rescan:invalid template instance!" );
    2134         [ #  # ]:          0 :         if ( xTemplates.is() )
    2135                 :            :         {
    2136 [ #  # ][ #  # ]:          0 :             xTemplates->update();
    2137                 :            : 
    2138 [ #  # ][ #  # ]:          0 :             uno::Reference < XContent > aRootContent = xTemplates->getContent();
    2139                 :          0 :             uno::Reference < XCommandEnvironment > aCmdEnv;
    2140                 :            : 
    2141         [ #  # ]:          0 :             Content aTemplRoot( aRootContent, aCmdEnv );
    2142 [ #  # ][ #  # ]:          0 :             CreateFromHierarchy( aTemplRoot );
    2143         [ #  # ]:          0 :         }
    2144                 :            :     }
    2145                 :          0 :     catch( const Exception& )
    2146                 :            :     {
    2147                 :            :         SAL_WARN( "sfx2.doc", "SfxDocTemplate_Impl::Rescan: caught an exception while doing the update!" );
    2148                 :            :     }
    2149                 :          0 : }
    2150                 :            : 
    2151                 :            : // -----------------------------------------------------------------------
    2152                 :          0 : sal_Bool SfxDocTemplate_Impl::GetTitleFromURL( const OUString& rURL,
    2153                 :            :                                            OUString& aTitle )
    2154                 :            : {
    2155         [ #  # ]:          0 :     if ( mxInfo.is() )
    2156                 :            :     {
    2157                 :            :         try
    2158                 :            :         {
    2159 [ #  # ][ #  # ]:          0 :             mxInfo->read( rURL );
    2160                 :            :         }
    2161                 :          0 :         catch ( Exception& )
    2162                 :            :         {
    2163                 :            :             // the document is not a StarOffice document
    2164                 :          0 :             return sal_False;
    2165                 :            :         }
    2166                 :            : 
    2167                 :            : 
    2168                 :            :         try
    2169                 :            :         {
    2170         [ #  # ]:          0 :             uno::Reference< XPropertySet > aPropSet( mxInfo, UNO_QUERY );
    2171         [ #  # ]:          0 :             if ( aPropSet.is() )
    2172                 :            :             {
    2173                 :          0 :                 OUString aPropName( TITLE  );
    2174 [ #  # ][ #  # ]:          0 :                 Any aValue = aPropSet->getPropertyValue( aPropName );
    2175                 :          0 :                 aValue >>= aTitle;
    2176   [ #  #  #  # ]:          0 :             }
    2177                 :            :         }
    2178                 :          0 :         catch ( IOException& ) {}
    2179                 :          0 :         catch ( UnknownPropertyException& ) {}
    2180                 :          0 :         catch ( Exception& ) {}
    2181                 :            :     }
    2182                 :            : 
    2183         [ #  # ]:          0 :     if ( aTitle.isEmpty() )
    2184                 :            :     {
    2185         [ #  # ]:          0 :         INetURLObject aURL( rURL );
    2186         [ #  # ]:          0 :         aURL.CutExtension();
    2187                 :            :         aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
    2188 [ #  # ][ #  # ]:          0 :                                INetURLObject::DECODE_WITH_CHARSET );
    2189                 :            :     }
    2190                 :            : 
    2191         [ #  # ]:          0 :     return sal_True;
    2192                 :            : }
    2193                 :            : 
    2194                 :            : 
    2195                 :            : // -----------------------------------------------------------------------
    2196                 :         11 : void SfxDocTemplate_Impl::Clear()
    2197                 :            : {
    2198         [ +  - ]:         11 :     ::osl::MutexGuard   aGuard( maMutex );
    2199         [ -  + ]:         11 :     if ( mnLockCounter )
    2200                 :         11 :         return;
    2201                 :            : 
    2202         [ +  + ]:         17 :     for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
    2203 [ +  - ][ +  - ]:          6 :         delete maRegions[ i ];
    2204 [ +  - ][ +  - ]:         11 :     maRegions.clear();
    2205                 :            : }
    2206                 :            : 
    2207                 :            : // -----------------------------------------------------------------------
    2208                 :          0 : sal_Bool getTextProperty_Impl( Content& rContent,
    2209                 :            :                                const OUString& rPropName,
    2210                 :            :                                OUString& rPropValue )
    2211                 :            : {
    2212                 :          0 :     sal_Bool bGotProperty = sal_False;
    2213                 :            : 
    2214                 :            :     // Get the property
    2215                 :            :     try
    2216                 :            :     {
    2217         [ #  # ]:          0 :         uno::Reference< XPropertySetInfo > aPropInfo = rContent.getProperties();
    2218                 :            : 
    2219                 :            :         // check, whether or not the property exists
    2220 [ #  # ][ #  # ]:          0 :         if ( !aPropInfo.is() || !aPropInfo->hasPropertyByName( rPropName ) )
         [ #  # ][ #  # ]
                 [ #  # ]
    2221                 :            :         {
    2222                 :          0 :             return sal_False;
    2223                 :            :         }
    2224                 :            : 
    2225                 :            :         // now get the property
    2226                 :          0 :         Any aAnyValue;
    2227                 :            : 
    2228         [ #  # ]:          0 :         aAnyValue = rContent.getPropertyValue( rPropName );
    2229                 :          0 :         aAnyValue >>= rPropValue;
    2230                 :            : 
    2231 [ #  # ][ #  # ]:          0 :         if ( SfxURLRelocator_Impl::propertyCanContainOfficeDir( rPropName ) )
    2232                 :            :         {
    2233 [ #  # ][ #  # ]:          0 :             SfxURLRelocator_Impl aRelocImpl( ::comphelper::getProcessServiceFactory() );
    2234 [ #  # ][ #  # ]:          0 :             aRelocImpl.makeAbsoluteURL( rPropValue );
    2235                 :            :         }
    2236                 :            : 
    2237         [ #  # ]:          0 :         bGotProperty = sal_True;
              [ #  #  # ]
    2238                 :            :     }
    2239                 :          0 :     catch ( RuntimeException& ) {}
    2240                 :          0 :     catch ( Exception& ) {}
    2241                 :            : 
    2242                 :          0 :     return bGotProperty;
    2243                 :            : }
    2244                 :            : 
    2245                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10