LCOV - code coverage report
Current view: top level - libreoffice/sfx2/source/doc - doctempl.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 64 771 8.3 %
Date: 2012-12-27 Functions: 17 83 20.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      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/Desktop.hpp>
      45             : #include <com/sun/star/frame/XComponentLoader.hpp>
      46             : #include <com/sun/star/frame/DocumentTemplates.hpp>
      47             : #include <com/sun/star/frame/XDocumentTemplates.hpp>
      48             : #include <com/sun/star/io/XInputStream.hpp>
      49             : #include <com/sun/star/io/XPersist.hpp>
      50             : #include <com/sun/star/lang/XLocalizable.hpp>
      51             : #include <com/sun/star/sdbc/XResultSet.hpp>
      52             : #include <com/sun/star/sdbc/XRow.hpp>
      53             : #include <com/sun/star/ucb/ContentInfo.hpp>
      54             : #include <com/sun/star/ucb/InsertCommandArgument.hpp>
      55             : #include <com/sun/star/ucb/NameClash.hpp>
      56             : #include <com/sun/star/ucb/TransferInfo.hpp>
      57             : #include <com/sun/star/ucb/XCommandProcessor.hpp>
      58             : #include <com/sun/star/ucb/XContent.hpp>
      59             : #include <com/sun/star/ucb/XContentAccess.hpp>
      60             : #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
      61             : #include <com/sun/star/ucb/XAnyCompare.hpp>
      62             : #include <com/sun/star/ucb/NumberedSortingInfo.hpp>
      63             : #include <com/sun/star/embed/ElementModes.hpp>
      64             : #include <com/sun/star/embed/XTransactedObject.hpp>
      65             : 
      66             : #include "sfxurlrelocator.hxx"
      67             : 
      68             : using namespace ::com::sun::star;
      69             : using namespace ::com::sun::star::beans;
      70             : using namespace ::com::sun::star::frame;
      71             : using namespace ::com::sun::star::io;
      72             : using namespace ::com::sun::star::lang;
      73             : using namespace ::com::sun::star::sdbc;
      74             : using namespace ::com::sun::star::uno;
      75             : using namespace ::com::sun::star::ucb;
      76             : using namespace ::com::sun::star::document;
      77             : using namespace ::rtl;
      78             : using namespace ::ucbhelper;
      79             : 
      80             : 
      81             : #include <sfx2/doctempl.hxx>
      82             : #include <sfx2/docfac.hxx>
      83             : #include <sfx2/docfile.hxx>
      84             : #include <sfx2/objsh.hxx>
      85             : #include "sfxtypes.hxx"
      86             : #include <sfx2/app.hxx>
      87             : #include "sfx2/sfxresid.hxx"
      88             : #include <sfx2/templatelocnames.hrc>
      89             : #include "doc.hrc"
      90             : #include <sfx2/fcontnr.hxx>
      91             : #include <svtools/templatefoldercache.hxx>
      92             : 
      93             : #include <comphelper/storagehelper.hxx>
      94             : #include <unotools/ucbhelper.hxx>
      95             : 
      96             : #include <vector>
      97             : using ::std::vector;
      98             : using ::std::advance;
      99             : 
     100             : //========================================================================
     101             : 
     102             : #define TITLE                   "Title"
     103             : #define TARGET_URL              "TargetURL"
     104             : 
     105             : #define TARGET_DIR_URL          "TargetDirURL"
     106             : #define COMMAND_TRANSFER        "transfer"
     107             : 
     108             : #define SERVICENAME_DOCINFO             "com.sun.star.document.DocumentProperties"
     109             : 
     110             : //========================================================================
     111             : 
     112             : class RegionData_Impl;
     113             : 
     114             : namespace DocTempl {
     115             : 
     116           0 : 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           0 :     void                SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; }
     143           0 :     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           0 :     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           0 :     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           0 :     size_t              GetRegionCount() const
     241           0 :                             { 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           0 :     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           4 :     DocTemplLocker_Impl( SfxDocTemplate_Impl& aDocTempl )
     259           4 :     : m_aDocTempl( aDocTempl )
     260             :     {
     261           4 :         m_aDocTempl.IncrementLock();
     262           4 :     }
     263             : 
     264           4 :     ~DocTemplLocker_Impl()
     265             :     {
     266           4 :         m_aDocTempl.DecrementLock();
     267           4 :     }
     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          31 : 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           0 : 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           0 :     DocTemplLocker_Impl aLocker( *pImp );
     375             : 
     376           0 :     if ( !pImp->Construct() )
     377           0 :         return 0;
     378             : 
     379           0 :     sal_uIntPtr nCount = pImp->GetRegionCount();
     380             : 
     381           0 :     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, comphelper::getProcessComponentContext(), 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           0 : OUString SfxDocumentTemplates::ConvertResourceString (
     589             :     int nSourceResIds, int nDestResIds, int nCount, const OUString& rString )
     590             : {
     591           0 :     for( int i = 0; i < nCount; ++i )
     592             :     {
     593           0 :         if( rString == SFX2_RESSTR(nSourceResIds + i))
     594           0 :             return SFX2_RESSTR(nDestResIds + i);
     595             :     }
     596           0 :     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, comphelper::getProcessComponentContext() );
     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 :         uno::Reference< XDesktop2 > xDesktop = Desktop::create( ::comphelper::getProcessComponentContext() );;
     893             : 
     894           0 :         Sequence< PropertyValue > aArgs( 1 );
     895           0 :         aArgs[0].Name = ::rtl::OUString("Hidden");
     896           0 :         aArgs[0].Value <<= sal_True;
     897             : 
     898           0 :         INetURLObject   aTemplURL( rName );
     899           0 :         uno::Reference< XDocumentPropertiesSupplier > xDocPropsSupplier;
     900           0 :         uno::Reference< XStorable > xStorable;
     901             :         try
     902             :         {
     903             :             xStorable = uno::Reference< XStorable >(
     904           0 :                 xDesktop->loadComponentFromURL( aTemplURL.GetMainURL(INetURLObject::NO_DECODE),
     905             :                                                 OUString("_blank"),
     906             :                                                 0,
     907           0 :                                                 aArgs ),
     908           0 :                 UNO_QUERY );
     909             : 
     910             :             xDocPropsSupplier = uno::Reference< XDocumentPropertiesSupplier >(
     911           0 :                 xStorable, UNO_QUERY );
     912             :         }
     913           0 :         catch( Exception& )
     914             :         {
     915             :         }
     916             : 
     917           0 :         if( xStorable.is() )
     918             :         {
     919             :             // get Title from XDocumentPropertiesSupplier
     920           0 :             if( xDocPropsSupplier.is() )
     921             :             {
     922             :                 uno::Reference< XDocumentProperties > xDocProps
     923           0 :                     = xDocPropsSupplier->getDocumentProperties();
     924           0 :                 if (xDocProps.is() ) {
     925           0 :                     aTitle = xDocProps->getTitle();
     926           0 :                 }
     927             :             }
     928             : 
     929           0 :             if( aTitle.isEmpty() )
     930             :             {
     931           0 :                 INetURLObject aURL( aTemplURL );
     932           0 :                 aURL.CutExtension();
     933             :                 aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
     934           0 :                                         INetURLObject::DECODE_WITH_CHARSET );
     935             :             }
     936             : 
     937             :             // write a template using XStorable interface
     938           0 :             bTemplateAdded = xTemplates->storeTemplate( pTargetRgn->GetTitle(), aTitle, xStorable );
     939           0 :         }
     940             :     }
     941             : 
     942             : 
     943           0 :     if( bTemplateAdded )
     944             :     {
     945           0 :         INetURLObject aTemplObj( pTargetRgn->GetHierarchyURL() );
     946             :         aTemplObj.insertName( aTitle, false,
     947             :                               INetURLObject::LAST_SEGMENT, true,
     948           0 :                               INetURLObject::ENCODE_ALL );
     949           0 :         OUString aTemplURL = aTemplObj.GetMainURL( INetURLObject::NO_DECODE );
     950             : 
     951           0 :         uno::Reference< XCommandEnvironment > aCmdEnv;
     952           0 :         Content aTemplCont;
     953             : 
     954           0 :         if( Content::create( aTemplURL, aCmdEnv, comphelper::getProcessComponentContext(), aTemplCont ) )
     955             :         {
     956           0 :             OUString aTemplName;
     957           0 :             OUString aPropName( TARGET_URL  );
     958             : 
     959           0 :             if( getTextProperty_Impl( aTemplCont, aPropName, aTemplName ) )
     960             :             {
     961           0 :                 if ( nIdx == USHRT_MAX )
     962           0 :                     nIdx = 0;
     963             :                 else
     964           0 :                     nIdx += 1;
     965             : 
     966             :                 // todo: fix SfxDocumentTemplates to handle size_t instead of sal_uInt16
     967           0 :                 size_t temp_nIdx = nIdx;
     968           0 :                 pTargetRgn->AddEntry( aTitle, aTemplName, &temp_nIdx );
     969           0 :                 rName = aTitle;
     970           0 :                 return sal_True;
     971             :             }
     972             :             else
     973             :             {
     974             :                 DBG_ASSERT( sal_False, "CopyFrom(): The content should contain target URL!" );
     975           0 :             }
     976             :         }
     977             :         else
     978             :         {
     979             :             DBG_ASSERT( sal_False, "CopyFrom(): The content just was created!" );
     980           0 :         }
     981             :     }
     982             : 
     983           0 :     return sal_False;
     984             : }
     985             : 
     986             : //------------------------------------------------------------------------
     987             : 
     988           0 : sal_Bool SfxDocumentTemplates::Delete
     989             : (
     990             :     sal_uInt16 nRegion,             //  Region Index
     991             :     sal_uInt16 nIdx                 /*  Index of the entry or USHRT_MAX,
     992             :                                     if a directory is meant. */
     993             : )
     994             : 
     995             : /*  [Description]
     996             : 
     997             :     Deleting an entry or a directory
     998             : 
     999             :     [Return value]
    1000             : 
    1001             :     sal_Bool            sal_True,   Action could be performed
    1002             :                         sal_False,  Action could not be performed
    1003             : 
    1004             :     [Cross-references]
    1005             : 
    1006             :     <SfxDocumentTemplates::InsertDir(const String&,sal_uInt16)>
    1007             :     <SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
    1008             : */
    1009             : 
    1010             : {
    1011           0 :     DocTemplLocker_Impl aLocker( *pImp );
    1012             : 
    1013             :     /* delete the template or folder in the hierarchy and in the
    1014             :        template folder by sending a delete command to the content.
    1015             :        Then remove the data from the lists
    1016             :     */
    1017           0 :     if ( ! pImp->Construct() )
    1018           0 :         return sal_False;
    1019             : 
    1020           0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1021             : 
    1022           0 :     if ( !pRegion )
    1023           0 :         return sal_False;
    1024             : 
    1025             :     sal_Bool bRet;
    1026           0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
    1027             : 
    1028           0 :     if ( nIdx == USHRT_MAX )
    1029             :     {
    1030           0 :         bRet = xTemplates->removeGroup( pRegion->GetTitle() );
    1031           0 :         if ( bRet )
    1032           0 :             pImp->DeleteRegion( nRegion );
    1033             :     }
    1034             :     else
    1035             :     {
    1036           0 :         DocTempl_EntryData_Impl *pEntry = pRegion->GetEntry( nIdx );
    1037             : 
    1038           0 :         if ( !pEntry )
    1039           0 :             return sal_False;
    1040             : 
    1041           0 :         bRet = xTemplates->removeTemplate( pRegion->GetTitle(),
    1042           0 :                                            pEntry->GetTitle() );
    1043           0 :         if( bRet )
    1044           0 :             pRegion->DeleteEntry( nIdx );
    1045             :     }
    1046             : 
    1047           0 :     return bRet;
    1048             : }
    1049             : 
    1050             : //------------------------------------------------------------------------
    1051             : 
    1052           0 : sal_Bool SfxDocumentTemplates::InsertDir
    1053             : (
    1054             :     const String&   rText,      //  the logical name of the new Region
    1055             :     sal_uInt16          nRegion     //  Region Index
    1056             : )
    1057             : 
    1058             : /*  [Description]
    1059             : 
    1060             :     Insert an index
    1061             : 
    1062             :     [Return value]
    1063             : 
    1064             :     sal_Bool            sal_True,   Action could be performed
    1065             :                         sal_False,  Action could not be performed
    1066             : 
    1067             :     [Cross-references]
    1068             : 
    1069             :     <SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
    1070             : */
    1071             : {
    1072           0 :     DocTemplLocker_Impl aLocker( *pImp );
    1073             : 
    1074           0 :     if ( ! pImp->Construct() )
    1075           0 :         return sal_False;
    1076             : 
    1077           0 :     RegionData_Impl *pRegion = pImp->GetRegion( rText );
    1078             : 
    1079           0 :     if ( pRegion )
    1080           0 :         return sal_False;
    1081             : 
    1082           0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
    1083             : 
    1084           0 :     if ( xTemplates->addGroup( rText ) )
    1085             :     {
    1086           0 :         RegionData_Impl* pNewRegion = new RegionData_Impl( pImp, rText );
    1087             : 
    1088           0 :         if ( ! pImp->InsertRegion( pNewRegion, nRegion ) )
    1089             :         {
    1090           0 :             delete pNewRegion;
    1091           0 :             return sal_False;
    1092             :         }
    1093           0 :         return sal_True;
    1094             :     }
    1095             : 
    1096           0 :     return sal_False;
    1097             : }
    1098             : 
    1099             : //------------------------------------------------------------------------
    1100             : 
    1101           0 : sal_Bool SfxDocumentTemplates::SetName
    1102             : (
    1103             :     const String&   rName,      //  Der zu setzende Name
    1104             :     sal_uInt16          nRegion,    //  Region Index
    1105             :     sal_uInt16          nIdx        /*  Index of the entry oder USHRT_MAX,
    1106             :                                     if a directory is meant. */
    1107             : )
    1108             : 
    1109             : /*  [Description]
    1110             : 
    1111             :     Change the name of an entry or a directory
    1112             : 
    1113             :     [Return value]
    1114             : 
    1115             :     sal_Bool            sal_True,   Action could be performed
    1116             :                         sal_False,  Action could not be performed
    1117             : 
    1118             : */
    1119             : 
    1120             : {
    1121           0 :     DocTemplLocker_Impl aLocker( *pImp );
    1122             : 
    1123           0 :     if ( ! pImp->Construct() )
    1124           0 :         return sal_False;
    1125             : 
    1126           0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1127           0 :     DocTempl_EntryData_Impl *pEntry = NULL;
    1128             : 
    1129           0 :     if ( !pRegion )
    1130           0 :         return sal_False;
    1131             : 
    1132           0 :     uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
    1133           0 :     OUString aEmpty;
    1134             : 
    1135           0 :     if ( nIdx == USHRT_MAX )
    1136             :     {
    1137           0 :         if ( pRegion->GetTitle() == OUString( rName ) )
    1138           0 :             return sal_True;
    1139             : 
    1140             :         // we have to rename a region
    1141           0 :         if ( xTemplates->renameGroup( pRegion->GetTitle(), rName ) )
    1142             :         {
    1143           0 :             pRegion->SetTitle( rName );
    1144           0 :             pRegion->SetTargetURL( aEmpty );
    1145           0 :             pRegion->SetHierarchyURL( aEmpty );
    1146           0 :             return sal_True;
    1147             :         }
    1148             :     }
    1149             :     else
    1150             :     {
    1151           0 :         pEntry = pRegion->GetEntry( nIdx );
    1152             : 
    1153           0 :         if ( !pEntry )
    1154           0 :             return sal_False;
    1155             : 
    1156           0 :         if ( pEntry->GetTitle() == OUString( rName ) )
    1157           0 :             return sal_True;
    1158             : 
    1159           0 :         if ( xTemplates->renameTemplate( pRegion->GetTitle(),
    1160           0 :                                          pEntry->GetTitle(),
    1161           0 :                                          rName ) )
    1162             :         {
    1163           0 :             pEntry->SetTitle( rName );
    1164           0 :             pEntry->SetTargetURL( aEmpty );
    1165           0 :             pEntry->SetHierarchyURL( aEmpty );
    1166           0 :             return sal_True;
    1167             :         }
    1168             :     }
    1169             : 
    1170           0 :     return sal_False;
    1171             : }
    1172             : 
    1173             : //------------------------------------------------------------------------
    1174             : 
    1175           0 : sal_Bool SfxDocumentTemplates::Rescan()
    1176             : 
    1177             : /*  [Description]
    1178             : 
    1179             :     Comparison of administrative data with the current state on disk.
    1180             :     The logical name for which no file exists, will be removed from the
    1181             :     administrative structure. Files for which no record exists will be included.
    1182             : 
    1183             :     [Return value]
    1184             : 
    1185             :     sal_Bool            sal_True,   Action could be performed
    1186             :                         sal_False,  Action could not be performed
    1187             : 
    1188             :     [Cross-references]
    1189             : 
    1190             :     <SfxTemplateDir::Scan(sal_Bool bDirectory, sal_Bool bSave)>
    1191             :     <SfxTemplateDir::Freshen(const SfxTemplateDir &rNew)>
    1192             : */
    1193             : {
    1194           0 :     if ( !pImp->Construct() )
    1195           0 :         return sal_False;
    1196             : 
    1197           0 :     pImp->Rescan();
    1198             : 
    1199           0 :     return sal_True;
    1200             : }
    1201             : 
    1202             : //------------------------------------------------------------------------
    1203             : 
    1204           0 : SfxObjectShellRef SfxDocumentTemplates::CreateObjectShell
    1205             : (
    1206             :     sal_uInt16 nRegion,         //  Region Index
    1207             :     sal_uInt16 nIdx             //  Index of the entry
    1208             : )
    1209             : 
    1210             : /*  [Description]
    1211             : 
    1212             :     Access to the document shell of an entry
    1213             : 
    1214             :     [Return value]
    1215             : 
    1216             :     SfxObjectShellRef         Referece to the ObjectShell
    1217             : 
    1218             :     [Cross-references]
    1219             : 
    1220             :     <SfxTemplateDirEntry::CreateObjectShell()>
    1221             :     <SfxDocumentTemplates::DeleteObjectShell(sal_uInt16, sal_uInt16)>
    1222             : */
    1223             : 
    1224             : {
    1225           0 :     DocTemplLocker_Impl aLocker( *pImp );
    1226             : 
    1227           0 :     if ( !pImp->Construct() )
    1228           0 :         return NULL;
    1229             : 
    1230           0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1231           0 :     DocTempl_EntryData_Impl *pEntry = NULL;
    1232             : 
    1233           0 :     if ( pRegion )
    1234           0 :         pEntry = pRegion->GetEntry( nIdx );
    1235             : 
    1236           0 :     if ( pEntry )
    1237           0 :         return pEntry->CreateObjectShell();
    1238             :     else
    1239           0 :         return NULL;
    1240             : }
    1241             : 
    1242             : //------------------------------------------------------------------------
    1243             : 
    1244           0 : sal_Bool SfxDocumentTemplates::DeleteObjectShell
    1245             : (
    1246             :     sal_uInt16 nRegion,         //  Region Index
    1247             :     sal_uInt16 nIdx             //  Index of the entry
    1248             : )
    1249             : 
    1250             : /*  [Description]
    1251             : 
    1252             :     Releasing the ObjectShell of an entry
    1253             : 
    1254             :     [Return value]
    1255             : 
    1256             :     sal_Bool            sal_True,   Action could be performed
    1257             :                         sal_False,  Action could not be performed
    1258             : 
    1259             :     [Cross-references]
    1260             : 
    1261             :     <SfxTemplateDirEntry::DeleteObjectShell()>
    1262             :     <SfxDocumentTemplates::CreateObjectShell(sal_uInt16, sal_uInt16)>
    1263             : */
    1264             : 
    1265             : {
    1266           0 :     DocTemplLocker_Impl aLocker( *pImp );
    1267             : 
    1268           0 :     if ( ! pImp->Construct() )
    1269           0 :         return sal_True;
    1270             : 
    1271           0 :     RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
    1272           0 :     DocTempl_EntryData_Impl *pEntry = NULL;
    1273             : 
    1274           0 :     if ( pRegion )
    1275           0 :         pEntry = pRegion->GetEntry( nIdx );
    1276             : 
    1277           0 :     if ( pEntry )
    1278           0 :         return pEntry->DeleteObjectShell();
    1279             :     else
    1280           0 :         return sal_True;
    1281             : }
    1282             : 
    1283             : //------------------------------------------------------------------------
    1284             : 
    1285           4 : sal_Bool SfxDocumentTemplates::GetFull
    1286             : (
    1287             :     const String &rRegion,      // Region Name
    1288             :     const String &rName,        // Template Name
    1289             :     String &rPath               // Out: Path + File name
    1290             : )
    1291             : 
    1292             : /*  [Description]
    1293             : 
    1294             :     Returns Path + File name of the template specified by rRegion and rName.
    1295             : 
    1296             :     [Return value]
    1297             : 
    1298             :     sal_Bool            sal_True,   Action could be performed
    1299             :                         sal_False,  Action could not be performed
    1300             : 
    1301             :     [Cross-references]
    1302             : 
    1303             :     <SfxDocumentTemplates::GetLogicNames(const String&,String&,String&)>
    1304             : */
    1305             : 
    1306             : {
    1307           4 :     DocTemplLocker_Impl aLocker( *pImp );
    1308             : 
    1309             :     // We don't search for empty names!
    1310           4 :     if ( ! rName.Len() )
    1311           0 :         return sal_False;
    1312             : 
    1313           4 :     if ( ! pImp->Construct() )
    1314           4 :         return sal_False;
    1315             : 
    1316           0 :     DocTempl_EntryData_Impl* pEntry = NULL;
    1317           0 :     const sal_uInt16 nCount = GetRegionCount();
    1318             : 
    1319           0 :     for ( sal_uInt16 i = 0; i < nCount; ++i )
    1320             :     {
    1321           0 :         RegionData_Impl *pRegion = pImp->GetRegion( i );
    1322             : 
    1323           0 :         if( pRegion &&
    1324           0 :             ( !rRegion.Len() || ( rRegion == String( pRegion->GetTitle() ) ) ) )
    1325             :         {
    1326           0 :             pEntry = pRegion->GetEntry( rName );
    1327             : 
    1328           0 :             if ( pEntry )
    1329             :             {
    1330           0 :                 rPath = pEntry->GetTargetURL();
    1331           0 :                 break;
    1332             :             }
    1333             :         }
    1334             :     }
    1335             : 
    1336           0 :     return ( pEntry != NULL );
    1337             : }
    1338             : 
    1339             : //------------------------------------------------------------------------
    1340             : 
    1341           0 : sal_Bool SfxDocumentTemplates::GetLogicNames
    1342             : (
    1343             :     const String &rPath,            // Full Path to the template
    1344             :     String &rRegion,                // Out: Region name
    1345             :     String &rName                   // Out: Template name
    1346             : ) const
    1347             : 
    1348             : /*  [Description]
    1349             : 
    1350             :     Returns and logical path name to the template specified by rPath
    1351             : 
    1352             :     [Return value]
    1353             : 
    1354             :     sal_Bool            sal_True,   Action could be performed
    1355             :                         sal_False,  Action could not be performed
    1356             : 
    1357             :     [Cross-references]
    1358             : 
    1359             :     <SfxDocumentTemplates::GetFull(const String&,const String&,DirEntry&)>
    1360             : */
    1361             : 
    1362             : {
    1363           0 :     DocTemplLocker_Impl aLocker( *pImp );
    1364             : 
    1365           0 :     if ( ! pImp->Construct() )
    1366           0 :         return sal_False;
    1367             : 
    1368           0 :     INetURLObject aFullPath;
    1369             : 
    1370           0 :     aFullPath.SetSmartProtocol( INET_PROT_FILE );
    1371           0 :     aFullPath.SetURL( rPath );
    1372           0 :     OUString aPath( aFullPath.GetMainURL( INetURLObject::NO_DECODE ) );
    1373             : 
    1374           0 :     RegionData_Impl *pData = NULL;
    1375           0 :     DocTempl_EntryData_Impl  *pEntry = NULL;
    1376           0 :     sal_Bool         bFound = sal_False;
    1377             : 
    1378           0 :     sal_uIntPtr nCount = GetRegionCount();
    1379             : 
    1380           0 :     for ( sal_uIntPtr i=0; !bFound && (i<nCount); i++ )
    1381             :     {
    1382           0 :         pData = pImp->GetRegion( i );
    1383           0 :         if ( pData )
    1384             :         {
    1385           0 :             sal_uIntPtr nChildCount = pData->GetCount();
    1386             : 
    1387           0 :             for ( sal_uIntPtr j=0; !bFound && (j<nChildCount); j++ )
    1388             :             {
    1389           0 :                 pEntry = pData->GetEntry( j );
    1390           0 :                 if ( pEntry->GetTargetURL() == aPath )
    1391             :                 {
    1392           0 :                     bFound = sal_True;
    1393             :                 }
    1394             :             }
    1395             :         }
    1396             :     }
    1397             : 
    1398           0 :     if ( bFound )
    1399             :     {
    1400           0 :         rRegion = pData->GetTitle();
    1401           0 :         rName = pEntry->GetTitle();
    1402             :     }
    1403             : 
    1404           0 :     return bFound;
    1405             : }
    1406             : 
    1407             : //------------------------------------------------------------------------
    1408             : 
    1409           4 : SfxDocumentTemplates::SfxDocumentTemplates()
    1410             : 
    1411             : /*  [Description]
    1412             : 
    1413             :     Constructor
    1414             : */
    1415             : {
    1416           4 :     if ( !gpTemplateData )
    1417           4 :         gpTemplateData = new SfxDocTemplate_Impl;
    1418             : 
    1419           4 :     pImp = gpTemplateData;
    1420           4 : }
    1421             : 
    1422             : //-------------------------------------------------------------------------
    1423             : 
    1424           3 : void SfxDocumentTemplates::Construct()
    1425             : 
    1426             : //  Delayed build-up of administrative data
    1427             : 
    1428             : {
    1429           3 : }
    1430             : 
    1431             : //------------------------------------------------------------------------
    1432             : 
    1433           6 : SfxDocumentTemplates::~SfxDocumentTemplates()
    1434             : 
    1435             : /*  [Description]
    1436             : 
    1437             :     Destructor
    1438             :     Release of administrative data
    1439             : */
    1440             : 
    1441             : {
    1442           3 :     pImp = NULL;
    1443           3 : }
    1444             : 
    1445           0 : void SfxDocumentTemplates::Update( sal_Bool _bSmart )
    1446             : {
    1447           0 :     if  (   !_bSmart                                                // don't be smart
    1448           0 :         ||  ::svt::TemplateFolderCache( sal_True ).needsUpdate()    // update is really necessary
    1449             :         )
    1450             :     {
    1451           0 :         if ( pImp->Construct() )
    1452           0 :             pImp->Rescan();
    1453             :     }
    1454           0 : }
    1455             : 
    1456           0 : void SfxDocumentTemplates::ReInitFromComponent()
    1457             : {
    1458           0 :     pImp->ReInitFromComponent();
    1459           0 : }
    1460             : 
    1461             : 
    1462           0 : sal_Bool SfxDocumentTemplates::HasUserContents( sal_uInt16 nRegion, sal_uInt16 nIdx ) const
    1463             : {
    1464           0 :     DocTemplLocker_Impl aLocker( *pImp );
    1465             : 
    1466           0 :     sal_Bool bResult = sal_False;
    1467             : 
    1468           0 :     RegionData_Impl* pRegion = pImp->GetRegion( nRegion );
    1469             : 
    1470           0 :     if ( pRegion )
    1471             :     {
    1472           0 :         ::rtl::OUString aRegionTargetURL = pRegion->GetTargetURL();
    1473           0 :         if ( !aRegionTargetURL.isEmpty() )
    1474             :         {
    1475           0 :             sal_uInt16 nLen = 0;
    1476           0 :             sal_uInt16 nStartInd = 0;
    1477             : 
    1478           0 :             if( nIdx == USHRT_MAX )
    1479             :             {
    1480             :                 // this is a folder
    1481             :                 // check whether there is at least one editable template
    1482           0 :                 nLen = ( sal_uInt16 )pRegion->GetCount();
    1483           0 :                 nStartInd = 0;
    1484           0 :                 if ( nLen == 0 )
    1485           0 :                     bResult = sal_True; // the writing part of empty folder with writing URL can be removed
    1486             :             }
    1487             :             else
    1488             :             {
    1489             :                 // this is a template
    1490             :                 // check whether the template is inserted by user
    1491           0 :                 nLen = 1;
    1492           0 :                 nStartInd = nIdx;
    1493             :             }
    1494             : 
    1495           0 :             for ( sal_uInt16 nInd = nStartInd; nInd < nStartInd + nLen; nInd++ )
    1496             :             {
    1497           0 :                 DocTempl_EntryData_Impl* pEntryData = pRegion->GetEntry( nInd );
    1498           0 :                 if ( pEntryData )
    1499             :                 {
    1500           0 :                     ::rtl::OUString aEntryTargetURL = pEntryData->GetTargetURL();
    1501           0 :                     if ( !aEntryTargetURL.isEmpty()
    1502           0 :                       && ::utl::UCBContentHelper::IsSubPath( aRegionTargetURL, aEntryTargetURL ) )
    1503             :                     {
    1504           0 :                         bResult = sal_True;
    1505             :                         break;
    1506           0 :                     }
    1507             :                 }
    1508             :             }
    1509           0 :         }
    1510             :     }
    1511             : 
    1512           0 :     return bResult;
    1513             : }
    1514             : 
    1515             : // -----------------------------------------------------------------------
    1516           0 : DocTempl_EntryData_Impl::DocTempl_EntryData_Impl( RegionData_Impl* pParent,
    1517           0 :                                 const OUString& rTitle )
    1518             : {
    1519           0 :     mpParent    = pParent;
    1520             :     maTitle     = SfxDocumentTemplates::ConvertResourceString(
    1521           0 :                   STR_TEMPLATE_NAME1_DEF, STR_TEMPLATE_NAME1, NUM_TEMPLATE_NAMES, rTitle );
    1522           0 :     mbIsOwner   = sal_False;
    1523           0 :     mbDidConvert= sal_False;
    1524           0 : }
    1525             : 
    1526             : // -----------------------------------------------------------------------
    1527           0 : int DocTempl_EntryData_Impl::Compare( const OUString& rTitle ) const
    1528             : {
    1529           0 :     return maTitle.compareTo( rTitle );
    1530             : }
    1531             : 
    1532             : // -----------------------------------------------------------------------
    1533           0 : SfxObjectShellRef DocTempl_EntryData_Impl::CreateObjectShell()
    1534             : {
    1535           0 :     if( ! mxObjShell.Is() )
    1536             :     {
    1537           0 :         mbIsOwner = sal_False;
    1538           0 :         sal_Bool bDum = sal_False;
    1539           0 :         SfxApplication *pSfxApp = SFX_APP();
    1540           0 :         String          aTargetURL = GetTargetURL();
    1541             : 
    1542           0 :         mxObjShell = pSfxApp->DocAlreadyLoaded( aTargetURL, sal_True, bDum );
    1543             : 
    1544           0 :         if( ! mxObjShell.Is() )
    1545             :         {
    1546           0 :             mbIsOwner = sal_True;
    1547             :             SfxMedium *pMed=new SfxMedium(
    1548           0 :                 aTargetURL,(STREAM_STD_READWRITE | STREAM_SHARE_DENYALL) );
    1549           0 :             const SfxFilter* pFilter = NULL;
    1550           0 :             pMed->UseInteractionHandler(sal_True);
    1551           0 :             if( pSfxApp->GetFilterMatcher().GuessFilter(
    1552           0 :                 *pMed, &pFilter, SFX_FILTER_TEMPLATE, 0 ) ||
    1553           0 :                 (pFilter && !pFilter->IsOwnFormat()) ||
    1554           0 :                 (pFilter && !pFilter->UsesStorage()) )
    1555             :             {
    1556             :                 SfxErrorContext aEc( ERRCTX_SFX_LOADTEMPLATE,
    1557           0 :                                      aTargetURL );
    1558           0 :                 delete pMed;
    1559           0 :                 mbDidConvert=sal_True;
    1560             :                 sal_uIntPtr lErr;
    1561           0 :                 if ( mxObjShell.Is() ) {
    1562           0 :                     lErr = pSfxApp->LoadTemplate( mxObjShell,aTargetURL);
    1563           0 :                     if( lErr != ERRCODE_NONE )
    1564           0 :                         ErrorHandler::HandleError(lErr);
    1565           0 :                 }
    1566             : 
    1567             :             }
    1568           0 :             else if (pFilter)
    1569             :             {
    1570           0 :                 mbDidConvert=sal_False;
    1571           0 :                 mxObjShell = SfxObjectShell::CreateObject( pFilter->GetServiceName(), SFX_CREATE_MODE_ORGANIZER );
    1572           0 :                 if ( mxObjShell.Is() )
    1573             :                 {
    1574           0 :                     mxObjShell->DoInitNew(0);
    1575             :                     // TODO/LATER: make sure that we don't use binary templates!
    1576           0 :                     if( mxObjShell->LoadFrom( *pMed ) )
    1577             :                     {
    1578           0 :                         mxObjShell->DoSaveCompleted( pMed );
    1579             :                     }
    1580             :                     else
    1581           0 :                         mxObjShell.Clear();
    1582             :                 }
    1583             :             }
    1584           0 :         }
    1585             :     }
    1586             : 
    1587           0 :     return (SfxObjectShellRef)(SfxObjectShell*) mxObjShell;
    1588             : }
    1589             : 
    1590             : //------------------------------------------------------------------------
    1591           0 : sal_Bool DocTempl_EntryData_Impl::DeleteObjectShell()
    1592             : {
    1593           0 :     sal_Bool bRet = sal_True;
    1594             : 
    1595           0 :     if ( mxObjShell.Is() )
    1596             :     {
    1597           0 :         if( mxObjShell->IsModified() )
    1598             :         {
    1599             :             // Here we also save, if the Template is being processed ...
    1600           0 :             bRet = sal_False;
    1601             : 
    1602           0 :             if ( mbIsOwner )
    1603             :             {
    1604           0 :                 if( mbDidConvert )
    1605             :                 {
    1606             :                     bRet=mxObjShell->PreDoSaveAs_Impl(
    1607           0 :                         GetTargetURL(),
    1608           0 :                         mxObjShell->GetFactory().GetFilterContainer()->GetAnyFilter( SFX_FILTER_EXPORT | SFX_FILTER_IMPORT, SFX_FILTER_INTERNAL )->GetFilterName(), 0 );
    1609             :                 }
    1610             :                 else
    1611             :                 {
    1612           0 :                     if( mxObjShell->Save() )
    1613             :                     {
    1614           0 :                         uno::Reference< embed::XTransactedObject > xTransacted( mxObjShell->GetStorage(), uno::UNO_QUERY );
    1615             :                         DBG_ASSERT( xTransacted.is(), "Storage must implement XTransactedObject!\n" );
    1616           0 :                         if ( xTransacted.is() )
    1617             :                         {
    1618             :                             try
    1619             :                             {
    1620           0 :                                 xTransacted->commit();
    1621           0 :                                 bRet = sal_True;
    1622             :                             }
    1623           0 :                             catch( uno::Exception& )
    1624             :                             {
    1625             :                             }
    1626           0 :                         }
    1627             :                     }
    1628             :                 }
    1629             :             }
    1630             :         }
    1631             : 
    1632           0 :         if( bRet )
    1633             :         {
    1634           0 :             mxObjShell.Clear();
    1635             :         }
    1636             :     }
    1637           0 :     return bRet;
    1638             : }
    1639             : 
    1640             : // -----------------------------------------------------------------------
    1641           0 : const OUString& DocTempl_EntryData_Impl::GetHierarchyURL()
    1642             : {
    1643           0 :     if ( maOwnURL.isEmpty() )
    1644             :     {
    1645           0 :         INetURLObject aTemplateObj( GetParent()->GetHierarchyURL() );
    1646             : 
    1647           0 :         aTemplateObj.insertName( GetTitle(), false,
    1648             :                      INetURLObject::LAST_SEGMENT, true,
    1649           0 :                      INetURLObject::ENCODE_ALL );
    1650             : 
    1651           0 :         maOwnURL = aTemplateObj.GetMainURL( INetURLObject::NO_DECODE );
    1652           0 :         DBG_ASSERT( !maOwnURL.isEmpty(), "GetHierarchyURL(): Could not create URL!" );
    1653             :     }
    1654             : 
    1655           0 :     return maOwnURL;
    1656             : }
    1657             : 
    1658             : // -----------------------------------------------------------------------
    1659           0 : const OUString& DocTempl_EntryData_Impl::GetTargetURL()
    1660             : {
    1661           0 :     if ( maTargetURL.isEmpty() )
    1662             :     {
    1663           0 :         uno::Reference< XCommandEnvironment > aCmdEnv;
    1664           0 :         Content aRegion;
    1665             : 
    1666           0 :         if ( Content::create( GetHierarchyURL(), aCmdEnv, comphelper::getProcessComponentContext(), aRegion ) )
    1667             :         {
    1668           0 :             OUString aPropName( TARGET_URL  );
    1669             : 
    1670           0 :             getTextProperty_Impl( aRegion, aPropName, maTargetURL );
    1671             :         }
    1672             :         else
    1673             :         {
    1674             :             SAL_WARN( "sfx2.doc", "GetTargetURL(): Could not create hierarchy content!" );
    1675           0 :         }
    1676             :     }
    1677             : 
    1678           0 :     return maTargetURL;
    1679             : }
    1680             : 
    1681             : // -----------------------------------------------------------------------
    1682           0 : RegionData_Impl::RegionData_Impl( const SfxDocTemplate_Impl* pParent,
    1683           0 :                                   const OUString& rTitle )
    1684             : {
    1685           0 :     maTitle     = rTitle;
    1686           0 :     mpParent    = pParent;
    1687           0 : }
    1688             : 
    1689             : // -----------------------------------------------------------------------
    1690           0 : RegionData_Impl::~RegionData_Impl()
    1691             : {
    1692           0 :     for ( size_t i = 0, n = maEntries.size(); i < n; ++i )
    1693           0 :         delete maEntries[ i ];
    1694           0 :     maEntries.clear();
    1695           0 : }
    1696             : 
    1697             : // -----------------------------------------------------------------------
    1698           0 : size_t RegionData_Impl::GetEntryPos( const OUString& rTitle, sal_Bool& rFound ) const
    1699             : {
    1700             : #if 1   // Don't use binary search today
    1701             :     size_t i;
    1702           0 :     size_t nCount = maEntries.size();
    1703             : 
    1704           0 :     for ( i=0; i<nCount; i++ )
    1705             :     {
    1706           0 :         DocTempl_EntryData_Impl *pData = maEntries[ i ];
    1707             : 
    1708           0 :         if ( pData->Compare( rTitle ) == 0 )
    1709             :         {
    1710           0 :             rFound = sal_True;
    1711           0 :             return i;
    1712             :         }
    1713             :     }
    1714             : 
    1715           0 :     rFound = sal_False;
    1716           0 :     return i;
    1717             : 
    1718             : #else
    1719             :     // use binary search to find the correct position
    1720             :     // in the maEntries list
    1721             : 
    1722             :     int     nCompVal = 1;
    1723             :     size_t  nStart = 0;
    1724             :     size_t  nEnd = maEntries.size() - 1;
    1725             :     size_t  nMid;
    1726             : 
    1727             :     DocTempl_EntryData_Impl* pMid;
    1728             : 
    1729             :     rFound = sal_False;
    1730             : 
    1731             :     while ( nCompVal && ( nStart <= nEnd ) )
    1732             :     {
    1733             :         nMid = ( nEnd - nStart ) / 2 + nStart;
    1734             :         pMid = maEntries[ nMid ];
    1735             : 
    1736             :         nCompVal = pMid->Compare( rTitle );
    1737             : 
    1738             :         if ( nCompVal < 0 )     // pMid < pData
    1739             :             nStart = nMid + 1;
    1740             :         else
    1741             :             nEnd = nMid - 1;
    1742             :     }
    1743             : 
    1744             :     if ( nCompVal == 0 )
    1745             :     {
    1746             :         rFound = sal_True;
    1747             :     }
    1748             :     else
    1749             :     {
    1750             :         if ( nCompVal < 0 )     // pMid < pData
    1751             :             nMid++;
    1752             :     }
    1753             : 
    1754             :     return nMid;
    1755             : #endif
    1756             : }
    1757             : 
    1758             : // -----------------------------------------------------------------------
    1759           0 : void RegionData_Impl::AddEntry( const OUString& rTitle,
    1760             :                                 const OUString& rTargetURL,
    1761             :                                 size_t *pPos )
    1762             : {
    1763           0 :     INetURLObject aLinkObj( GetHierarchyURL() );
    1764             :     aLinkObj.insertName( rTitle, false,
    1765             :                       INetURLObject::LAST_SEGMENT, true,
    1766           0 :                       INetURLObject::ENCODE_ALL );
    1767           0 :     OUString aLinkURL = aLinkObj.GetMainURL( INetURLObject::NO_DECODE );
    1768             : 
    1769             :     DocTempl_EntryData_Impl* pEntry;
    1770           0 :     sal_Bool        bFound = sal_False;
    1771           0 :     size_t          nPos = GetEntryPos( rTitle, bFound );
    1772             : 
    1773           0 :     if ( bFound )
    1774             :     {
    1775           0 :         pEntry = maEntries[ nPos ];
    1776             :     }
    1777             :     else
    1778             :     {
    1779           0 :         if ( pPos )
    1780           0 :             nPos = *pPos;
    1781             : 
    1782           0 :         pEntry = new DocTempl_EntryData_Impl( this, rTitle );
    1783           0 :         pEntry->SetTargetURL( rTargetURL );
    1784           0 :         pEntry->SetHierarchyURL( aLinkURL );
    1785           0 :         if ( nPos < maEntries.size() ) {
    1786           0 :             vector< DocTempl_EntryData_Impl* >::iterator it = maEntries.begin();
    1787           0 :             advance( it, nPos );
    1788           0 :             maEntries.insert( it, pEntry );
    1789             :         }
    1790             :         else
    1791           0 :             maEntries.push_back( pEntry );
    1792           0 :     }
    1793           0 : }
    1794             : 
    1795             : // -----------------------------------------------------------------------
    1796           0 : size_t RegionData_Impl::GetCount() const
    1797             : {
    1798           0 :     return maEntries.size();
    1799             : }
    1800             : 
    1801             : // -----------------------------------------------------------------------
    1802           0 : const OUString& RegionData_Impl::GetHierarchyURL()
    1803             : {
    1804           0 :     if ( maOwnURL.isEmpty() )
    1805             :     {
    1806           0 :         INetURLObject aRegionObj( GetParent()->GetRootURL() );
    1807             : 
    1808           0 :         aRegionObj.insertName( GetTitle(), false,
    1809             :                      INetURLObject::LAST_SEGMENT, true,
    1810           0 :                      INetURLObject::ENCODE_ALL );
    1811             : 
    1812           0 :         maOwnURL = aRegionObj.GetMainURL( INetURLObject::NO_DECODE );
    1813           0 :         DBG_ASSERT( !maOwnURL.isEmpty(), "GetHierarchyURL(): Could not create URL!" );
    1814             :     }
    1815             : 
    1816           0 :     return maOwnURL;
    1817             : }
    1818             : 
    1819             : // -----------------------------------------------------------------------
    1820           0 : const OUString& RegionData_Impl::GetTargetURL()
    1821             : {
    1822           0 :     if ( maTargetURL.isEmpty() )
    1823             :     {
    1824           0 :         uno::Reference< XCommandEnvironment > aCmdEnv;
    1825           0 :         Content aRegion;
    1826             : 
    1827           0 :         if ( Content::create( GetHierarchyURL(), aCmdEnv, comphelper::getProcessComponentContext(), aRegion ) )
    1828             :         {
    1829           0 :             OUString aPropName( TARGET_DIR_URL  );
    1830             : 
    1831           0 :             getTextProperty_Impl( aRegion, aPropName, maTargetURL );
    1832             :             // The targeturl must be substituted: $(baseinsturl) (#i32656#)
    1833           0 :             maTargetURL = SvtPathOptions().SubstituteVariable( maTargetURL );
    1834             :         }
    1835             :         else
    1836             :         {
    1837             :             SAL_WARN( "sfx2.doc", "GetTargetURL(): Could not create hierarchy content!" );
    1838           0 :         }
    1839             :     }
    1840             : 
    1841           0 :     return maTargetURL;
    1842             : }
    1843             : 
    1844             : // -----------------------------------------------------------------------
    1845           0 : DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( const OUString& rName ) const
    1846             : {
    1847           0 :     sal_Bool    bFound = sal_False;
    1848           0 :     long        nPos = GetEntryPos( rName, bFound );
    1849             : 
    1850           0 :     if ( bFound )
    1851           0 :         return maEntries[ nPos ];
    1852             :     else
    1853           0 :         return NULL;
    1854             : }
    1855             : 
    1856             : // -----------------------------------------------------------------------
    1857           0 : DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( size_t nIndex ) const
    1858             : {
    1859           0 :     if ( nIndex < maEntries.size() )
    1860           0 :         return maEntries[ nIndex ];
    1861           0 :     return NULL;
    1862             : }
    1863             : 
    1864             : // -----------------------------------------------------------------------
    1865           0 : void RegionData_Impl::DeleteEntry( size_t nIndex )
    1866             : {
    1867           0 :     if ( nIndex < maEntries.size() )
    1868             :     {
    1869           0 :         delete maEntries[ nIndex ];
    1870           0 :         vector< DocTempl_EntryData_Impl*>::iterator it = maEntries.begin();
    1871           0 :         advance( it, nIndex );
    1872           0 :         maEntries.erase( it );
    1873             :     }
    1874           0 : }
    1875             : 
    1876             : // -----------------------------------------------------------------------
    1877           0 : int RegionData_Impl::Compare( RegionData_Impl* pCompare ) const
    1878             : {
    1879           0 :     int nCompare = maTitle.compareTo( pCompare->maTitle );
    1880             : 
    1881           0 :     return nCompare;
    1882             : }
    1883             : 
    1884             : // -----------------------------------------------------------------------
    1885             : 
    1886           4 : SfxDocTemplate_Impl::SfxDocTemplate_Impl()
    1887             : : mbConstructed( sal_False )
    1888           4 : , mnLockCounter( 0 )
    1889             : {
    1890           4 : }
    1891             : 
    1892             : // -----------------------------------------------------------------------
    1893           9 : SfxDocTemplate_Impl::~SfxDocTemplate_Impl()
    1894             : {
    1895           3 :     Clear();
    1896             : 
    1897           3 :     gpTemplateData = NULL;
    1898           6 : }
    1899             : 
    1900             : // -----------------------------------------------------------------------
    1901           4 : void SfxDocTemplate_Impl::IncrementLock()
    1902             : {
    1903           4 :     ::osl::MutexGuard aGuard( maMutex );
    1904           4 :     mnLockCounter++;
    1905           4 : }
    1906             : 
    1907             : // -----------------------------------------------------------------------
    1908           4 : void SfxDocTemplate_Impl::DecrementLock()
    1909             : {
    1910           4 :     ::osl::MutexGuard aGuard( maMutex );
    1911           4 :     if ( mnLockCounter )
    1912           4 :         mnLockCounter--;
    1913           4 : }
    1914             : 
    1915             : // -----------------------------------------------------------------------
    1916           0 : RegionData_Impl* SfxDocTemplate_Impl::GetRegion( size_t nIndex ) const
    1917             : {
    1918           0 :     if ( nIndex < maRegions.size() )
    1919           0 :         return maRegions[ nIndex ];
    1920           0 :     return NULL;
    1921             : }
    1922             : 
    1923             : // -----------------------------------------------------------------------
    1924           0 : RegionData_Impl* SfxDocTemplate_Impl::GetRegion( const OUString& rName )
    1925             :     const
    1926             : {
    1927           0 :     for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
    1928             :     {
    1929           0 :         RegionData_Impl* pData = maRegions[ i ];
    1930           0 :         if( pData->GetTitle() == rName )
    1931           0 :             return pData;
    1932             :     }
    1933           0 :     return NULL;
    1934             : }
    1935             : 
    1936             : // -----------------------------------------------------------------------
    1937           0 : void SfxDocTemplate_Impl::DeleteRegion( size_t nIndex )
    1938             : {
    1939           0 :     if ( nIndex < maRegions.size() )
    1940             :     {
    1941           0 :         delete maRegions[ nIndex ];
    1942           0 :         RegionList_Impl::iterator it = maRegions.begin();
    1943           0 :         advance( it, nIndex );
    1944           0 :         maRegions.erase( it );
    1945             :     }
    1946           0 : }
    1947             : 
    1948             : // -----------------------------------------------------------------------
    1949             : /*  AddRegion adds a Region to the RegionList
    1950             : */
    1951           0 : void SfxDocTemplate_Impl::AddRegion( const OUString& rTitle,
    1952             :                                      Content& rContent )
    1953             : {
    1954             :     RegionData_Impl* pRegion;
    1955           0 :     pRegion = new RegionData_Impl( this, rTitle );
    1956             : 
    1957           0 :     if ( ! InsertRegion( pRegion ) )
    1958             :     {
    1959           0 :         delete pRegion;
    1960           0 :         return;
    1961             :     }
    1962             : 
    1963             :     // now get the content of the region
    1964           0 :     uno::Reference< XResultSet > xResultSet;
    1965           0 :     Sequence< OUString > aProps(2);
    1966           0 :     aProps[0] = OUString(TITLE );
    1967           0 :     aProps[1] = OUString(TARGET_URL );
    1968             : 
    1969             :     try
    1970             :     {
    1971           0 :         ResultSetInclude eInclude = INCLUDE_DOCUMENTS_ONLY;
    1972           0 :         Sequence< NumberedSortingInfo >     aSortingInfo(1);
    1973           0 :         aSortingInfo.getArray()->ColumnIndex = 1;
    1974           0 :         aSortingInfo.getArray()->Ascending = sal_True;
    1975           0 :         xResultSet = rContent.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
    1976             :     }
    1977           0 :     catch ( Exception& ) {}
    1978             : 
    1979           0 :     if ( xResultSet.is() )
    1980             :     {
    1981           0 :         uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
    1982           0 :         uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
    1983             : 
    1984             :         try
    1985             :         {
    1986           0 :             while ( xResultSet->next() )
    1987             :             {
    1988           0 :                 OUString aTitle( xRow->getString( 1 ) );
    1989           0 :                 OUString aTargetDir( xRow->getString( 2 ) );
    1990             : 
    1991           0 :                 pRegion->AddEntry( aTitle, aTargetDir );
    1992           0 :             }
    1993             :         }
    1994           0 :         catch ( Exception& ) {}
    1995           0 :     }
    1996             : }
    1997             : 
    1998             : // -----------------------------------------------------------------------
    1999           0 : void SfxDocTemplate_Impl::CreateFromHierarchy( Content &rTemplRoot )
    2000             : {
    2001           0 :     uno::Reference< XResultSet > xResultSet;
    2002           0 :     Sequence< OUString > aProps(1);
    2003           0 :     aProps[0] = OUString(TITLE );
    2004             : 
    2005             :     try
    2006             :     {
    2007           0 :         ResultSetInclude eInclude = INCLUDE_FOLDERS_ONLY;
    2008           0 :         Sequence< NumberedSortingInfo >     aSortingInfo(1);
    2009           0 :         aSortingInfo.getArray()->ColumnIndex = 1;
    2010           0 :         aSortingInfo.getArray()->Ascending = sal_True;
    2011           0 :         xResultSet = rTemplRoot.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
    2012             :     }
    2013           0 :     catch ( Exception& ) {}
    2014             : 
    2015           0 :     if ( xResultSet.is() )
    2016             :     {
    2017           0 :         uno::Reference< XCommandEnvironment > aCmdEnv;
    2018           0 :         uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
    2019           0 :         uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
    2020             : 
    2021             :         try
    2022             :         {
    2023           0 :             while ( xResultSet->next() )
    2024             :             {
    2025           0 :                 OUString aTitle( xRow->getString( 1 ) );
    2026             : 
    2027           0 :                 OUString aId = xContentAccess->queryContentIdentifierString();
    2028           0 :                 Content  aContent = Content( aId, aCmdEnv, comphelper::getProcessComponentContext() );
    2029             : 
    2030           0 :                 AddRegion( aTitle, aContent );
    2031           0 :             }
    2032             :         }
    2033           0 :         catch ( Exception& ) {}
    2034           0 :     }
    2035           0 : }
    2036             : 
    2037             : // ------------------------------------------------------------------------
    2038           4 : sal_Bool SfxDocTemplate_Impl::Construct( )
    2039             : {
    2040           4 :     ::osl::MutexGuard aGuard( maMutex );
    2041             : 
    2042           4 :     if ( mbConstructed )
    2043           0 :         return sal_True;
    2044             : 
    2045           4 :     uno::Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
    2046           4 :     uno::Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
    2047             : 
    2048           4 :     OUString aService( SERVICENAME_DOCINFO  );
    2049           4 :     uno::Reference< XPersist > xInfo( xFactory->createInstance( aService ), UNO_QUERY );
    2050           4 :     mxInfo = xInfo;
    2051             : 
    2052           4 :     mxTemplates = frame::DocumentTemplates::create(xContext);
    2053             : 
    2054           4 :     uno::Reference< XLocalizable > xLocalizable( mxTemplates, UNO_QUERY );
    2055             : 
    2056           4 :     Sequence< Any > aCompareArg(1);
    2057           4 :     *(aCompareArg.getArray()) <<= xLocalizable->getLocale();
    2058             :     m_rCompareFactory = uno::Reference< XAnyCompareFactory >(
    2059           4 :                     xFactory->createInstanceWithArguments( OUString("com.sun.star.ucb.AnyCompareFactory"),
    2060           4 :                                                            aCompareArg ),
    2061           4 :                     UNO_QUERY );
    2062             : 
    2063           4 :     uno::Reference < XContent > aRootContent = mxTemplates->getContent();
    2064           4 :     uno::Reference < XCommandEnvironment > aCmdEnv;
    2065             : 
    2066           4 :     if ( ! aRootContent.is() )
    2067           4 :         return sal_False;
    2068             : 
    2069           0 :     mbConstructed = sal_True;
    2070           0 :     maRootURL = aRootContent->getIdentifier()->getContentIdentifier();
    2071             : 
    2072           0 :     ResStringArray  aLongNames( SfxResId( TEMPLATE_LONG_NAMES_ARY ) );
    2073             : 
    2074           0 :     if ( aLongNames.Count() )
    2075           0 :         maStandardGroup = aLongNames.GetString( 0 );
    2076             : 
    2077           0 :     Content aTemplRoot( aRootContent, aCmdEnv, comphelper::getProcessComponentContext() );
    2078           0 :     CreateFromHierarchy( aTemplRoot );
    2079             : 
    2080           0 :     return sal_True;
    2081             : }
    2082             : 
    2083             : // -----------------------------------------------------------------------
    2084           0 : void SfxDocTemplate_Impl::ReInitFromComponent()
    2085             : {
    2086           0 :     uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
    2087           0 :     if ( xTemplates.is() )
    2088             :     {
    2089           0 :         uno::Reference < XContent > aRootContent = xTemplates->getContent();
    2090           0 :         uno::Reference < XCommandEnvironment > aCmdEnv;
    2091           0 :         Content aTemplRoot( aRootContent, aCmdEnv, comphelper::getProcessComponentContext() );
    2092           0 :         Clear();
    2093           0 :         CreateFromHierarchy( aTemplRoot );
    2094           0 :     }
    2095           0 : }
    2096             : 
    2097             : // -----------------------------------------------------------------------
    2098           0 : sal_Bool SfxDocTemplate_Impl::InsertRegion( RegionData_Impl *pNew, size_t nPos )
    2099             : {
    2100           0 :     ::osl::MutexGuard   aGuard( maMutex );
    2101             : 
    2102             :     // return false (not inserted) if the entry already exists
    2103           0 :     for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
    2104           0 :         if ( maRegions[ i ]->Compare( pNew ) == 0 )
    2105           0 :             return sal_False;
    2106             : 
    2107           0 :     size_t newPos = nPos;
    2108           0 :     if ( pNew->GetTitle() == maStandardGroup )
    2109           0 :         newPos = 0;
    2110             : 
    2111           0 :     if ( newPos < maRegions.size() )
    2112             :     {
    2113           0 :         RegionList_Impl::iterator it = maRegions.begin();
    2114           0 :         advance( it, newPos );
    2115           0 :         maRegions.insert( it, pNew );
    2116             :     }
    2117             :     else
    2118           0 :         maRegions.push_back( pNew );
    2119             : 
    2120           0 :     return sal_True;
    2121             : }
    2122             : 
    2123             : // -----------------------------------------------------------------------
    2124           0 : void SfxDocTemplate_Impl::Rescan()
    2125             : {
    2126           0 :     Clear();
    2127             : 
    2128             :     try
    2129             :     {
    2130           0 :         uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
    2131             :         DBG_ASSERT( xTemplates.is(), "SfxDocTemplate_Impl::Rescan:invalid template instance!" );
    2132           0 :         if ( xTemplates.is() )
    2133             :         {
    2134           0 :             xTemplates->update();
    2135             : 
    2136           0 :             uno::Reference < XContent > aRootContent = xTemplates->getContent();
    2137           0 :             uno::Reference < XCommandEnvironment > aCmdEnv;
    2138             : 
    2139           0 :             Content aTemplRoot( aRootContent, aCmdEnv, comphelper::getProcessComponentContext() );
    2140           0 :             CreateFromHierarchy( aTemplRoot );
    2141           0 :         }
    2142             :     }
    2143           0 :     catch( const Exception& )
    2144             :     {
    2145             :         SAL_WARN( "sfx2.doc", "SfxDocTemplate_Impl::Rescan: caught an exception while doing the update!" );
    2146             :     }
    2147           0 : }
    2148             : 
    2149             : // -----------------------------------------------------------------------
    2150           0 : sal_Bool SfxDocTemplate_Impl::GetTitleFromURL( const OUString& rURL,
    2151             :                                            OUString& aTitle )
    2152             : {
    2153           0 :     if ( mxInfo.is() )
    2154             :     {
    2155             :         try
    2156             :         {
    2157           0 :             mxInfo->read( rURL );
    2158             :         }
    2159           0 :         catch ( Exception& )
    2160             :         {
    2161             :             // the document is not a StarOffice document
    2162           0 :             return sal_False;
    2163             :         }
    2164             : 
    2165             : 
    2166             :         try
    2167             :         {
    2168           0 :             uno::Reference< XPropertySet > aPropSet( mxInfo, UNO_QUERY );
    2169           0 :             if ( aPropSet.is() )
    2170             :             {
    2171           0 :                 OUString aPropName( TITLE  );
    2172           0 :                 Any aValue = aPropSet->getPropertyValue( aPropName );
    2173           0 :                 aValue >>= aTitle;
    2174           0 :             }
    2175             :         }
    2176           0 :         catch ( IOException& ) {}
    2177           0 :         catch ( UnknownPropertyException& ) {}
    2178           0 :         catch ( Exception& ) {}
    2179             :     }
    2180             : 
    2181           0 :     if ( aTitle.isEmpty() )
    2182             :     {
    2183           0 :         INetURLObject aURL( rURL );
    2184           0 :         aURL.CutExtension();
    2185             :         aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
    2186           0 :                                INetURLObject::DECODE_WITH_CHARSET );
    2187             :     }
    2188             : 
    2189           0 :     return sal_True;
    2190             : }
    2191             : 
    2192             : 
    2193             : // -----------------------------------------------------------------------
    2194           3 : void SfxDocTemplate_Impl::Clear()
    2195             : {
    2196           3 :     ::osl::MutexGuard   aGuard( maMutex );
    2197           3 :     if ( mnLockCounter )
    2198           3 :         return;
    2199             : 
    2200           3 :     for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
    2201           0 :         delete maRegions[ i ];
    2202           3 :     maRegions.clear();
    2203             : }
    2204             : 
    2205             : // -----------------------------------------------------------------------
    2206           0 : sal_Bool getTextProperty_Impl( Content& rContent,
    2207             :                                const OUString& rPropName,
    2208             :                                OUString& rPropValue )
    2209             : {
    2210           0 :     sal_Bool bGotProperty = sal_False;
    2211             : 
    2212             :     // Get the property
    2213             :     try
    2214             :     {
    2215           0 :         uno::Reference< XPropertySetInfo > aPropInfo = rContent.getProperties();
    2216             : 
    2217             :         // check, whether or not the property exists
    2218           0 :         if ( !aPropInfo.is() || !aPropInfo->hasPropertyByName( rPropName ) )
    2219             :         {
    2220           0 :             return sal_False;
    2221             :         }
    2222             : 
    2223             :         // now get the property
    2224           0 :         Any aAnyValue;
    2225             : 
    2226           0 :         aAnyValue = rContent.getPropertyValue( rPropName );
    2227           0 :         aAnyValue >>= rPropValue;
    2228             : 
    2229           0 :         if ( SfxURLRelocator_Impl::propertyCanContainOfficeDir( rPropName ) )
    2230             :         {
    2231           0 :             SfxURLRelocator_Impl aRelocImpl( ::comphelper::getProcessServiceFactory() );
    2232           0 :             aRelocImpl.makeAbsoluteURL( rPropValue );
    2233             :         }
    2234             : 
    2235           0 :         bGotProperty = sal_True;
    2236             :     }
    2237           0 :     catch ( RuntimeException& ) {}
    2238           0 :     catch ( Exception& ) {}
    2239             : 
    2240           0 :     return bGotProperty;
    2241             : }
    2242             : 
    2243             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10