xref: /aoo41x/main/sfx2/source/doc/docfac.cxx (revision d119d52d)
1*d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*d119d52dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*d119d52dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*d119d52dSAndrew Rist  * distributed with this work for additional information
6*d119d52dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*d119d52dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*d119d52dSAndrew Rist  * "License"); you may not use this file except in compliance
9*d119d52dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*d119d52dSAndrew Rist  *
11*d119d52dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*d119d52dSAndrew Rist  *
13*d119d52dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*d119d52dSAndrew Rist  * software distributed under the License is distributed on an
15*d119d52dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d119d52dSAndrew Rist  * KIND, either express or implied.  See the License for the
17*d119d52dSAndrew Rist  * specific language governing permissions and limitations
18*d119d52dSAndrew Rist  * under the License.
19*d119d52dSAndrew Rist  *
20*d119d52dSAndrew Rist  *************************************************************/
21*d119d52dSAndrew Rist 
22*d119d52dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
26cdf0e10cSrcweir #include <com/sun/star/registry/MergeConflictException.hpp>
27cdf0e10cSrcweir #include <com/sun/star/registry/XSimpleRegistry.hpp>
28cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
29cdf0e10cSrcweir #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
30cdf0e10cSrcweir #include <com/sun/star/document/XTypeDetection.hpp>
31cdf0e10cSrcweir #include <com/sun/star/frame/XLoadable.hpp>
32cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp>
33cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
34cdf0e10cSrcweir #include <tools/config.hxx>
35cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
36cdf0e10cSrcweir #include <unotools/moduleoptions.hxx>
37cdf0e10cSrcweir #include <tools/urlobj.hxx>
38cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
39cdf0e10cSrcweir #include <unotools/localfilehelper.hxx>
40cdf0e10cSrcweir #include <comphelper/sequenceashashmap.hxx>
41cdf0e10cSrcweir #include <comphelper/configurationhelper.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #include <sfx2/sfx.hrc>
44cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
45cdf0e10cSrcweir #include <sfx2/docfac.hxx>
46cdf0e10cSrcweir #include "sfx2/viewfac.hxx"
47cdf0e10cSrcweir #include "fltfnc.hxx"
48cdf0e10cSrcweir #include "arrdecl.hxx"
49cdf0e10cSrcweir #include <sfx2/app.hxx>
50cdf0e10cSrcweir #include <sfx2/module.hxx>
51cdf0e10cSrcweir #include <sfx2/mnumgr.hxx>
52cdf0e10cSrcweir #include "sfx2/sfxresid.hxx"
53cdf0e10cSrcweir #include <sfx2/sfxuno.hxx>
54cdf0e10cSrcweir #include "syspath.hxx"
55cdf0e10cSrcweir #include <osl/file.hxx>
56cdf0e10cSrcweir #include <osl/security.hxx>
57cdf0e10cSrcweir #include "doc.hrc"
58cdf0e10cSrcweir 
59cdf0e10cSrcweir #include <assert.h>
60cdf0e10cSrcweir 
61cdf0e10cSrcweir namespace css = ::com::sun::star;
62cdf0e10cSrcweir using namespace ::com::sun::star;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir //========================================================================
65cdf0e10cSrcweir 
66cdf0e10cSrcweir DECL_PTRARRAY( SfxViewFactoryArr_Impl, SfxViewFactory*, 2, 2 )
67cdf0e10cSrcweir 
68cdf0e10cSrcweir //========================================================================
69cdf0e10cSrcweir 
70cdf0e10cSrcweir DBG_NAME(SfxObjectFactory)
71cdf0e10cSrcweir 
72cdf0e10cSrcweir //static SfxObjectFactoryArr_Impl* pObjFac = 0;
73cdf0e10cSrcweir 
74cdf0e10cSrcweir //========================================================================
75cdf0e10cSrcweir 
76cdf0e10cSrcweir struct SfxObjectFactory_Impl
77cdf0e10cSrcweir {
78cdf0e10cSrcweir 	SfxViewFactoryArr_Impl		aViewFactoryArr;// Liste von <SfxViewFactory>s
79cdf0e10cSrcweir 	SfxFilterArr_Impl			aFilterArr;     // Liste von <SFxFilter>n
80cdf0e10cSrcweir 	ResId*						pNameResId;
81cdf0e10cSrcweir 	::rtl::OUString				aServiceName;
82cdf0e10cSrcweir 	SfxFilterContainer*			pFilterContainer;
83cdf0e10cSrcweir 	SfxModule*					pModule;
84cdf0e10cSrcweir 	sal_uInt16					nImageId;
85cdf0e10cSrcweir 	String						aStandardTemplate;
86cdf0e10cSrcweir 	sal_Bool					bTemplateInitialized;
87cdf0e10cSrcweir 	SvGlobalName				aClassName;
88cdf0e10cSrcweir 
SfxObjectFactory_ImplSfxObjectFactory_Impl89cdf0e10cSrcweir 	SfxObjectFactory_Impl() :
90cdf0e10cSrcweir 		pNameResId			( NULL ),
91cdf0e10cSrcweir 		pFilterContainer	( NULL ),
92cdf0e10cSrcweir 		pModule				( NULL ),
93cdf0e10cSrcweir 		nImageId			( 0 ),
94cdf0e10cSrcweir 		bTemplateInitialized( sal_False )
95cdf0e10cSrcweir 		{}
96cdf0e10cSrcweir };
97cdf0e10cSrcweir 
98cdf0e10cSrcweir //========================================================================
99cdf0e10cSrcweir 
GetFilterContainer(sal_Bool) const100cdf0e10cSrcweir SfxFilterContainer* SfxObjectFactory::GetFilterContainer( sal_Bool /*bForceLoad*/ ) const
101cdf0e10cSrcweir {
102cdf0e10cSrcweir 	return pImpl->pFilterContainer;
103cdf0e10cSrcweir }
104cdf0e10cSrcweir 
105cdf0e10cSrcweir //--------------------------------------------------------------------
106cdf0e10cSrcweir 
SfxObjectFactory(const SvGlobalName & rName,SfxObjectShellFlags nFlagsP,const char * pName)107cdf0e10cSrcweir SfxObjectFactory::SfxObjectFactory
108cdf0e10cSrcweir (
109cdf0e10cSrcweir 	const SvGlobalName& 	rName,
110cdf0e10cSrcweir 	SfxObjectShellFlags 	nFlagsP,
111cdf0e10cSrcweir 	const char*				pName
112cdf0e10cSrcweir ) :    pShortName( pName ),
113cdf0e10cSrcweir        pImpl( new SfxObjectFactory_Impl ),
114cdf0e10cSrcweir        nFlags( nFlagsP )
115cdf0e10cSrcweir {
116cdf0e10cSrcweir 	DBG_CTOR(SfxObjectFactory, 0);
117cdf0e10cSrcweir 	pImpl->pFilterContainer = new SfxFilterContainer( String::CreateFromAscii( pName ) );
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	String aShortName( String::CreateFromAscii( pShortName ) );
120cdf0e10cSrcweir 	aShortName.ToLowerAscii();
121cdf0e10cSrcweir 	pImpl->aClassName = rName;
122cdf0e10cSrcweir 	if ( aShortName.EqualsAscii( "swriter" ) )
123cdf0e10cSrcweir 		pImpl->pNameResId = new SfxResId( STR_DOCTYPENAME_SW );
124cdf0e10cSrcweir 	else if ( aShortName.EqualsAscii( "swriter/web" ) )
125cdf0e10cSrcweir 		pImpl->pNameResId = new SfxResId( STR_DOCTYPENAME_SWWEB );
126cdf0e10cSrcweir 	else if ( aShortName.EqualsAscii( "swriter/globaldocument" ) )
127cdf0e10cSrcweir 		pImpl->pNameResId = new SfxResId( STR_DOCTYPENAME_SWGLOB );
128cdf0e10cSrcweir 	else if ( aShortName.EqualsAscii( "scalc" ) )
129cdf0e10cSrcweir 		pImpl->pNameResId = new SfxResId( STR_DOCTYPENAME_SC );
130cdf0e10cSrcweir 	else if ( aShortName.EqualsAscii( "simpress" ) )
131cdf0e10cSrcweir 		pImpl->pNameResId = new SfxResId( STR_DOCTYPENAME_SI );
132cdf0e10cSrcweir 	else if ( aShortName.EqualsAscii( "sdraw" ) )
133cdf0e10cSrcweir 		pImpl->pNameResId = new SfxResId( STR_DOCTYPENAME_SD );
134cdf0e10cSrcweir 	else if ( aShortName.EqualsAscii( "message" ) )
135cdf0e10cSrcweir 		pImpl->pNameResId = new SfxResId( STR_DOCTYPENAME_MESSAGE );
136cdf0e10cSrcweir }
137cdf0e10cSrcweir 
138cdf0e10cSrcweir //--------------------------------------------------------------------
139cdf0e10cSrcweir 
~SfxObjectFactory()140cdf0e10cSrcweir SfxObjectFactory::~SfxObjectFactory()
141cdf0e10cSrcweir {
142cdf0e10cSrcweir 	DBG_DTOR(SfxObjectFactory, 0);
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	const sal_uInt16 nCount = pImpl->aFilterArr.Count();
145cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nCount; ++i )
146cdf0e10cSrcweir 		delete pImpl->aFilterArr[i];
147cdf0e10cSrcweir 	delete pImpl->pNameResId;
148cdf0e10cSrcweir 	delete pImpl;
149cdf0e10cSrcweir }
150cdf0e10cSrcweir 
151cdf0e10cSrcweir //--------------------------------------------------------------------
152cdf0e10cSrcweir 
RegisterViewFactory(SfxViewFactory & rFactory)153cdf0e10cSrcweir void SfxObjectFactory::RegisterViewFactory
154cdf0e10cSrcweir (
155cdf0e10cSrcweir 	SfxViewFactory &rFactory
156cdf0e10cSrcweir )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
159cdf0e10cSrcweir     {
160cdf0e10cSrcweir         const String sViewName( rFactory.GetAPIViewName() );
161cdf0e10cSrcweir 	    for ( sal_uInt16 i = 0; i < pImpl->aViewFactoryArr.Count(); ++i )
162cdf0e10cSrcweir         {
163cdf0e10cSrcweir             if ( !pImpl->aViewFactoryArr[i]->GetAPIViewName().Equals( sViewName ) )
164cdf0e10cSrcweir                 continue;
165cdf0e10cSrcweir             ByteString sMessage( "SfxObjectFactory::RegisterViewFactory: duplicate view name '" );
166cdf0e10cSrcweir             sMessage += ByteString( sViewName, RTL_TEXTENCODING_ASCII_US );
167cdf0e10cSrcweir             sMessage += "'!";
168cdf0e10cSrcweir             OSL_ENSURE( false, sMessage.GetBuffer() );
169cdf0e10cSrcweir             break;
170cdf0e10cSrcweir         }
171cdf0e10cSrcweir     }
172cdf0e10cSrcweir #endif
173cdf0e10cSrcweir 	sal_uInt16 nPos;
174cdf0e10cSrcweir 	for ( nPos = 0;
175cdf0e10cSrcweir 		  nPos < pImpl->aViewFactoryArr.Count() &&
176cdf0e10cSrcweir 		  pImpl->aViewFactoryArr[nPos]->GetOrdinal() <= rFactory.GetOrdinal();
177cdf0e10cSrcweir 		  ++nPos )
178cdf0e10cSrcweir 	/* empty loop */;
179cdf0e10cSrcweir 	pImpl->aViewFactoryArr.Insert(nPos, &rFactory);
180cdf0e10cSrcweir }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir //--------------------------------------------------------------------
183cdf0e10cSrcweir 
GetViewFactoryCount() const184cdf0e10cSrcweir sal_uInt16 SfxObjectFactory::GetViewFactoryCount() const
185cdf0e10cSrcweir {
186cdf0e10cSrcweir 	return pImpl->aViewFactoryArr.Count();
187cdf0e10cSrcweir }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir //--------------------------------------------------------------------
190cdf0e10cSrcweir 
GetViewFactory(sal_uInt16 i) const191cdf0e10cSrcweir SfxViewFactory& SfxObjectFactory::GetViewFactory(sal_uInt16 i) const
192cdf0e10cSrcweir {
193cdf0e10cSrcweir 	return *pImpl->aViewFactoryArr[i];
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
196cdf0e10cSrcweir //--------------------------------------------------------------------
197cdf0e10cSrcweir 
GetModule() const198cdf0e10cSrcweir SfxModule* SfxObjectFactory::GetModule() const
199cdf0e10cSrcweir {
200cdf0e10cSrcweir 	return pImpl->pModule;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
SetModule_Impl(SfxModule * pMod)203cdf0e10cSrcweir void SfxObjectFactory::SetModule_Impl( SfxModule *pMod )
204cdf0e10cSrcweir {
205cdf0e10cSrcweir 	pImpl->pModule = pMod;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
SetSystemTemplate(const String & rServiceName,const String & rTemplateName)208cdf0e10cSrcweir void SfxObjectFactory::SetSystemTemplate( const String& rServiceName, const String& rTemplateName )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir     static const int nMaxPathSize = 16000;
211cdf0e10cSrcweir 	static ::rtl::OUString SERVICE_FILTER_FACTORY = ::rtl::OUString::createFromAscii( "com.sun.star.document.FilterFactory" );
212cdf0e10cSrcweir 	static ::rtl::OUString SERVICE_TYPE_DECTECTION = ::rtl::OUString::createFromAscii( "com.sun.star.document.TypeDetection" );
213cdf0e10cSrcweir 	static ::rtl::OUString SERVICE_SIMPLE_ACCESS = ::rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" );
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 	static ::rtl::OUString CONF_ROOT  = ::rtl::OUString::createFromAscii( "/org.openoffice.Setup");
216cdf0e10cSrcweir 	static ::rtl::OUString CONF_PATH  = ::rtl::OUString::createFromAscii( "Office/Factories/" ) + ::rtl::OUString( rServiceName );
217cdf0e10cSrcweir 	static ::rtl::OUString PROP_DEF_TEMPL_CHANGED  = ::rtl::OUString::createFromAscii( "ooSetupFactorySystemDefaultTemplateChanged" );
218cdf0e10cSrcweir 	static ::rtl::OUString PROP_ACTUAL_FILTER  = ::rtl::OUString::createFromAscii( "ooSetupFactoryActualFilter" );
219cdf0e10cSrcweir 
220cdf0e10cSrcweir 	static ::rtl::OUString DEF_TPL_STR = ::rtl::OUString::createFromAscii("/soffice.");
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 	String      sURL;
223cdf0e10cSrcweir     String      sPath;
224cdf0e10cSrcweir     sal_Unicode aPathBuffer[nMaxPathSize];
225cdf0e10cSrcweir     if ( SystemPath::GetUserTemplateLocation( aPathBuffer, nMaxPathSize ))
226cdf0e10cSrcweir         sPath = String( aPathBuffer );
227cdf0e10cSrcweir 	::utl::LocalFileHelper::ConvertPhysicalNameToURL( sPath, sURL );
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 	::rtl::OUString aUserTemplateURL( sURL );
230cdf0e10cSrcweir 	if ( aUserTemplateURL.getLength() != 0)
231cdf0e10cSrcweir 	{
232cdf0e10cSrcweir 		try
233cdf0e10cSrcweir 		{
234cdf0e10cSrcweir 			uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
235cdf0e10cSrcweir 			uno::Reference< uno::XInterface > xConfig = ::comphelper::ConfigurationHelper::openConfig(
236cdf0e10cSrcweir 				xFactory, CONF_ROOT, ::comphelper::ConfigurationHelper::E_STANDARD );
237cdf0e10cSrcweir 
238cdf0e10cSrcweir 			::rtl::OUString aActualFilter;
239cdf0e10cSrcweir 			::comphelper::ConfigurationHelper::readRelativeKey( xConfig, CONF_PATH, PROP_ACTUAL_FILTER ) >>= aActualFilter;
240cdf0e10cSrcweir 			sal_Bool bChanged(sal_False);
241cdf0e10cSrcweir 			::comphelper::ConfigurationHelper::readRelativeKey( xConfig, CONF_PATH, PROP_DEF_TEMPL_CHANGED ) >>= bChanged;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 			uno::Reference< container::XNameAccess > xFilterFactory(
244cdf0e10cSrcweir 				xFactory->createInstance( SERVICE_FILTER_FACTORY ), uno::UNO_QUERY_THROW );
245cdf0e10cSrcweir 			uno::Reference< container::XNameAccess > xTypeDetection(
246cdf0e10cSrcweir 				xFactory->createInstance( SERVICE_TYPE_DECTECTION ), uno::UNO_QUERY_THROW );
247cdf0e10cSrcweir 
248cdf0e10cSrcweir 			::rtl::OUString aActualFilterTypeName;
249cdf0e10cSrcweir 			uno::Sequence< beans::PropertyValue > aActuralFilterData;
250cdf0e10cSrcweir 			xFilterFactory->getByName( aActualFilter ) >>= aActuralFilterData;
251cdf0e10cSrcweir 			for ( sal_Int32 nInd = 0; nInd < aActuralFilterData.getLength(); nInd++ )
252cdf0e10cSrcweir 				if ( aActuralFilterData[nInd].Name.equalsAscii( "Type" ) )
253cdf0e10cSrcweir 					aActuralFilterData[nInd].Value >>= aActualFilterTypeName;
254cdf0e10cSrcweir 			::comphelper::SequenceAsHashMap aProps1( xTypeDetection->getByName( aActualFilterTypeName ) );
255cdf0e10cSrcweir 			uno::Sequence< ::rtl::OUString > aAllExt =
256cdf0e10cSrcweir 				aProps1.getUnpackedValueOrDefault( ::rtl::OUString::createFromAscii( "Extensions" ), uno::Sequence< ::rtl::OUString >() );
257cdf0e10cSrcweir 			//To-do: check if aAllExt is empty first
258cdf0e10cSrcweir 			::rtl::OUString aExt = aAllExt[0];
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 			aUserTemplateURL += DEF_TPL_STR;
261cdf0e10cSrcweir 			aUserTemplateURL += aExt;
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 			uno::Reference< ucb::XSimpleFileAccess > xSimpleFileAccess(
264cdf0e10cSrcweir 				xFactory->createInstance( SERVICE_SIMPLE_ACCESS ), uno::UNO_QUERY_THROW );
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 			::rtl::OUString aBackupURL;
267cdf0e10cSrcweir 			::osl::Security().getConfigDir(aBackupURL);
268cdf0e10cSrcweir 			aBackupURL += ::rtl::OUString::createFromAscii( "/temp" );
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 			if ( !xSimpleFileAccess->exists( aBackupURL ) )
271cdf0e10cSrcweir 				xSimpleFileAccess->createFolder( aBackupURL );
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 			aBackupURL += DEF_TPL_STR;
274cdf0e10cSrcweir 			aBackupURL += aExt;
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 			if ( rTemplateName.Len() != 0 )
277cdf0e10cSrcweir 			{
278cdf0e10cSrcweir 				if ( xSimpleFileAccess->exists( aUserTemplateURL ) && !bChanged )
279cdf0e10cSrcweir 					xSimpleFileAccess->copy( aUserTemplateURL, aBackupURL );
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 				uno::Reference< document::XTypeDetection > xTypeDetector( xTypeDetection, uno::UNO_QUERY );
282cdf0e10cSrcweir 				::comphelper::SequenceAsHashMap aProps2( xTypeDetection->getByName( xTypeDetector->queryTypeByURL( rTemplateName ) ) );
283cdf0e10cSrcweir 				::rtl::OUString aFilterName =
284cdf0e10cSrcweir 					aProps2.getUnpackedValueOrDefault( ::rtl::OUString::createFromAscii("PreferredFilter"), ::rtl::OUString() );
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 				uno::Sequence< beans::PropertyValue > aArgs( 3 );
287cdf0e10cSrcweir 				aArgs[0].Name = ::rtl::OUString::createFromAscii( "FilterName" );
288cdf0e10cSrcweir 				aArgs[0].Value <<= aFilterName;
289cdf0e10cSrcweir 				aArgs[1].Name = ::rtl::OUString::createFromAscii( "AsTemplate" );
290cdf0e10cSrcweir 				aArgs[1].Value <<= sal_True;
291cdf0e10cSrcweir 				aArgs[2].Name = ::rtl::OUString::createFromAscii( "URL" );
292cdf0e10cSrcweir 				aArgs[2].Value <<= ::rtl::OUString( rTemplateName );
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 				uno::Reference< frame::XLoadable > xLoadable( xFactory->createInstance( ::rtl::OUString( rServiceName ) ), uno::UNO_QUERY );
295cdf0e10cSrcweir 				xLoadable->load( aArgs );
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 				aArgs.realloc( 2 );
298cdf0e10cSrcweir 				aArgs[1].Name = ::rtl::OUString::createFromAscii( "Overwrite" );
299cdf0e10cSrcweir 				aArgs[1].Value <<= sal_True;
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 				uno::Reference< frame::XStorable > xStorable( xLoadable, uno::UNO_QUERY );
302cdf0e10cSrcweir 				xStorable->storeToURL( aUserTemplateURL, aArgs );
303cdf0e10cSrcweir 				::comphelper::ConfigurationHelper::writeRelativeKey( xConfig, CONF_PATH, PROP_DEF_TEMPL_CHANGED, uno::makeAny( sal_True ));
304cdf0e10cSrcweir 				::comphelper::ConfigurationHelper::flush( xConfig );
305cdf0e10cSrcweir 			}
306cdf0e10cSrcweir 			else
307cdf0e10cSrcweir 			{
308cdf0e10cSrcweir 				DBG_ASSERT( bChanged, "invalid ooSetupFactorySystemDefaultTemplateChanged value!" );
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 				xSimpleFileAccess->copy( aBackupURL, aUserTemplateURL );
311cdf0e10cSrcweir 				xSimpleFileAccess->kill( aBackupURL );
312cdf0e10cSrcweir 				::comphelper::ConfigurationHelper::writeRelativeKey( xConfig, CONF_PATH, PROP_DEF_TEMPL_CHANGED, uno::makeAny( sal_False ));
313cdf0e10cSrcweir 				::comphelper::ConfigurationHelper::flush( xConfig );
314cdf0e10cSrcweir 			}
315cdf0e10cSrcweir 		}
316cdf0e10cSrcweir 		catch( uno::Exception& )
317cdf0e10cSrcweir 		{
318cdf0e10cSrcweir 		}
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
SetStandardTemplate(const String & rServiceName,const String & rTemplate)322cdf0e10cSrcweir void SfxObjectFactory::SetStandardTemplate( const String& rServiceName, const String& rTemplate )
323cdf0e10cSrcweir {
324cdf0e10cSrcweir 	SvtModuleOptions::EFactory eFac = SvtModuleOptions::ClassifyFactoryByServiceName(rServiceName);
325cdf0e10cSrcweir     if (eFac == SvtModuleOptions::E_UNKNOWN_FACTORY)
326cdf0e10cSrcweir         eFac = SvtModuleOptions::ClassifyFactoryByShortName(rServiceName);
327cdf0e10cSrcweir     if (eFac != SvtModuleOptions::E_UNKNOWN_FACTORY)
328cdf0e10cSrcweir 	{
329cdf0e10cSrcweir 		SetSystemTemplate( rServiceName, rTemplate );
330cdf0e10cSrcweir 		SvtModuleOptions().SetFactoryStandardTemplate(eFac, rTemplate);
331cdf0e10cSrcweir 	}
332cdf0e10cSrcweir }
333cdf0e10cSrcweir 
GetStandardTemplate(const String & rServiceName)334cdf0e10cSrcweir String SfxObjectFactory::GetStandardTemplate( const String& rServiceName )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir 	SvtModuleOptions::EFactory eFac = SvtModuleOptions::ClassifyFactoryByServiceName(rServiceName);
337cdf0e10cSrcweir     if (eFac == SvtModuleOptions::E_UNKNOWN_FACTORY)
338cdf0e10cSrcweir         eFac = SvtModuleOptions::ClassifyFactoryByShortName(rServiceName);
339cdf0e10cSrcweir 
340cdf0e10cSrcweir     String sTemplate;
341cdf0e10cSrcweir     if (eFac != SvtModuleOptions::E_UNKNOWN_FACTORY)
342cdf0e10cSrcweir         sTemplate = SvtModuleOptions().GetFactoryStandardTemplate(eFac);
343cdf0e10cSrcweir 
344cdf0e10cSrcweir 	return sTemplate;
345cdf0e10cSrcweir }
346cdf0e10cSrcweir 
347cdf0e10cSrcweir /*
348cdf0e10cSrcweir const SfxObjectFactory* SfxObjectFactory::GetFactory( const String& rFactoryURL )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir 	const SfxObjectFactory* pFactory = 0;
351cdf0e10cSrcweir 	String aFact( rFactoryURL );
352cdf0e10cSrcweir 	String aPrefix( DEFINE_CONST_UNICODE( "private:factory/" ) );
353cdf0e10cSrcweir 	if ( aPrefix.Len() == aFact.Match( aPrefix ) )
354cdf0e10cSrcweir 		// Aufruf m"oglich mit z.B. "swriter" oder "private:factory/swriter"
355cdf0e10cSrcweir 		aFact.Erase( 0, aPrefix.Len() );
356cdf0e10cSrcweir 	sal_uInt16 nPos = aFact.Search( '?' );
357cdf0e10cSrcweir 
358cdf0e10cSrcweir 	// Etwaige Parameter abschneiden
359cdf0e10cSrcweir 	aFact.Erase( nPos, aFact.Len() );
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 	SfxApplication *pApp = SFX_APP();
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 	// "swriter4" durch "swriter" ersetzen, zum Vergleichen uppercase verwenden
364cdf0e10cSrcweir 	WildCard aSearchedFac( aFact.EraseAllChars('4').ToUpperAscii() );
365cdf0e10cSrcweir     for( sal_uInt16 n = GetObjectFactoryCount_Impl(); !pFactory && n--; )
366cdf0e10cSrcweir 	{
367cdf0e10cSrcweir         pFactory = &GetObjectFactory_Impl( n );
368cdf0e10cSrcweir 		String aCompareTo = String::CreateFromAscii( pFactory->GetShortName() );
369cdf0e10cSrcweir 		aCompareTo.ToUpperAscii();
370cdf0e10cSrcweir 		if( !aSearchedFac.Matches( aCompareTo ) )
371cdf0e10cSrcweir 			pFactory = 0;
372cdf0e10cSrcweir 	}
373cdf0e10cSrcweir 
374cdf0e10cSrcweir 	return pFactory;
375cdf0e10cSrcweir }
376cdf0e10cSrcweir */
377cdf0e10cSrcweir 
GetTemplateFilter() const378cdf0e10cSrcweir const SfxFilter* SfxObjectFactory::GetTemplateFilter() const
379cdf0e10cSrcweir {
380cdf0e10cSrcweir 	sal_uInt16 nVersion=0;
381cdf0e10cSrcweir 	SfxFilterMatcher aMatcher ( String::CreateFromAscii( pShortName ) );
382cdf0e10cSrcweir 	SfxFilterMatcherIter aIter( &aMatcher );
383cdf0e10cSrcweir 	const SfxFilter *pFilter = 0;
384cdf0e10cSrcweir 	const SfxFilter *pTemp = aIter.First();
385cdf0e10cSrcweir 	while ( pTemp )
386cdf0e10cSrcweir 	{
387cdf0e10cSrcweir 		if( pTemp->IsOwnFormat() && pTemp->IsOwnTemplateFormat() && ( pTemp->GetVersion() > nVersion ) )
388cdf0e10cSrcweir 		{
389cdf0e10cSrcweir 			pFilter = pTemp;
390cdf0e10cSrcweir 			nVersion = (sal_uInt16) pTemp->GetVersion();
391cdf0e10cSrcweir 		}
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 		pTemp = aIter.Next();
394cdf0e10cSrcweir 	}
395cdf0e10cSrcweir 
396cdf0e10cSrcweir 	return pFilter;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir 
SetDocumentTypeNameResource(const ResId & rId)399cdf0e10cSrcweir void SfxObjectFactory::SetDocumentTypeNameResource( const ResId& rId )
400cdf0e10cSrcweir {
401cdf0e10cSrcweir 	DBG_ASSERT( !pImpl->pNameResId, "UI-Namensresource mehrfach gesetzt!" );
402cdf0e10cSrcweir 	pImpl->pNameResId = new ResId( rId );
403cdf0e10cSrcweir }
404cdf0e10cSrcweir 
GetDocumentTypeName() const405cdf0e10cSrcweir String SfxObjectFactory::GetDocumentTypeName() const
406cdf0e10cSrcweir {
407cdf0e10cSrcweir 	if ( pImpl->pNameResId )
408cdf0e10cSrcweir 		return String( *pImpl->pNameResId );
409cdf0e10cSrcweir 	return String();
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
SetDocumentServiceName(const::rtl::OUString & rServiceName)412cdf0e10cSrcweir void SfxObjectFactory::SetDocumentServiceName( const ::rtl::OUString& rServiceName )
413cdf0e10cSrcweir {
414cdf0e10cSrcweir 	pImpl->aServiceName = rServiceName;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
GetDocumentServiceName() const417cdf0e10cSrcweir const ::rtl::OUString& SfxObjectFactory::GetDocumentServiceName() const
418cdf0e10cSrcweir {
419cdf0e10cSrcweir 	return pImpl->aServiceName;
420cdf0e10cSrcweir }
421cdf0e10cSrcweir 
GetClassId() const422cdf0e10cSrcweir const SvGlobalName& SfxObjectFactory::GetClassId() const
423cdf0e10cSrcweir {
424cdf0e10cSrcweir 	return pImpl->aClassName;
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
GetFactoryURL() const427cdf0e10cSrcweir String SfxObjectFactory::GetFactoryURL() const
428cdf0e10cSrcweir {
429cdf0e10cSrcweir     ::rtl::OUStringBuffer aURLComposer;
430cdf0e10cSrcweir     aURLComposer.appendAscii( "private:factory/" );
431cdf0e10cSrcweir     aURLComposer.appendAscii( GetShortName() );
432cdf0e10cSrcweir     return aURLComposer.makeStringAndClear();
433cdf0e10cSrcweir }
434cdf0e10cSrcweir 
GetModuleName() const435cdf0e10cSrcweir String SfxObjectFactory::GetModuleName() const
436cdf0e10cSrcweir {
437cdf0e10cSrcweir     static ::rtl::OUString SERVICENAME_MODULEMANAGER = ::rtl::OUString::createFromAscii("com.sun.star.frame.ModuleManager");
438cdf0e10cSrcweir     static ::rtl::OUString PROP_MODULEUINAME         = ::rtl::OUString::createFromAscii("ooSetupFactoryUIName");
439cdf0e10cSrcweir 
440cdf0e10cSrcweir     try
441cdf0e10cSrcweir     {
442cdf0e10cSrcweir         css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory();
443cdf0e10cSrcweir 
444cdf0e10cSrcweir         css::uno::Reference< css::container::XNameAccess > xModuleManager(
445cdf0e10cSrcweir             xSMGR->createInstance(SERVICENAME_MODULEMANAGER),
446cdf0e10cSrcweir             css::uno::UNO_QUERY_THROW);
447cdf0e10cSrcweir 
448cdf0e10cSrcweir         ::rtl::OUString sDocService(GetDocumentServiceName());
449cdf0e10cSrcweir         ::comphelper::SequenceAsHashMap aPropSet( xModuleManager->getByName(sDocService) );
450cdf0e10cSrcweir         ::rtl::OUString sModuleName = aPropSet.getUnpackedValueOrDefault(PROP_MODULEUINAME, ::rtl::OUString());
451cdf0e10cSrcweir         return String(sModuleName);
452cdf0e10cSrcweir     }
453cdf0e10cSrcweir     catch(const css::uno::RuntimeException&)
454cdf0e10cSrcweir         { throw; }
455cdf0e10cSrcweir     catch(const css::uno::Exception&)
456cdf0e10cSrcweir         {}
457cdf0e10cSrcweir 
458cdf0e10cSrcweir     return String();
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir 
GetViewNo_Impl(const sal_uInt16 i_nViewId,const sal_uInt16 i_nFallback) const462cdf0e10cSrcweir sal_uInt16 SfxObjectFactory::GetViewNo_Impl( const sal_uInt16 i_nViewId, const sal_uInt16 i_nFallback ) const
463cdf0e10cSrcweir {
464cdf0e10cSrcweir     for ( sal_uInt16 curViewNo = 0; curViewNo < GetViewFactoryCount(); ++curViewNo )
465cdf0e10cSrcweir     {
466cdf0e10cSrcweir         const sal_uInt16 curViewId = GetViewFactory( curViewNo ).GetOrdinal();
467cdf0e10cSrcweir         if ( i_nViewId == curViewId )
468cdf0e10cSrcweir            return curViewNo;
469cdf0e10cSrcweir     }
470cdf0e10cSrcweir     return i_nFallback;
471cdf0e10cSrcweir }
472cdf0e10cSrcweir 
GetViewFactoryByViewName(const String & i_rViewName) const473cdf0e10cSrcweir SfxViewFactory* SfxObjectFactory::GetViewFactoryByViewName( const String& i_rViewName ) const
474cdf0e10cSrcweir {
475cdf0e10cSrcweir     for (   sal_uInt16 nViewNo = 0;
476cdf0e10cSrcweir             nViewNo < GetViewFactoryCount();
477cdf0e10cSrcweir             ++nViewNo
478cdf0e10cSrcweir         )
479cdf0e10cSrcweir     {
480cdf0e10cSrcweir         SfxViewFactory& rViewFac( GetViewFactory( nViewNo ) );
481cdf0e10cSrcweir         if  (   ( rViewFac.GetAPIViewName() == i_rViewName )
482cdf0e10cSrcweir             ||  ( rViewFac.GetLegacyViewName() == i_rViewName )
483cdf0e10cSrcweir             )
484cdf0e10cSrcweir             return &rViewFac;
485cdf0e10cSrcweir     }
486cdf0e10cSrcweir     return NULL;
487cdf0e10cSrcweir }
488