blob: 080c87275162cf88246948080c21ebc9f7952e01 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sfx2.hxx"
#include <limits.h>
#include <com/sun/star/uno/Any.h>
#include <vos/mutex.hxx>
#include <vos/thread.hxx>
#ifndef _SV_RESARY_HXX
#include <tools/resary.hxx>
#endif
#include <vcl/svapp.hxx>
#include <vcl/settings.hxx>
#include <unotools/localedatawrapper.hxx>
#include <unotools/pathoptions.hxx>
#include <tools/string.hxx>
#include <tools/urlobj.hxx>
#include <svtools/ehdl.hxx>
#include <svtools/sfxecode.hxx>
#include <comphelper/processfactory.hxx>
#include <ucbhelper/content.hxx>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/beans/XPropertyContainer.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#include <com/sun/star/document/XTypeDetection.hpp>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>
#include <com/sun/star/frame/XDocumentTemplates.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <com/sun/star/io/XPersist.hpp>
#include <com/sun/star/lang/XLocalizable.hpp>
#include <com/sun/star/sdbc/XResultSet.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <com/sun/star/ucb/ContentInfo.hpp>
#include <com/sun/star/ucb/InsertCommandArgument.hpp>
#include <com/sun/star/ucb/NameClash.hpp>
#include <com/sun/star/ucb/TransferInfo.hpp>
#include <com/sun/star/ucb/XCommandProcessor.hpp>
#include <com/sun/star/ucb/XContent.hpp>
#include <com/sun/star/ucb/XContentAccess.hpp>
#include <com/sun/star/ucb/XAnyCompareFactory.hpp>
#include <com/sun/star/ucb/XAnyCompare.hpp>
#include <com/sun/star/ucb/NumberedSortingInfo.hpp>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/embed/XTransactedObject.hpp>
#include "sfxurlrelocator.hxx"
using namespace ::com::sun::star;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::io;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::document;
using namespace ::rtl;
using namespace ::ucbhelper;
#include <sfx2/doctempl.hxx>
#include <sfx2/docfac.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/objsh.hxx>
#include "sfxtypes.hxx"
#include <sfx2/app.hxx>
#include "sfx2/sfxresid.hxx"
#include "doc.hrc"
#include <sfx2/fcontnr.hxx>
#include <svtools/templatefoldercache.hxx>
#include <comphelper/storagehelper.hxx>
#include <unotools/ucbhelper.hxx>
//========================================================================
// #define DONT_USE_HIERARCHY
#define TITLE "Title"
#define IS_FOLDER "IsFolder"
#define PROPERTY_TYPE "TypeDescription"
#define TARGET_URL "TargetURL"
#define TYPE_FOLDER "application/vnd.sun.star.hier-folder"
#define TYPE_LINK "application/vnd.sun.star.hier-link"
#define TYPE_FSYS_FOLDER "application/vnd.sun.staroffice.fsys-folder"
#define TARGET_DIR_URL "TargetDirURL"
#define COMMAND_DELETE "delete"
#define COMMAND_TRANSFER "transfer"
#define STANDARD_FOLDER "standard"
#define SERVICENAME_TYPEDETECTION "com.sun.star.document.TypeDetection"
#define TYPEDETECTION_PARAMETER "FileName"
//#define SERVICENAME_OLD_TYPEDETECTION "com.sun.star.frame.FrameLoaderFactory"
//#define PARAMETER_OLD_TYPEDETECTION "DeepDetection"
#define SERVICENAME_DOCINFO "com.sun.star.document.DocumentProperties"
#define SERVICENAME_DOCTEMPLATES "com.sun.star.frame.DocumentTemplates"
#define SERVICENAME_DESKTOP "com.sun.star.frame.Desktop"
//========================================================================
class RegionData_Impl;
namespace DocTempl {
class DocTempl_EntryData_Impl
{
RegionData_Impl* mpParent;
// the following member must be SfxObjectShellLock since it controlls that SfxObjectShell lifetime by design
// and users of this class expect it to be so.
SfxObjectShellLock mxObjShell;
OUString maTitle;
OUString maOwnURL;
OUString maTargetURL;
sal_Bool mbIsOwner : 1;
sal_Bool mbDidConvert: 1;
private:
RegionData_Impl* GetParent() const { return mpParent; }
public:
DocTempl_EntryData_Impl( RegionData_Impl* pParent,
const OUString& rTitle );
const OUString& GetTitle() const { return maTitle; }
const OUString& GetTargetURL();
const OUString& GetHierarchyURL();
void SetTitle( const OUString& rTitle ) { maTitle = rTitle; }
void SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; }
void SetHierarchyURL( const OUString& rURL) { maOwnURL = rURL; }
int Compare( const OUString& rTitle ) const;
SfxObjectShellRef CreateObjectShell();
sal_Bool DeleteObjectShell();
};
}
using namespace ::DocTempl;
// ------------------------------------------------------------------------
class RegionData_Impl
{
DECLARE_LIST( EntryList_Impl, DocTempl_EntryData_Impl* )
const SfxDocTemplate_Impl* mpParent;
EntryList_Impl maEntries;
OUString maTitle;
OUString maOwnURL;
OUString maTargetURL;
private:
long GetEntryPos( const OUString& rTitle,
sal_Bool& rFound ) const;
const SfxDocTemplate_Impl* GetParent() const { return mpParent; }
public:
RegionData_Impl( const SfxDocTemplate_Impl* pParent,
const OUString& rTitle );
~RegionData_Impl();
void SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; }
void SetHierarchyURL( const OUString& rURL) { maOwnURL = rURL; }
DocTempl_EntryData_Impl* GetEntry( sal_uIntPtr nIndex ) const;
DocTempl_EntryData_Impl* GetEntry( const OUString& rName ) const;
DocTempl_EntryData_Impl* GetByTargetURL( const OUString& rName ) const;
const OUString& GetTitle() const { return maTitle; }
const OUString& GetTargetURL();
const OUString& GetHierarchyURL();
sal_uIntPtr GetCount() const;
void SetTitle( const OUString& rTitle ) { maTitle = rTitle; }
void AddEntry( const OUString& rTitle,
const OUString& rTargetURL,
sal_uInt16 *pPos = NULL );
void DeleteEntry( sal_uIntPtr nIndex );
int Compare( const OUString& rTitle ) const
{ return maTitle.compareTo( rTitle ); }
int Compare( RegionData_Impl* pCompareWith ) const;
};
DECLARE_LIST( RegionList_Impl, RegionData_Impl* )
// ------------------------------------------------------------------------
class SfxDocTemplate_Impl : public SvRefBase
{
uno::Reference< XPersist > mxInfo;
uno::Reference< XDocumentTemplates > mxTemplates;
::osl::Mutex maMutex;
OUString maRootURL;
OUString maStandardGroup;
RegionList_Impl maRegions;
sal_Bool mbConstructed;
uno::Reference< XAnyCompareFactory > m_rCompareFactory;
// the following member is intended to prevent clearing of the global data when it is in use
// TODO/LATER: it still does not make the implementation complete thread-safe
sal_Int32 mnLockCounter;
private:
void Clear();
public:
SfxDocTemplate_Impl();
~SfxDocTemplate_Impl();
void IncrementLock();
void DecrementLock();
sal_Bool Construct( );
void CreateFromHierarchy( Content &rTemplRoot );
void ReInitFromComponent();
void AddRegion( const OUString& rTitle,
Content& rContent );
void Rescan();
void DeleteRegion( sal_uIntPtr nIndex );
sal_uIntPtr GetRegionCount() const
{ return maRegions.Count(); }
RegionData_Impl* GetRegion( const OUString& rName ) const;
RegionData_Impl* GetRegion( sal_uIntPtr nIndex ) const;
void GetTemplates( Content& rTargetFolder,
Content& rParentFolder,
RegionData_Impl* pRegion );
long GetRegionPos( const OUString& rTitle,
sal_Bool& rFound ) const;
sal_Bool GetTitleFromURL( const OUString& rURL, OUString& aTitle );
sal_Bool InsertRegion( RegionData_Impl *pData, sal_uIntPtr nPos = LIST_APPEND );
OUString GetRootURL() const { return maRootURL; }
uno::Reference< XDocumentTemplates > getDocTemplates() { return mxTemplates; }
};
// ------------------------------------------------------------------------
class DocTemplLocker_Impl
{
SfxDocTemplate_Impl& m_aDocTempl;
public:
DocTemplLocker_Impl( SfxDocTemplate_Impl& aDocTempl )
: m_aDocTempl( aDocTempl )
{
m_aDocTempl.IncrementLock();
}
~DocTemplLocker_Impl()
{
m_aDocTempl.DecrementLock();
}
};
// ------------------------------------------------------------------------
#ifndef SFX_DECL_DOCTEMPLATES_DEFINED
#define SFX_DECL_DOCTEMPLATES_DEFINED
SV_DECL_REF(SfxDocTemplate_Impl)
#endif
SV_IMPL_REF(SfxDocTemplate_Impl)
// ------------------------------------------------------------------------
SfxDocTemplate_Impl *gpTemplateData = 0;
// -----------------------------------------------------------------------
static sal_Bool getTextProperty_Impl( Content& rContent,
const OUString& rPropName,
OUString& rPropValue );
//========================================================================
//========================================================================
//========================================================================
String SfxDocumentTemplates::GetFullRegionName
(
sal_uInt16 nIdx // Index des Bereiches
) const
/* [Beschreibung]
Liefert den logischen Namen eines Bereiches Plus seinem Pfad
[R"uckgabewert] Referenz auf diesen Namen
*/
{
// First: find the RegionData for the index
String aName;
DocTemplLocker_Impl aLocker( *pImp );
if ( pImp->Construct() )
{
RegionData_Impl *pData1 = pImp->GetRegion( nIdx );
if ( pData1 )
aName = pData1->GetTitle();
// --**-- here was some code which appended the path to the
// group if there was more than one with the same name.
// this should not happen anymore
}
return aName;
}
//------------------------------------------------------------------------
const String& SfxDocumentTemplates::GetRegionName
(
sal_uInt16 nIdx // Index des Bereiches
) const
/* [Beschreibung]
Liefert den logischen Namen eines Bereiches
[R"uckgabewert]
const String& Referenz auf diesen Namen
*/
{
static String maTmpString;
DocTemplLocker_Impl aLocker( *pImp );
if ( pImp->Construct() )
{
RegionData_Impl *pData = pImp->GetRegion( nIdx );
if ( pData )
maTmpString = pData->GetTitle();
else
maTmpString.Erase();
}
else
maTmpString.Erase();
return maTmpString;
}
//------------------------------------------------------------------------
sal_uInt16 SfxDocumentTemplates::GetRegionNo
(
const String &rRegion // Name der Region
) const
/* [Beschreibung]
Liefert den Index f"ur einen logischen Namen eines Bereiches.
[R"uckgabewert]
sal_uInt16 Index von 'rRegion' oder USHRT_MAX falls unbekannt
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return USHRT_MAX;
sal_Bool bFound;
sal_uIntPtr nIndex = pImp->GetRegionPos( rRegion, bFound );
if ( bFound )
return (sal_uInt16) nIndex;
else
return USHRT_MAX;
}
//------------------------------------------------------------------------
sal_uInt16 SfxDocumentTemplates::GetRegionCount() const
/* [Beschreibung]
Liefert die Anzahl der Bereiche
[R"uckgabewert]
sal_uInt16 Anzahl der Bereiche
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return 0;
sal_uIntPtr nCount = pImp->GetRegionCount();
return (sal_uInt16) nCount;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::IsRegionLoaded( sal_uInt16 nIdx ) const
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return sal_False;
RegionData_Impl *pData = pImp->GetRegion( nIdx );
if ( pData )
return sal_True;
else
return sal_False;
}
//------------------------------------------------------------------------
sal_uInt16 SfxDocumentTemplates::GetCount
(
const String& rName /* Name des Bereiches, dessen Eintrags-
anzahl ermittelt werden soll */
) const
/* [Beschreibung]
Liefert die Anzahl der Eintr"age eines Bereiches
[R"uckgabewert]
USHORT Anzahl der Eintr"age
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return 0;
RegionData_Impl *pData = pImp->GetRegion( rName );
sal_uIntPtr nCount = 0;
if ( pData )
nCount = pData->GetCount();
return (sal_uInt16) nCount;
}
//------------------------------------------------------------------------
sal_uInt16 SfxDocumentTemplates::GetCount
(
sal_uInt16 nRegion /* Index des Bereiches, dessen Eintrags-
anzahl ermittelt werden soll */
) const
/* [Beschreibung]
Liefert die Anzahl der Eintr"age eines Bereiches
[R"uckgabewert] Anzahl der Eintr"age
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return 0;
RegionData_Impl *pData = pImp->GetRegion( nRegion );
sal_uIntPtr nCount = 0;
if ( pData )
nCount = pData->GetCount();
return (sal_uInt16) nCount;
}
//------------------------------------------------------------------------
const String& SfxDocumentTemplates::GetName
(
sal_uInt16 nRegion, // Index des Bereiches, in dem der Eintrag liegt
sal_uInt16 nIdx // Index des Eintrags
) const
/* [Beschreibung]
Liefert den logischen Namen eines Eintrags eines Bereiches
[R"uckgabewert]
const String& Name des Eintrags
*/
{
DocTemplLocker_Impl aLocker( *pImp );
static String maTmpString;
if ( pImp->Construct() )
{
DocTempl_EntryData_Impl *pEntry = NULL;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
if ( pRegion )
pEntry = pRegion->GetEntry( nIdx );
if ( pEntry )
maTmpString = pEntry->GetTitle();
else
maTmpString.Erase();
}
else
maTmpString.Erase();
return maTmpString;
}
//------------------------------------------------------------------------
String SfxDocumentTemplates::GetFileName
(
sal_uInt16 nRegion, // Index des Bereiches, in dem der Eintrag liegt
sal_uInt16 nIdx // Index des Eintrags
) const
/* [Beschreibung]
Liefert den Dateinamen eines Eintrags eines Bereiches
[R"uckgabewert] Dateiname des Eintrags
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return String();
DocTempl_EntryData_Impl *pEntry = NULL;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
if ( pRegion )
pEntry = pRegion->GetEntry( nIdx );
if ( pEntry )
{
INetURLObject aURLObj( pEntry->GetTargetURL() );
return aURLObj.getName( INetURLObject::LAST_SEGMENT, true,
INetURLObject::DECODE_WITH_CHARSET );
}
else
return String();
}
//------------------------------------------------------------------------
String SfxDocumentTemplates::GetPath
(
sal_uInt16 nRegion, // Index des Bereiches, in dem der Eintrag liegt
sal_uInt16 nIdx // Index des Eintrags
) const
/* [Beschreibung]
Liefert den Dateinamen mit vollst"andigem Pfad zu der einem
Eintrag zugeordneten Datei
[R"uckgabewert]
String Dateiname mit vollst"andigem Pfad
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return String();
DocTempl_EntryData_Impl *pEntry = NULL;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
if ( pRegion )
pEntry = pRegion->GetEntry( nIdx );
if ( pEntry )
return pEntry->GetTargetURL();
else
return String();
}
//------------------------------------------------------------------------
String SfxDocumentTemplates::GetTemplatePath
(
sal_uInt16 nRegion, // Index des Bereiches, in dem der Eintrag liegt
const String& rLongName // logischer Name des Eintrags
) const
/* [Beschreibung]
Liefert den Dateinamen mit vollst"andigem Pfad zu der einem
Eintrag zugeordneten Datei
[R"uckgabewert]
String Dateiname mit vollst"andigem Pfad
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return String();
DocTempl_EntryData_Impl *pEntry = NULL;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
if ( pRegion )
pEntry = pRegion->GetEntry( rLongName );
if ( pEntry )
return pEntry->GetTargetURL();
else if ( pRegion )
{
// a new template is going to be inserted, generate a new URL
// TODO/LATER: if the title is localized, use minimized URL in future
// --**-- extension handling will become more complicated, because
// every new document type will have it's own extension
// e.g.: .stw or .stc instead of .vor
INetURLObject aURLObj( pRegion->GetTargetURL() );
aURLObj.insertName( rLongName, false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
OUString aExtension = aURLObj.getExtension();
if ( ! aExtension.getLength() )
aURLObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM( "vor" ) ) );
return aURLObj.GetMainURL( INetURLObject::NO_DECODE );
}
else
return String();
}
//------------------------------------------------------------------------
String SfxDocumentTemplates::GetDefaultTemplatePath
(
const String& rLongName
)
/* [Beschreibung]
Liefert den Standardpfad zu Dokumentvorlagen
[R"uckgabewert]
String Standardpfad zu Dokumentvorlagen
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return String();
// the first region in the list should always be the standard
// group
// --**-- perhaps we have to create it ???
RegionData_Impl *pRegion = pImp->GetRegion( 0L );
DocTempl_EntryData_Impl *pEntry = NULL;
if ( pRegion )
pEntry = pRegion->GetEntry( rLongName );
if ( pEntry )
return pEntry->GetTargetURL();
else if ( pRegion )
{
// a new template is going to be inserted, generate a new URL
// TODO/LATER: if the title is localized, use minimized URL in future
INetURLObject aURLObj( pRegion->GetTargetURL() );
aURLObj.insertName( rLongName, false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
OUString aExtension = aURLObj.getExtension();
if ( ! aExtension.getLength() )
aURLObj.setExtension( OUString( RTL_CONSTASCII_USTRINGPARAM( "vor" ) ) );
return aURLObj.GetMainURL( INetURLObject::NO_DECODE );
}
else
return String();
/* dv! missing: create the directory, if it doesn't exists
DBG_ASSERT(aDirs.GetTokenCount(cDelim), "Keine Bereiche");
DirEntry aPath(aDirs.GetToken(0, cDelim));
// Verzeichnis anlegen
if(!aPath.MakeDir())
return String();
MakeFileName_Impl(aPath, rLongName, sal_True);
SfxTemplateDir *pEntry = new SfxTemplateDir;
SfxTemplateDirEntryPtr pDirEntry =
new SfxTemplateDirEntry( String( '.' ), aPath.GetPath() );
pDirEntry->SetContent(new SfxTemplateDir(aPath.GetPath()));
pEntry->Insert(pDirEntry, pEntry->Count());
pDirs->Insert(pEntry, pDirs->Count());
return aPath.GetFull();
*/
}
//------------------------------------------------------------------------
::rtl::OUString SfxDocumentTemplates::GetTemplateTargetURLFromComponent( const ::rtl::OUString& aGroupName,
const ::rtl::OUString& aTitle )
{
DocTemplLocker_Impl aLocker( *pImp );
INetURLObject aTemplateObj( pImp->GetRootURL() );
aTemplateObj.insertName( aGroupName, false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
aTemplateObj.insertName( aTitle, false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
::rtl::OUString aResult;
Content aTemplate;
uno::Reference< XCommandEnvironment > aCmdEnv;
if ( Content::create( aTemplateObj.GetMainURL( INetURLObject::NO_DECODE ), aCmdEnv, aTemplate ) )
{
OUString aPropName( RTL_CONSTASCII_USTRINGPARAM( TARGET_URL ) );
getTextProperty_Impl( aTemplate, aPropName, aResult );
aResult = SvtPathOptions().SubstituteVariable( aResult );
}
return aResult;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::SaveDir
(
// SfxTemplateDir& rDir // das zu speichernde Directory
)
/* [Beschreibung]
Speichert das Directory rDir
[R"uckgabewert]
sal_Bool sal_False,
Schreibfehler
sal_True
gespeichert
*/
{
return sal_True;
}
//------------------------------------------------------------------------
void SfxDocumentTemplates::NewTemplate
(
sal_uInt16 nRegion, /* Index des Bereiches, in dem die Vorlage
angelegt werden soll */
const String& rLongName, // logischer Name der neuen Vorlage
const String& rFileName // Dateiname der neuen Vorlage
)
/* [Beschreibung]
Eintragen einer neuen Dokumentvorlage in die Verwaltungsstrukturen
Das "Uberschreiben einer Vorlage gleichen Namens wird
verhindert (!! Fehlermeldung)
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return;
DocTempl_EntryData_Impl *pEntry;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
// do nothing if there is no region with that index
if ( !pRegion )
return;
pEntry = pRegion->GetEntry( rLongName );
// do nothing if there is already an entry with that name
if ( pEntry )
return;
uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
if ( xTemplates->addTemplate( pRegion->GetTitle(), rLongName, rFileName ) )
pRegion->AddEntry( rLongName, rFileName );
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::CopyOrMove
(
sal_uInt16 nTargetRegion, // Index des Zielbereiches
sal_uInt16 nTargetIdx, // Index Zielposition
sal_uInt16 nSourceRegion, // Index des Quellbereiches
sal_uInt16 nSourceIdx, /* Index der zu kopierenden / zu verschiebenden
Dokumentvorlage */
sal_Bool bMove // kopieren / verschieben
)
/* [Beschreibung]
Kopieren oder Verschieben einer Dokumentvorlage
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef2uhrt werden
[Querverweise]
<SfxDocumentTemplates::Move(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16)>
<SfxDocumentTemplates::Copy(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16)>
*/
{
/* to perform a copy or move, we need to send a transfer command to
the destination folder with the URL of the source as parameter.
( If the destination content doesn't support the transfer command,
we could try a copy ( and delete ) instead. )
We need two transfers ( one for the real template and one for its
representation in the hierarchy )
...
*/
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return sal_False;
// Don't copy or move any folders
if( nSourceIdx == USHRT_MAX )
return sal_False ;
if ( nSourceRegion == nTargetRegion )
{
DBG_ERRORFILE( "Don't know, what to do!" );
return sal_False;
#if 0
// Verschieben einer Vorlage innerhalb eines Bereiches
// --> nur Verwaltungsdaten aktualisieren
if ( bMove && nTargetRegion == nSourceRegion )
{
if(nTargetIdx == USHRT_MAX)
nTargetIdx = 0;
const SfxTemplateDirEntryPtr pEntry = rTargetDir[nSourceIdx];
rTargetDir.Insert(pEntry, nTargetIdx);
if(nTargetIdx < nSourceIdx)
++nSourceIdx;
rTargetDir.Remove(nSourceIdx);
return SaveDir(rTargetDir);
}
#endif
}
RegionData_Impl *pSourceRgn = pImp->GetRegion( nSourceRegion );
if ( !pSourceRgn )
return sal_False;
DocTempl_EntryData_Impl *pSource = pSourceRgn->GetEntry( nSourceIdx );
if ( !pSource )
return sal_False;
RegionData_Impl *pTargetRgn = pImp->GetRegion( nTargetRegion );
if ( !pTargetRgn )
return sal_False;
OUString aTitle = pSource->GetTitle();
uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
if ( xTemplates->addTemplate( pTargetRgn->GetTitle(),
aTitle,
pSource->GetTargetURL() ) )
{
INetURLObject aSourceObj( pSource->GetTargetURL() );
::rtl::OUString aNewTargetURL = GetTemplateTargetURLFromComponent( pTargetRgn->GetTitle(), aTitle );
if ( !aNewTargetURL.getLength() )
return sal_False;
if ( bMove )
{
// --**-- delete the original file
sal_Bool bDeleted = xTemplates->removeTemplate( pSourceRgn->GetTitle(),
pSource->GetTitle() );
if ( bDeleted )
pSourceRgn->DeleteEntry( nSourceIdx );
else
{
if ( xTemplates->removeTemplate( pTargetRgn->GetTitle(), aTitle ) )
return sal_False; // will trigger tetry with copy instead of move
// if it is not possible to remove just created template ( must be possible! )
// it is better to report success here, since at least the copy has succeeded
// TODO/LATER: solve it more gracefully in future
}
}
pTargetRgn->AddEntry( aTitle, aNewTargetURL, &nTargetIdx );
return sal_True;
}
// --**-- wenn aktuell das File geoeffnet ist,
// muss es hinterher wieder geoeffnet werden
return sal_False;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::Move
(
sal_uInt16 nTargetRegion, // Index des Zielbereiches
sal_uInt16 nTargetIdx, // Index Zielposition
sal_uInt16 nSourceRegion, // Index des Quellbereiches
sal_uInt16 nSourceIdx /* Index der zu kopierenden / zu verschiebenden
Dokumentvorlage */
)
/* [Beschreibung]
Verschieben einer Dokumentvorlage
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef2uhrt werden
[Querverweise]
<SfxDocumentTemplates::CopyOrMove(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16,sal_Bool)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
return CopyOrMove( nTargetRegion, nTargetIdx,
nSourceRegion, nSourceIdx, sal_True );
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::Copy
(
sal_uInt16 nTargetRegion, // Index des Zielbereiches
sal_uInt16 nTargetIdx, // Index Zielposition
sal_uInt16 nSourceRegion, // Index des Quellbereiches
sal_uInt16 nSourceIdx /* Index der zu kopierenden / zu verschiebenden
Dokumentvorlage */
)
/* [Beschreibung]
Kopieren einer Dokumentvorlage
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxDocumentTemplates::CopyOrMove(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16,sal_Bool)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
return CopyOrMove( nTargetRegion, nTargetIdx,
nSourceRegion, nSourceIdx, sal_False );
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::CopyTo
(
sal_uInt16 nRegion, /* Bereich der Vorlage, die exportiert werden
soll */
sal_uInt16 nIdx, /* Index der Vorlage, die exportiert werden
soll */
const String& rName /* Dateiname, unter dem die Vorlage angelegt
werden soll */
) const
/* [Beschreibung]
Exportieren einer Dokumentvorlage in das Dateisystem
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxDocumentTemplates::CopyFrom(sal_uInt16,sal_uInt16,String&)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return sal_False;
RegionData_Impl *pSourceRgn = pImp->GetRegion( nRegion );
if ( !pSourceRgn )
return sal_False;
DocTempl_EntryData_Impl *pSource = pSourceRgn->GetEntry( nIdx );
if ( !pSource )
return sal_False;
INetURLObject aTargetURL( rName );
OUString aTitle( aTargetURL.getName( INetURLObject::LAST_SEGMENT, true,
INetURLObject::DECODE_WITH_CHARSET ) );
aTargetURL.removeSegment();
OUString aParentURL = aTargetURL.GetMainURL( INetURLObject::NO_DECODE );
uno::Reference< XCommandEnvironment > aCmdEnv;
Content aTarget;
try
{
aTarget = Content( aParentURL, aCmdEnv );
TransferInfo aTransferInfo;
aTransferInfo.MoveData = sal_False;
aTransferInfo.SourceURL = pSource->GetTargetURL();
aTransferInfo.NewTitle = aTitle;
aTransferInfo.NameClash = NameClash::OVERWRITE;
Any aArg = makeAny( aTransferInfo );
OUString aCmd( RTL_CONSTASCII_USTRINGPARAM( COMMAND_TRANSFER ) );
aTarget.executeCommand( aCmd, aArg );
}
catch ( ContentCreationException& )
{ return sal_False; }
catch ( Exception& )
{ return sal_False; }
return sal_True;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::CopyFrom
(
sal_uInt16 nRegion, /* Bereich, in den die Vorlage importiert
werden soll */
sal_uInt16 nIdx, // Index der neuen Vorlage in diesem Bereich
String& rName /* Dateiname der Vorlage, die importiert
werden soll, als out-Parameter der (auto-
matisch aus dem Dateinamen generierte)
logische Name der Vorlage */
)
/* [Beschreibung]
Importieren einer Dokumentvorlage aus dem Dateisystem
[R"uckgabewert] Erfolg (sal_True) oder Mi"serfpTargetDirectory->GetContent());
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxDocumentTemplates::CopyTo(sal_uInt16,sal_uInt16,const String&)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return sal_False;
RegionData_Impl *pTargetRgn = pImp->GetRegion( nRegion );
if ( !pTargetRgn )
return sal_False;
uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
if ( !xTemplates.is() )
return sal_False;
OUString aTitle;
sal_Bool bTemplateAdded = sal_False;
if( pImp->GetTitleFromURL( rName, aTitle ) )
{
bTemplateAdded = xTemplates->addTemplate( pTargetRgn->GetTitle(), aTitle, rName );
}
else
{
OUString aService( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME_DESKTOP ) );
uno::Reference< XComponentLoader > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance( aService ),
UNO_QUERY );
Sequence< PropertyValue > aArgs( 1 );
aArgs[0].Name = ::rtl::OUString::createFromAscii("Hidden");
aArgs[0].Value <<= sal_True;
INetURLObject aTemplURL( rName );
uno::Reference< XDocumentPropertiesSupplier > xDocPropsSupplier;
uno::Reference< XStorable > xStorable;
try
{
xStorable = uno::Reference< XStorable >(
xDesktop->loadComponentFromURL( aTemplURL.GetMainURL(INetURLObject::NO_DECODE),
OUString::createFromAscii( "_blank" ),
0,
aArgs ),
UNO_QUERY );
xDocPropsSupplier = uno::Reference< XDocumentPropertiesSupplier >(
xStorable, UNO_QUERY );
}
catch( Exception& )
{
}
if( xStorable.is() )
{
// get Title from XDocumentPropertiesSupplier
if( xDocPropsSupplier.is() )
{
uno::Reference< XDocumentProperties > xDocProps
= xDocPropsSupplier->getDocumentProperties();
if (xDocProps.is() ) {
aTitle = xDocProps->getTitle();
}
}
if( ! aTitle.getLength() )
{
INetURLObject aURL( aTemplURL );
aURL.CutExtension();
aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
INetURLObject::DECODE_WITH_CHARSET );
}
// write a template using XStorable interface
bTemplateAdded = xTemplates->storeTemplate( pTargetRgn->GetTitle(), aTitle, xStorable );
}
}
if( bTemplateAdded )
{
INetURLObject aTemplObj( pTargetRgn->GetHierarchyURL() );
aTemplObj.insertName( aTitle, false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
OUString aTemplURL = aTemplObj.GetMainURL( INetURLObject::NO_DECODE );
uno::Reference< XCommandEnvironment > aCmdEnv;
Content aTemplCont;
if( Content::create( aTemplURL, aCmdEnv, aTemplCont ) )
{
OUString aTemplName;
OUString aPropName( RTL_CONSTASCII_USTRINGPARAM( TARGET_URL ) );
if( getTextProperty_Impl( aTemplCont, aPropName, aTemplName ) )
{
if ( nIdx == USHRT_MAX )
nIdx = 0;
else
nIdx += 1;
pTargetRgn->AddEntry( aTitle, aTemplName, &nIdx );
rName = aTitle;
return sal_True;
}
else
{
DBG_ASSERT( sal_False, "CopyFrom(): The content should contain target URL!" );
}
}
else
{
DBG_ASSERT( sal_False, "CopyFrom(): The content just was created!" );
}
}
return sal_False;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::Delete
(
sal_uInt16 nRegion, // Index des Bereiches
sal_uInt16 nIdx /* Index des Eintrags oder USHRT_MAX,
wenn ein Verzeichnis gemeint ist. */
)
/* [Beschreibung]
"oschen eines Eintrags oder eines Verzeichnisses
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxDocumentTemplates::InsertDir(const String&,sal_uInt16)>
<SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
<SfxDocumentTemplates::SaveDir(SfxTemplateDir&)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
/* delete the template or folder in the hierarchy and in the
template folder by sending a delete command to the content.
Then remove the data from the lists
*/
if ( ! pImp->Construct() )
return sal_False;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
if ( !pRegion )
return sal_False;
sal_Bool bRet;
uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
if ( nIdx == USHRT_MAX )
{
bRet = xTemplates->removeGroup( pRegion->GetTitle() );
if ( bRet )
pImp->DeleteRegion( nRegion );
}
else
{
DocTempl_EntryData_Impl *pEntry = pRegion->GetEntry( nIdx );
if ( !pEntry )
return sal_False;
bRet = xTemplates->removeTemplate( pRegion->GetTitle(),
pEntry->GetTitle() );
if( bRet )
pRegion->DeleteEntry( nIdx );
}
return bRet;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::InsertDir
(
const String& rText, // der logische Name des neuen Bereiches
sal_uInt16 nRegion // Index des Bereiches
)
/* [Beschreibung]
Einf"ugen eines Verzeichnisses
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
<SfxDocumentTemplates::SaveDir(SfxTemplateDir&)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return sal_False;
RegionData_Impl *pRegion = pImp->GetRegion( rText );
if ( pRegion )
return sal_False;
uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
if ( xTemplates->addGroup( rText ) )
{
RegionData_Impl* pNewRegion = new RegionData_Impl( pImp, rText );
if ( ! pImp->InsertRegion( pNewRegion, nRegion ) )
{
delete pNewRegion;
return sal_False;
}
return sal_True;
}
return sal_False;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::SetName
(
const String& rName, // Der zu setzende Name
sal_uInt16 nRegion, // Index des Bereiches
sal_uInt16 nIdx /* Index des Eintrags oder USHRT_MAX,
wenn ein Verzeichnis gemeint ist. */
)
/* [Beschreibung]
"Andern des Namens eines Eintrags oder eines Verzeichnisses
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return sal_False;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
DocTempl_EntryData_Impl *pEntry = NULL;
if ( !pRegion )
return sal_False;
uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
OUString aEmpty;
if ( nIdx == USHRT_MAX )
{
if ( pRegion->GetTitle() == OUString( rName ) )
return sal_True;
// we have to rename a region
if ( xTemplates->renameGroup( pRegion->GetTitle(), rName ) )
{
pRegion->SetTitle( rName );
pRegion->SetTargetURL( aEmpty );
pRegion->SetHierarchyURL( aEmpty );
return sal_True;
}
}
else
{
pEntry = pRegion->GetEntry( nIdx );
if ( !pEntry )
return sal_False;
if ( pEntry->GetTitle() == OUString( rName ) )
return sal_True;
if ( xTemplates->renameTemplate( pRegion->GetTitle(),
pEntry->GetTitle(),
rName ) )
{
pEntry->SetTitle( rName );
pEntry->SetTargetURL( aEmpty );
pEntry->SetHierarchyURL( aEmpty );
return sal_True;
}
}
return sal_False;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::Rescan()
/* [Beschreibung]
Abgleich des Verwaltungsdaten mit dem aktuellen Zustand auf der Platte.
Die logischen Namen, zu denen keine Datei mit existiert, werden aus
der Verwaltungsstruktur entfernt; Dateien, zu denen kein Eintrag
existiert, werden aufgenommen.
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxTemplateDir::Scan(sal_Bool bDirectory, sal_Bool bSave)>
<SfxTemplateDir::Freshen(const SfxTemplateDir &rNew)>
*/
{
if ( !pImp->Construct() )
return sal_False;
pImp->Rescan();
return sal_True;
}
//------------------------------------------------------------------------
SfxObjectShellRef SfxDocumentTemplates::CreateObjectShell
(
sal_uInt16 nRegion, // Index des Bereiches
sal_uInt16 nIdx // Index des Eintrags
)
/* [Beschreibung]
Zugriff auf die DokumentShell eines Eintrags
[R"uckgabewert]
SfxObjectShellRef Referenz auf die ObjectShell
[Querverweise]
<SfxTemplateDirEntry::CreateObjectShell()>
<SfxDocumentTemplates::DeleteObjectShell(sal_uInt16, sal_uInt16)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( !pImp->Construct() )
return NULL;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
DocTempl_EntryData_Impl *pEntry = NULL;
if ( pRegion )
pEntry = pRegion->GetEntry( nIdx );
if ( pEntry )
return pEntry->CreateObjectShell();
else
return NULL;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::DeleteObjectShell
(
sal_uInt16 nRegion, // Index des Bereiches
sal_uInt16 nIdx // Index des Eintrags
)
/* [Beschreibung]
Freigeben der ObjectShell eines Eintrags
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxTemplateDirEntry::DeleteObjectShell()>
<SfxDocumentTemplates::CreateObjectShell(sal_uInt16, sal_uInt16)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return sal_True;
RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
DocTempl_EntryData_Impl *pEntry = NULL;
if ( pRegion )
pEntry = pRegion->GetEntry( nIdx );
if ( pEntry )
return pEntry->DeleteObjectShell();
else
return sal_True;
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::GetFull
(
const String &rRegion, // Der Name des Bereiches
const String &rName, // Der Name der Vorlage
String &rPath // Out: Pfad + Dateiname
)
/* [Beschreibung]
Liefert Pfad + Dateiname zu der durch rRegion und rName bezeichneten
Vorlage
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxDocumentTemplates::GetLogicNames(const String&,String&,String&)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
// We don't search for empty names!
if ( ! rName.Len() )
return sal_False;
if ( ! pImp->Construct() )
return sal_False;
DocTempl_EntryData_Impl* pEntry = NULL;
const sal_uInt16 nCount = GetRegionCount();
for ( sal_uInt16 i = 0; i < nCount; ++i )
{
RegionData_Impl *pRegion = pImp->GetRegion( i );
if( pRegion &&
( !rRegion.Len() || ( rRegion == String( pRegion->GetTitle() ) ) ) )
{
pEntry = pRegion->GetEntry( rName );
if ( pEntry )
{
rPath = pEntry->GetTargetURL();
break;
}
}
}
return ( pEntry != NULL );
}
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::GetLogicNames
(
const String &rPath, // vollst"andiger Pfad zu der Vorlage
String &rRegion, // Out: der Bereichsname
String &rName // Out: der Vorlagenname
) const
/* [Beschreibung]
Liefert Pfad und logischen Namen zu der durch rPath bezeichneten
Vorlage
[R"uckgabewert]
sal_Bool sal_True
Aktion konnte ausgef"uhrt werden
sal_False
Aktion konnte nicht ausgef"uhrt werden
[Querverweise]
<SfxDocumentTemplates::GetFull(const String&,const String&,DirEntry&)>
*/
{
DocTemplLocker_Impl aLocker( *pImp );
if ( ! pImp->Construct() )
return sal_False;
INetURLObject aFullPath;
aFullPath.SetSmartProtocol( INET_PROT_FILE );
aFullPath.SetURL( rPath );
OUString aPath( aFullPath.GetMainURL( INetURLObject::NO_DECODE ) );
RegionData_Impl *pData = NULL;
DocTempl_EntryData_Impl *pEntry = NULL;
sal_Bool bFound = sal_False;
sal_uIntPtr nCount = GetRegionCount();
for ( sal_uIntPtr i=0; !bFound && (i<nCount); i++ )
{
pData = pImp->GetRegion( i );
if ( pData )
{
sal_uIntPtr nChildCount = pData->GetCount();
for ( sal_uIntPtr j=0; !bFound && (j<nChildCount); j++ )
{
pEntry = pData->GetEntry( j );
if ( pEntry->GetTargetURL() == aPath )
{
bFound = sal_True;
}
}
}
}
if ( bFound )
{
rRegion = pData->GetTitle();
rName = pEntry->GetTitle();
}
return bFound;
}
//------------------------------------------------------------------------
SfxDocumentTemplates::SfxDocumentTemplates()
/* [Beschreibung]
Konstruktor
*/
{
if ( !gpTemplateData )
gpTemplateData = new SfxDocTemplate_Impl;
pImp = gpTemplateData;
}
//-------------------------------------------------------------------------
void SfxDocumentTemplates::Construct()
// verz"ogerter Aufbau der Verwaltungsdaten
{
// pImp->Construct();
}
//------------------------------------------------------------------------
SfxDocumentTemplates::~SfxDocumentTemplates()
/* [Beschreibung]
Destruktor
Freigeben der Verwaltungsdaten
*/
{
pImp = NULL;
}
void SfxDocumentTemplates::Update( sal_Bool _bSmart )
{
if ( !_bSmart // don't be smart
|| ::svt::TemplateFolderCache( sal_True ).needsUpdate() // update is really necessary
)
{
if ( pImp->Construct() )
pImp->Rescan();
}
}
void SfxDocumentTemplates::ReInitFromComponent()
{
pImp->ReInitFromComponent();
}
sal_Bool SfxDocumentTemplates::HasUserContents( sal_uInt16 nRegion, sal_uInt16 nIdx ) const
{
DocTemplLocker_Impl aLocker( *pImp );
sal_Bool bResult = sal_False;
RegionData_Impl* pRegion = pImp->GetRegion( nRegion );
if ( pRegion )
{
::rtl::OUString aRegionTargetURL = pRegion->GetTargetURL();
if ( aRegionTargetURL.getLength() )
{
sal_uInt16 nLen = 0;
sal_uInt16 nStartInd = 0;
if( nIdx == USHRT_MAX )
{
// this is a folder
// check whether there is at least one editable template
nLen = ( sal_uInt16 )pRegion->GetCount();
nStartInd = 0;
if ( nLen == 0 )
bResult = sal_True; // the writing part of empty folder with writing URL can be removed
}
else
{
// this is a template
// check whether the template is inserted by user
nLen = 1;
nStartInd = nIdx;
}
for ( sal_uInt16 nInd = nStartInd; nInd < nStartInd + nLen; nInd++ )
{
DocTempl_EntryData_Impl* pEntryData = pRegion->GetEntry( nInd );
if ( pEntryData )
{
::rtl::OUString aEntryTargetURL = pEntryData->GetTargetURL();
if ( aEntryTargetURL.getLength()
&& ::utl::UCBContentHelper::IsSubPath( aRegionTargetURL, aEntryTargetURL ) )
{
bResult = sal_True;
break;
}
}
}
}
}
return bResult;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
DocTempl_EntryData_Impl::DocTempl_EntryData_Impl( RegionData_Impl* pParent,
const OUString& rTitle )
{
mpParent = pParent;
maTitle = rTitle;
mbIsOwner = sal_False;
mbDidConvert= sal_False;
}
// -----------------------------------------------------------------------
int DocTempl_EntryData_Impl::Compare( const OUString& rTitle ) const
{
return maTitle.compareTo( rTitle );
}
//------------------------------------------------------------------------
SfxObjectShellRef DocTempl_EntryData_Impl::CreateObjectShell()
{
if( ! mxObjShell.Is() )
{
mbIsOwner = sal_False;
sal_Bool bDum = sal_False;
SfxApplication *pSfxApp = SFX_APP();
String aTargetURL = GetTargetURL();
mxObjShell = pSfxApp->DocAlreadyLoaded( aTargetURL, sal_True, bDum );
if( ! mxObjShell.Is() )
{
mbIsOwner = sal_True;
SfxMedium *pMed=new SfxMedium(
aTargetURL,(STREAM_STD_READWRITE | STREAM_SHARE_DENYALL), sal_False, 0 );
const SfxFilter* pFilter = NULL;
pMed->UseInteractionHandler(sal_True);
if( pSfxApp->GetFilterMatcher().GuessFilter(
*pMed, &pFilter, SFX_FILTER_TEMPLATE, 0 ) ||
(pFilter && !pFilter->IsOwnFormat()) ||
(pFilter && !pFilter->UsesStorage()) )
{
SfxErrorContext aEc( ERRCTX_SFX_LOADTEMPLATE,
aTargetURL );
delete pMed;
mbDidConvert=sal_True;
sal_uIntPtr lErr;
if ( mxObjShell.Is() ) {
lErr = pSfxApp->LoadTemplate( mxObjShell,aTargetURL);
if( lErr != ERRCODE_NONE )
ErrorHandler::HandleError(lErr);
}
}
else if (pFilter)
{
mbDidConvert=sal_False;
mxObjShell = SfxObjectShell::CreateObject( pFilter->GetServiceName(), SFX_CREATE_MODE_ORGANIZER );
if ( mxObjShell.Is() )
{
mxObjShell->DoInitNew(0);
// TODO/LATER: make sure that we don't use binary templates!
if( mxObjShell->LoadFrom( *pMed ) )
{
mxObjShell->DoSaveCompleted( pMed );
}
else
mxObjShell.Clear();
}
}
}
}
return (SfxObjectShellRef)(SfxObjectShell*) mxObjShell;
}
//------------------------------------------------------------------------
sal_Bool DocTempl_EntryData_Impl::DeleteObjectShell()
{
sal_Bool bRet = sal_True;
if ( mxObjShell.Is() )
{
if( mxObjShell->IsModified() )
{
//Hier speichern wir auch, falls die Vorlage in Bearbeitung ist...
bRet = sal_False;
if ( mbIsOwner )
{
if( mbDidConvert )
{
bRet=mxObjShell->PreDoSaveAs_Impl(
GetTargetURL(),
mxObjShell->GetFactory().GetFilterContainer()->GetAnyFilter( SFX_FILTER_EXPORT | SFX_FILTER_IMPORT, SFX_FILTER_INTERNAL )->GetFilterName(), 0 );
}
else
{
if( mxObjShell->Save() )
{
uno::Reference< embed::XTransactedObject > xTransacted( mxObjShell->GetStorage(), uno::UNO_QUERY );
DBG_ASSERT( xTransacted.is(), "Storage must implement XTransactedObject!\n" );
if ( xTransacted.is() )
{
try
{
xTransacted->commit();
bRet = sal_True;
}
catch( uno::Exception& )
{
}
}
}
}
}
}
if( bRet )
{
mxObjShell.Clear();
}
}
return bRet;
}
// -----------------------------------------------------------------------
const OUString& DocTempl_EntryData_Impl::GetHierarchyURL()
{
if ( !maOwnURL.getLength() )
{
INetURLObject aTemplateObj( GetParent()->GetHierarchyURL() );
aTemplateObj.insertName( GetTitle(), false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
maOwnURL = aTemplateObj.GetMainURL( INetURLObject::NO_DECODE );
DBG_ASSERT( maOwnURL.getLength(), "GetHierarchyURL(): Could not create URL!" );
}
return maOwnURL;
}
// -----------------------------------------------------------------------
const OUString& DocTempl_EntryData_Impl::GetTargetURL()
{
if ( !maTargetURL.getLength() )
{
uno::Reference< XCommandEnvironment > aCmdEnv;
Content aRegion;
if ( Content::create( GetHierarchyURL(), aCmdEnv, aRegion ) )
{
OUString aPropName( RTL_CONSTASCII_USTRINGPARAM( TARGET_URL ) );
getTextProperty_Impl( aRegion, aPropName, maTargetURL );
}
else
{
DBG_ERRORFILE( "GetTargetURL(): Could not create hierarchy content!" );
}
}
return maTargetURL;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
RegionData_Impl::RegionData_Impl( const SfxDocTemplate_Impl* pParent,
const OUString& rTitle )
{
maTitle = rTitle;
mpParent = pParent;
}
// -----------------------------------------------------------------------
RegionData_Impl::~RegionData_Impl()
{
DocTempl_EntryData_Impl *pData = maEntries.First();
while ( pData )
{
delete pData;
pData = maEntries.Next();
}
}
// -----------------------------------------------------------------------
long RegionData_Impl::GetEntryPos( const OUString& rTitle,
sal_Bool& rFound ) const
{
#if 1 // Don't use binary search today
sal_uIntPtr i;
sal_uIntPtr nCount = maEntries.Count();
for ( i=0; i<nCount; i++ )
{
DocTempl_EntryData_Impl *pData = maEntries.GetObject( i );
if ( pData->Compare( rTitle ) == 0 )
{
rFound = sal_True;
return i;
}
}
rFound = sal_False;
return i;
#else
// use binary search to find the correct position
// in the maEntries list
int nCompVal = 1;
long nStart = 0;
long nEnd = maEntries.Count() - 1;
long nMid;
DocTempl_EntryData_Impl* pMid;
rFound = sal_False;
while ( nCompVal && ( nStart <= nEnd ) )
{
nMid = ( nEnd - nStart ) / 2 + nStart;
pMid = maEntries.GetObject( nMid );
nCompVal = pMid->Compare( rTitle );
if ( nCompVal < 0 ) // pMid < pData
nStart = nMid + 1;
else
nEnd = nMid - 1;
}
if ( nCompVal == 0 )
{
rFound = sal_True;
}
else
{
if ( nCompVal < 0 ) // pMid < pData
nMid++;
}
return nMid;
#endif
}
// -----------------------------------------------------------------------
void RegionData_Impl::AddEntry( const OUString& rTitle,
const OUString& rTargetURL,
sal_uInt16 *pPos )
{
INetURLObject aLinkObj( GetHierarchyURL() );
aLinkObj.insertName( rTitle, false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
OUString aLinkURL = aLinkObj.GetMainURL( INetURLObject::NO_DECODE );
DocTempl_EntryData_Impl *pEntry;
sal_Bool bFound = sal_False;
long nPos = GetEntryPos( rTitle, bFound );
if ( bFound )
{
pEntry = maEntries.GetObject( nPos );
}
else
{
if ( pPos )
nPos = *pPos;
pEntry = new DocTempl_EntryData_Impl( this, rTitle );
pEntry->SetTargetURL( rTargetURL );
pEntry->SetHierarchyURL( aLinkURL );
maEntries.Insert( pEntry, nPos );
}
}
// -----------------------------------------------------------------------
sal_uIntPtr RegionData_Impl::GetCount() const
{
return maEntries.Count();
}
// -----------------------------------------------------------------------
const OUString& RegionData_Impl::GetHierarchyURL()
{
if ( !maOwnURL.getLength() )
{
INetURLObject aRegionObj( GetParent()->GetRootURL() );
aRegionObj.insertName( GetTitle(), false,
INetURLObject::LAST_SEGMENT, true,
INetURLObject::ENCODE_ALL );
maOwnURL = aRegionObj.GetMainURL( INetURLObject::NO_DECODE );
DBG_ASSERT( maOwnURL.getLength(), "GetHierarchyURL(): Could not create URL!" );
}
return maOwnURL;
}
// -----------------------------------------------------------------------
const OUString& RegionData_Impl::GetTargetURL()
{
if ( !maTargetURL.getLength() )
{
uno::Reference< XCommandEnvironment > aCmdEnv;
Content aRegion;
if ( Content::create( GetHierarchyURL(), aCmdEnv, aRegion ) )
{
OUString aPropName( RTL_CONSTASCII_USTRINGPARAM( TARGET_DIR_URL ) );
getTextProperty_Impl( aRegion, aPropName, maTargetURL );
// --> PB 2004-10-27 #i32656# - the targeturl must be substituted: $(baseinsturl)
maTargetURL = SvtPathOptions().SubstituteVariable( maTargetURL );
// <--
}
else
{
DBG_ERRORFILE( "GetTargetURL(): Could not create hierarchy content!" );
}
}
return maTargetURL;
}
// -----------------------------------------------------------------------
DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( const OUString& rName ) const
{
sal_Bool bFound = sal_False;
long nPos = GetEntryPos( rName, bFound );
if ( bFound )
return maEntries.GetObject( nPos );
else
return NULL;
}
// -----------------------------------------------------------------------
DocTempl_EntryData_Impl* RegionData_Impl::GetByTargetURL( const OUString& rName ) const
{
DocTempl_EntryData_Impl *pEntry;
sal_uIntPtr nCount = maEntries.Count();
for ( sal_uIntPtr i=0; i<nCount; i++ )
{
pEntry = maEntries.GetObject( i );
if ( pEntry && ( pEntry->GetTargetURL() == rName ) )
return pEntry;
}
return NULL;
}
// -----------------------------------------------------------------------
DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( sal_uIntPtr nIndex ) const
{
return maEntries.GetObject( nIndex );
}
// -----------------------------------------------------------------------
void RegionData_Impl::DeleteEntry( sal_uIntPtr nIndex )
{
DocTempl_EntryData_Impl *pEntry = maEntries.GetObject( nIndex );
if ( pEntry )
{
delete pEntry;
maEntries.Remove( (sal_uIntPtr) nIndex );
}
}
// -----------------------------------------------------------------------
int RegionData_Impl::Compare( RegionData_Impl* pCompare ) const
{
int nCompare = maTitle.compareTo( pCompare->maTitle );
return nCompare;
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
SfxDocTemplate_Impl::SfxDocTemplate_Impl()
: mbConstructed( sal_False )
, mnLockCounter( 0 )
{
}
// -----------------------------------------------------------------------
SfxDocTemplate_Impl::~SfxDocTemplate_Impl()
{
Clear();
gpTemplateData = NULL;
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::IncrementLock()
{
::osl::MutexGuard aGuard( maMutex );
mnLockCounter++;
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::DecrementLock()
{
::osl::MutexGuard aGuard( maMutex );
if ( mnLockCounter )
mnLockCounter--;
}
// -----------------------------------------------------------------------
RegionData_Impl* SfxDocTemplate_Impl::GetRegion( sal_uIntPtr nIndex ) const
{
return maRegions.GetObject( nIndex );
}
// -----------------------------------------------------------------------
RegionData_Impl* SfxDocTemplate_Impl::GetRegion( const OUString& rName )
const
{
sal_uIntPtr nCount = maRegions.Count();
RegionData_Impl *pData;
for ( sal_uIntPtr i=0; i<nCount; i++ )
{
pData = maRegions.GetObject( i );
if ( pData->GetTitle() == rName )
return pData;
}
return NULL;
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::DeleteRegion( sal_uIntPtr nIndex )
{
RegionData_Impl* pRegion = maRegions.GetObject( nIndex );
if ( pRegion )
{
delete pRegion;
maRegions.Remove( (sal_uIntPtr) nIndex );
}
}
// -----------------------------------------------------------------------
/* AddRegion adds a Region to the RegionList
*/
void SfxDocTemplate_Impl::AddRegion( const OUString& rTitle,
Content& rContent )
{
RegionData_Impl* pRegion;
pRegion = new RegionData_Impl( this, rTitle );
if ( ! InsertRegion( pRegion ) )
{
delete pRegion;
return;
}
// now get the content of the region
uno::Reference< XResultSet > xResultSet;
Sequence< OUString > aProps(2);
aProps[0] = OUString::createFromAscii( TITLE );
aProps[1] = OUString::createFromAscii( TARGET_URL );
try
{
ResultSetInclude eInclude = INCLUDE_DOCUMENTS_ONLY;
Sequence< NumberedSortingInfo > aSortingInfo(1);
aSortingInfo.getArray()->ColumnIndex = 1;
aSortingInfo.getArray()->Ascending = sal_True;
xResultSet = rContent.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
}
catch ( Exception& ) {}
if ( xResultSet.is() )
{
uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
try
{
while ( xResultSet->next() )
{
OUString aTitle( xRow->getString( 1 ) );
OUString aTargetDir( xRow->getString( 2 ) );
pRegion->AddEntry( aTitle, aTargetDir );
}
}
catch ( Exception& ) {}
}
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::CreateFromHierarchy( Content &rTemplRoot )
{
uno::Reference< XResultSet > xResultSet;
Sequence< OUString > aProps(1);
aProps[0] = OUString::createFromAscii( TITLE );
try
{
ResultSetInclude eInclude = INCLUDE_FOLDERS_ONLY;
Sequence< NumberedSortingInfo > aSortingInfo(1);
aSortingInfo.getArray()->ColumnIndex = 1;
aSortingInfo.getArray()->Ascending = sal_True;
xResultSet = rTemplRoot.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
}
catch ( Exception& ) {}
if ( xResultSet.is() )
{
uno::Reference< XCommandEnvironment > aCmdEnv;
uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
try
{
while ( xResultSet->next() )
{
OUString aTitle( xRow->getString( 1 ) );
OUString aId = xContentAccess->queryContentIdentifierString();
Content aContent = Content( aId, aCmdEnv );
AddRegion( aTitle, aContent );
}
}
catch ( Exception& ) {}
}
}
// ------------------------------------------------------------------------
sal_Bool SfxDocTemplate_Impl::Construct( )
{
::osl::MutexGuard aGuard( maMutex );
if ( mbConstructed )
return sal_True;
uno::Reference< XMultiServiceFactory > xFactory;
xFactory = ::comphelper::getProcessServiceFactory();
OUString aService( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME_DOCINFO ) );
uno::Reference< XPersist > xInfo( xFactory->createInstance( aService ), UNO_QUERY );
mxInfo = xInfo;
aService = OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME_DOCTEMPLATES ) );
uno::Reference< XDocumentTemplates > xTemplates( xFactory->createInstance( aService ), UNO_QUERY );
if ( xTemplates.is() )
mxTemplates = xTemplates;
else
return sal_False;
uno::Reference< XLocalizable > xLocalizable( xTemplates, UNO_QUERY );
Sequence< Any > aCompareArg(1);
*(aCompareArg.getArray()) <<= xLocalizable->getLocale();;
m_rCompareFactory = uno::Reference< XAnyCompareFactory >(
xFactory->createInstanceWithArguments( OUString::createFromAscii( "com.sun.star.ucb.AnyCompareFactory" ),
aCompareArg ),
UNO_QUERY );
uno::Reference < XContent > aRootContent = xTemplates->getContent();
uno::Reference < XCommandEnvironment > aCmdEnv;
if ( ! aRootContent.is() )
return sal_False;
mbConstructed = sal_True;
maRootURL = aRootContent->getIdentifier()->getContentIdentifier();
ResStringArray aLongNames( SfxResId( TEMPLATE_LONG_NAMES_ARY ) );
if ( aLongNames.Count() )
maStandardGroup = aLongNames.GetString( 0 );
Content aTemplRoot( aRootContent, aCmdEnv );
CreateFromHierarchy( aTemplRoot );
return sal_True;
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::ReInitFromComponent()
{
uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
if ( xTemplates.is() )
{
uno::Reference < XContent > aRootContent = xTemplates->getContent();
uno::Reference < XCommandEnvironment > aCmdEnv;
Content aTemplRoot( aRootContent, aCmdEnv );
Clear();
CreateFromHierarchy( aTemplRoot );
}
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::GetTemplates( Content& rTargetFolder,
Content& /*rParentFolder*/,
RegionData_Impl* pRegion )
{
uno::Reference< XResultSet > xResultSet;
Sequence< OUString > aProps(1);
aProps[0] = OUString::createFromAscii( TITLE );
try
{
ResultSetInclude eInclude = INCLUDE_DOCUMENTS_ONLY;
Sequence< NumberedSortingInfo > aSortingInfo(1);
aSortingInfo.getArray()->ColumnIndex = 1;
aSortingInfo.getArray()->Ascending = sal_True;
xResultSet = rTargetFolder.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
}
catch ( Exception& ) {}
if ( xResultSet.is() )
{
uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
try
{
while ( xResultSet->next() )
{
OUString aTitle( xRow->getString(1) );
if ( aTitle.compareToAscii( "sfx.tlx" ) == 0 )
continue;
OUString aId = xContentAccess->queryContentIdentifierString();
DocTempl_EntryData_Impl* pEntry = pRegion->GetByTargetURL( aId );
if ( ! pEntry )
{
OUString aFullTitle;
if( !GetTitleFromURL( aId, aFullTitle ) )
{
DBG_ERRORFILE( "GetTemplates(): template of alien format" );
continue;
}
if ( aFullTitle.getLength() )
aTitle = aFullTitle;
pRegion->AddEntry( aTitle, aId );
}
}
}
catch ( Exception& ) {}
}
}
// -----------------------------------------------------------------------
long SfxDocTemplate_Impl::GetRegionPos( const OUString& rTitle,
sal_Bool& rFound ) const
{
int nCompVal = 1;
long nStart = 0;
long nEnd = maRegions.Count() - 1;
long nMid = 0;
RegionData_Impl* pMid;
while ( nCompVal && ( nStart <= nEnd ) )
{
nMid = ( nEnd - nStart ) / 2 + nStart;
pMid = maRegions.GetObject( nMid );
nCompVal = pMid->Compare( rTitle );
if ( nCompVal < 0 ) // pMid < pData
nStart = nMid + 1;
else
nEnd = nMid - 1;
}
if ( nCompVal == 0 )
rFound = sal_True;
else
{
if ( nCompVal < 0 ) // pMid < pData
nMid++;
rFound = sal_False;
}
return nMid;
}
// -----------------------------------------------------------------------
sal_Bool SfxDocTemplate_Impl::InsertRegion( RegionData_Impl *pNew,
sal_uIntPtr nPos )
{
::osl::MutexGuard aGuard( maMutex );
RegionData_Impl *pData = maRegions.First();
while ( pData && ( pData->Compare( pNew ) != 0 ) )
pData = maRegions.Next();
if ( ! pData )
{
// compare with the name of the standard group here to insert it
// first
if ( pNew->GetTitle() == maStandardGroup )
maRegions.Insert( pNew, (sal_uIntPtr) 0 );
else
maRegions.Insert( pNew, nPos );
}
return ( pData == NULL );
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::Rescan()
{
Clear();
try
{
uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
DBG_ASSERT( xTemplates.is(), "SfxDocTemplate_Impl::Rescan:invalid template instance!" );
if ( xTemplates.is() )
{
xTemplates->update();
uno::Reference < XContent > aRootContent = xTemplates->getContent();
uno::Reference < XCommandEnvironment > aCmdEnv;
Content aTemplRoot( aRootContent, aCmdEnv );
CreateFromHierarchy( aTemplRoot );
}
}
catch( const Exception& )
{
DBG_ERRORFILE( "SfxDocTemplate_Impl::Rescan: caught an exception while doing the update!" );
}
}
// -----------------------------------------------------------------------
sal_Bool SfxDocTemplate_Impl::GetTitleFromURL( const OUString& rURL,
OUString& aTitle )
{
if ( mxInfo.is() )
{
try
{
mxInfo->read( rURL );
}
catch ( Exception& )
{
// the document is not a StarOffice document
return sal_False;
}
try
{
uno::Reference< XPropertySet > aPropSet( mxInfo, UNO_QUERY );
if ( aPropSet.is() )
{
OUString aPropName( RTL_CONSTASCII_USTRINGPARAM( TITLE ) );
Any aValue = aPropSet->getPropertyValue( aPropName );
aValue >>= aTitle;
}
}
catch ( IOException& ) {}
catch ( UnknownPropertyException& ) {}
catch ( Exception& ) {}
}
if ( ! aTitle.getLength() )
{
INetURLObject aURL( rURL );
aURL.CutExtension();
aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
INetURLObject::DECODE_WITH_CHARSET );
}
return sal_True;
}
// -----------------------------------------------------------------------
void SfxDocTemplate_Impl::Clear()
{
::osl::MutexGuard aGuard( maMutex );
if ( mnLockCounter )
return;
RegionData_Impl *pRegData = maRegions.First();
while ( pRegData )
{
delete pRegData;
pRegData = maRegions.Next();
}
maRegions.Clear();
}
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
sal_Bool getTextProperty_Impl( Content& rContent,
const OUString& rPropName,
OUString& rPropValue )
{
sal_Bool bGotProperty = sal_False;
// Get the property
try
{
uno::Reference< XPropertySetInfo > aPropInfo = rContent.getProperties();
// check, wether or not the property exists
if ( !aPropInfo.is() || !aPropInfo->hasPropertyByName( rPropName ) )
{
return sal_False;
}
// now get the property
Any aAnyValue;
aAnyValue = rContent.getPropertyValue( rPropName );
aAnyValue >>= rPropValue;
if ( SfxURLRelocator_Impl::propertyCanContainOfficeDir( rPropName ) )
{
SfxURLRelocator_Impl aRelocImpl( ::comphelper::getProcessServiceFactory() );
aRelocImpl.makeAbsoluteURL( rPropValue );
}
bGotProperty = sal_True;
}
catch ( RuntimeException& ) {}
catch ( Exception& ) {}
return bGotProperty;
}