1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: frmload.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sfx2.hxx"
34 #include "frmload.hxx"
36 #include <framework/interaction.hxx>
37 #include <com/sun/star/frame/XLoadable.hpp>
38 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
39 #include <com/sun/star/container/XContainerQuery.hpp>
40 #include <com/sun/star/beans/PropertyValue.hpp>
41 #include <com/sun/star/frame/XFrame.hpp>
42 #include <com/sun/star/frame/XModel.hpp>
43 #include <com/sun/star/awt/XWindow.hpp>
44 #include <com/sun/star/lang/XUnoTunnel.hpp>
45 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
46 #include <comphelper/processfactory.hxx>
48 #include <com/sun/star/beans/PropertyValue.hpp>
49 #include <com/sun/star/container/XNameAccess.hpp>
50 #include <com/sun/star/io/XInputStream.hpp>
51 #include <com/sun/star/task/XInteractionHandler.hpp>
52 #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
53 #include <com/sun/star/ucb/CommandAbortedException.hpp>
54 #include <com/sun/star/ucb/InteractiveAppException.hpp>
55 #include <com/sun/star/document/XTypeDetection.hpp>
56 #include <framework/interaction.hxx>
58 #ifndef _TOOLKIT_UNOHLP_HXX
59 #include <toolkit/helper/vclunohelper.hxx>
61 #include <ucbhelper/simpleinteractionrequest.hxx>
63 #include <rtl/ustring.h>
64 #include <rtl/logfile.hxx>
65 #include <svtools/itemset.hxx>
66 #include <vcl/window.hxx>
67 #include <svtools/eitem.hxx>
68 #include <svtools/stritem.hxx>
69 #include <tools/urlobj.hxx>
70 #include <vos/mutex.hxx>
71 #include <svtools/sfxecode.hxx>
72 #include <svtools/ehdl.hxx>
73 #include <sot/storinfo.hxx>
74 #include <comphelper/sequenceashashmap.hxx>
75 #include <comphelper/mediadescriptor.hxx>
76 #include <svtools/moduleoptions.hxx>
79 namespace css
= ::com::sun::star
;
82 #include <sfx2/doctempl.hxx>
83 #include <sfx2/app.hxx>
84 #include <sfx2/request.hxx>
85 #include <sfx2/sfxsids.hrc>
86 #include <sfx2/dispatch.hxx>
87 #include <sfx2/sfxuno.hxx>
88 #include <sfx2/viewfrm.hxx>
89 #include <sfx2/topfrm.hxx>
90 #include <sfx2/frame.hxx>
91 #include <sfx2/docfac.hxx>
92 #include <sfx2/fcontnr.hxx>
93 #include <sfx2/docfile.hxx>
94 #include <sfx2/docfilt.hxx>
95 #include "brokenpackageint.hxx"
96 #include "objshimp.hxx"
98 SfxFrameLoader_Impl::SfxFrameLoader_Impl( const css::uno::Reference
< css::lang::XMultiServiceFactory
>& /*xFactory*/ )
102 SfxFrameLoader_Impl::~SfxFrameLoader_Impl()
106 const SfxFilter
* impl_detectFilterForURL(const ::rtl::OUString
& sURL
,
107 const css::uno::Sequence
< css::beans::PropertyValue
>& rArgs
,
108 const SfxFilterMatcher
& rMatcher
)
110 static ::rtl::OUString SERVICENAME_TYPEDETECTION
= ::rtl::OUString::createFromAscii("com.sun.star.document.TypeDetection");
112 ::rtl::OUString sFilter
;
115 if (!sURL
.getLength())
118 css::uno::Reference
< css::lang::XMultiServiceFactory
> xSMGR
= ::comphelper::getProcessServiceFactory();
122 css::uno::Reference
< css::document::XTypeDetection
> xDetect(
123 xSMGR
->createInstance(SERVICENAME_TYPEDETECTION
),
124 css::uno::UNO_QUERY_THROW
);
126 ::comphelper::MediaDescriptor
lOrgArgs(rArgs
);
127 css::uno::Reference
< css::task::XInteractionHandler
> xInteraction
= lOrgArgs
.getUnpackedValueOrDefault(
128 ::comphelper::MediaDescriptor::PROP_INTERACTIONHANDLER(),
129 css::uno::Reference
< css::task::XInteractionHandler
>());
130 css::uno::Reference
< css::task::XStatusIndicator
> xProgress
= lOrgArgs
.getUnpackedValueOrDefault(
131 ::comphelper::MediaDescriptor::PROP_STATUSINDICATOR(),
132 css::uno::Reference
< css::task::XStatusIndicator
>());
134 ::comphelper::SequenceAsHashMap lNewArgs
;
135 lNewArgs
[::comphelper::MediaDescriptor::PROP_URL()] <<= sURL
;
136 if (xInteraction
.is())
137 lNewArgs
[::comphelper::MediaDescriptor::PROP_INTERACTIONHANDLER()] <<= xInteraction
;
139 lNewArgs
[::comphelper::MediaDescriptor::PROP_STATUSINDICATOR()] <<= xProgress
;
141 css::uno::Sequence
< css::beans::PropertyValue
> lDescr
= lNewArgs
.getAsConstPropertyValueList();
142 ::rtl::OUString sType
= xDetect
->queryTypeByDescriptor(lDescr
, sal_True
);
143 if (sType
.getLength())
145 const SfxFilter
* pFilter
= rMatcher
.GetFilter4EA(sType
);
147 sFilter
= pFilter
->GetName();
150 catch(const css::uno::RuntimeException
& exRun
)
152 catch(const css::uno::Exception
&)
153 { sFilter
= ::rtl::OUString(); }
155 const SfxFilter
* pFilter
= 0;
156 if (sFilter
.getLength())
157 pFilter
= rMatcher
.GetFilter4FilterName(sFilter
);
161 sal_Bool SAL_CALL
SfxFrameLoader_Impl::load( const css::uno::Sequence
< css::beans::PropertyValue
>& rArgs
,
162 const css::uno::Reference
< css::frame::XFrame
>& rFrame
)
163 throw( css::uno::RuntimeException
)
165 static ::rtl::OUString PROP_URL
= ::rtl::OUString::createFromAscii("URL" );
166 static ::rtl::OUString PROP_FILENAME
= ::rtl::OUString::createFromAscii("FileName" );
167 static ::rtl::OUString PROP_TYPENAME
= ::rtl::OUString::createFromAscii("TypeName" );
168 static ::rtl::OUString PROP_FILTERNAME
= ::rtl::OUString::createFromAscii("FilterName" );
169 static ::rtl::OUString PROP_MODEL
= ::rtl::OUString::createFromAscii("Model" );
170 static ::rtl::OUString PROP_DOCUMENTSERVICE
= ::rtl::OUString::createFromAscii("DocumentService" );
171 static ::rtl::OUString PROP_READONLY
= ::rtl::OUString::createFromAscii("ReadOnly" );
172 static ::rtl::OUString PROP_ASTEMPLATE
= ::rtl::OUString::createFromAscii("AsTemplate" );
173 static ::rtl::OUString PROP_INTERACTIONHANDLER
= ::rtl::OUString::createFromAscii("InteractionHandler");
175 sal_Bool bLoadState
= sal_False
;
177 // this methods assumes that the filter is detected before, usually by calling the detect() method below
178 ::vos::OGuard
aGuard( Application::GetSolarMutex() );
180 RTL_LOGFILE_CONTEXT( aLog
, "sfx2 (mb93783) ::SfxFrameLoader::load" );
185 ::comphelper::SequenceAsHashMap
lDescriptor(rArgs
);
186 String rURL
= lDescriptor
.getUnpackedValueOrDefault(PROP_URL
, ::rtl::OUString() );
187 String aTypeName
= lDescriptor
.getUnpackedValueOrDefault(PROP_TYPENAME
, ::rtl::OUString() );
188 aFilterName
= lDescriptor
.getUnpackedValueOrDefault(PROP_FILTERNAME
, ::rtl::OUString() );
189 String aServiceName
= lDescriptor
.getUnpackedValueOrDefault(PROP_DOCUMENTSERVICE
, ::rtl::OUString() );
190 css::uno::Reference
< css::task::XInteractionHandler
> xInteraction
= lDescriptor
.getUnpackedValueOrDefault(PROP_INTERACTIONHANDLER
, css::uno::Reference
< css::task::XInteractionHandler
>());
191 css::uno::Reference
< css::frame::XModel
> xModel
= lDescriptor
.getUnpackedValueOrDefault(PROP_MODEL
, css::uno::Reference
< css::frame::XModel
>() );
193 const SfxFilter
* pFilter
= NULL
;
194 const SfxFilterMatcher
& rMatcher
= SFX_APP()->GetFilterMatcher();
196 /* special mode: use already loaded model ...
197 In such case no filter name will be selected and no URL will be given!
198 Such informations are not neccessary. We have to create a new view only
199 and call setComponent() at the corresponding frame. */
203 // get filter by its name directly ...
204 if( aFilterName
.Len() )
205 pFilter
= rMatcher
.GetFilter4FilterName( aFilterName
);
207 // or search the preferred filter for the detected type ...
208 if( !pFilter
&& aTypeName
.Len() )
209 pFilter
= rMatcher
.GetFilter4EA(aTypeName
);
211 // or use given document service for detection too!
212 if (!pFilter
&& aServiceName
.Len())
214 ::comphelper::SequenceAsHashMap lQuery
;
216 if (aServiceName
.Len())
217 lQuery
[::rtl::OUString::createFromAscii("DocumentService")] <<= ::rtl::OUString(aServiceName
);
219 ::com::sun::star::uno::Reference
< ::com::sun::star::lang::XMultiServiceFactory
> xServiceManager
= ::comphelper::getProcessServiceFactory();
220 ::com::sun::star::uno::Reference
< ::com::sun::star::container::XContainerQuery
> xQuery ( xServiceManager
->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.document.FilterFactory" ) ), ::com::sun::star::uno::UNO_QUERY
);
222 SfxFilterFlags nMust
= SFX_FILTER_IMPORT
;
223 SfxFilterFlags nDont
= SFX_FILTER_NOTINSTALLED
;
225 ::com::sun::star::uno::Reference
< com::sun::star::container::XEnumeration
> xEnum
= xQuery
->createSubSetEnumerationByProperties(lQuery
.getAsConstNamedValueList());
226 while ( xEnum
->hasMoreElements() )
228 ::comphelper::SequenceAsHashMap
aType( xEnum
->nextElement() );
229 aFilterName
= aType
.getUnpackedValueOrDefault(::rtl::OUString::createFromAscii("Name"), ::rtl::OUString());
230 if (!aFilterName
.Len())
232 pFilter
= rMatcher
.GetFilter4FilterName(aFilterName
);
235 SfxFilterFlags nFlags
= pFilter
->GetFilterFlags();
237 ((nFlags
& nMust
) == nMust
) &&
243 pFilter
= 0; //! in case we reach end of enumeration we must have a valid value ...
247 // or use interaction to ask user for right filter.
248 if ( !pFilter
&& xInteraction
.is() && rURL
.Len() )
250 ::framework::RequestFilterSelect
* pRequest
= new ::framework::RequestFilterSelect( rURL
);
251 css::uno::Reference
< css::task::XInteractionRequest
> xRequest ( pRequest
);
252 xInteraction
->handle( xRequest
);
253 if( !pRequest
->isAbort() )
255 aFilterName
= pRequest
->getFilter();
256 pFilter
= rMatcher
.GetFilter4FilterName( aFilterName
);
263 aTypeName
= pFilter
->GetTypeName();
264 // use filter names without prefix
265 aFilterName
= pFilter
->GetFilterName();
267 // If detected filter indicates using of an own template format
268 // add property "AsTemplate" to descriptor. But supress this step
269 // if such property already exists.
270 if( pFilter
->IsOwnTemplateFormat())
272 ::comphelper::SequenceAsHashMap::iterator pIt
= lDescriptor
.find(PROP_ASTEMPLATE
);
273 if (pIt
== lDescriptor
.end())
274 lDescriptor
[PROP_ASTEMPLATE
] <<= sal_True
;
280 // Achtung: beim Abraeumen der Objekte kann die SfxApp destruiert werden, vorher noch Deinitialize_Impl rufen
281 SfxApplication
* pApp
= SFX_APP();
283 // Attention! Because lDescriptor is a copy of rArgs
284 // and was might by changed (e.g. for AsTemplate)
285 // move all changes there back!
286 SfxAllItemSet
aSet( pApp
->GetPool() );
287 TransformParameters( SID_OPENDOC
, lDescriptor
.getAsConstPropertyValueList(), aSet
);
289 SFX_ITEMSET_ARG( &aSet
, pRefererItem
, SfxStringItem
, SID_REFERER
, FALSE
);
291 aSet
.Put( SfxStringItem( SID_REFERER
, String() ) );
294 for ( pFrame
= SfxFrame::GetFirst(); pFrame
; pFrame
= SfxFrame::GetNext( *pFrame
) )
296 if ( pFrame
->GetFrameInterface() == xFrame
)
300 BOOL bFrameCreated
= FALSE
;
303 pFrame
= SfxTopFrame::Create( rFrame
);
304 bFrameCreated
= TRUE
;
309 // !TODO: replace by ViewFactory
310 if ( pFrame
->GetFrameInterface()->getController().is() )
312 // remove old component
313 // if a frame was created already, it can't be an SfxComponent!
314 pFrame
->GetFrameInterface()->setComponent( 0, 0 );
315 if ( !bFrameCreated
)
316 pFrame
= SfxTopFrame::Create( rFrame
);
319 aSet
.Put( SfxFrameItem( SID_DOCFRAME
, pFrame
) );
321 for ( SfxObjectShell
* pDoc
= SfxObjectShell::GetFirst( NULL
, FALSE
); pDoc
; pDoc
= SfxObjectShell::GetNext( *pDoc
, NULL
, FALSE
) )
323 if ( xModel
== pDoc
->GetModel() )
325 pFrame
->SetItemSet_Impl( &aSet
);
326 ::comphelper::SequenceAsHashMap
lUpdateDescr( lDescriptor
);
327 lUpdateDescr
.erase( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Model" ) ) );
328 lUpdateDescr
.erase( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) ) );
330 xModel
->attachResource( rURL
, lUpdateDescr
.getAsConstPropertyValueList() );
331 return pFrame
->InsertDocument( pDoc
);
335 DBG_ERROR("Model is not based on SfxObjectShell - wrong frame loader use!");
339 // check for the URL pattern of our factory URLs
340 SfxFrameWeak wFrame
= pFrame
;
341 String aPrefix
= String::CreateFromAscii( "private:factory/" );
342 String
aFact( rURL
);
343 if ( aPrefix
.Len() == aFact
.Match( aPrefix
) )
345 if ( !aServiceName
.Len() )
346 aServiceName
= SfxObjectShell::GetServiceNameFromFactory( rURL
);
348 // it's a factory URL
349 aFact
.Erase( 0, aPrefix
.Len() );
351 // look for parameters
353 USHORT nPos
= aFact
.Search( '?' );
354 if ( nPos
!= STRING_NOTFOUND
)
356 // currently only the "slot" parameter is supported
357 USHORT nParamPos
= aFact
.Search( String::CreateFromAscii("slot="), nPos
);
358 if ( nParamPos
!= STRING_NOTFOUND
)
359 aParam
= aFact
.Copy( nParamPos
+5, aFact
.Len() );
360 aFact
.Erase( nPos
, aFact
.Len() );
363 WildCard
aSearchedFac( aFact
.EraseAllChars('4').ToUpperAscii() );
364 SFX_ITEMSET_ARG( &aSet
, pDocumentTitleItem
, SfxStringItem
, SID_DOCINFO_TITLE
, FALSE
);
365 INetURLObject
aObj( rURL
);
369 sal_uInt16 nSlotId
= (sal_uInt16
) aParam
.ToInt32();
370 SfxRequest
aReq( nSlotId
, SFX_CALLMODE_SYNCHRON
, pApp
->GetPool() );
371 aReq
.AppendItem( SfxFrameItem ( SID_DOCFRAME
, pFrame
) );
372 const SfxPoolItem
* pRet
= pApp
->ExecuteSlot( aReq
);
375 // default must be set to true, because some return values
376 // cant be checked ... but indicates "success"!
377 bLoadState
= sal_True
;
379 // On the other side some special slots return a boolean state,
380 // which can be set to FALSE.
381 SfxBoolItem
*pItem
= PTR_CAST( SfxBoolItem
, pRet
);
383 bLoadState
= pItem
->GetValue();
386 bLoadState
= sal_False
;
388 if ( !bLoadState
&& bFrameCreated
&& wFrame
&& !wFrame
->GetCurrentDocument() )
390 css::uno::Reference
< css::frame::XFrame
> axFrame
;
391 wFrame
->SetFrameInterface_Impl( axFrame
);
401 SFX_ITEMSET_ARG( &aSet
, pTemplateRegionItem
, SfxStringItem
, SID_TEMPLATE_REGIONNAME
, FALSE
);
402 SFX_ITEMSET_ARG( &aSet
, pTemplateNameItem
, SfxStringItem
, SID_TEMPLATE_NAME
, FALSE
);
403 if ( pTemplateRegionItem
&& pTemplateNameItem
)
405 SfxDocumentTemplates aTmpFac
;
406 aTmpFac
.GetFull( pTemplateRegionItem
->GetValue(), pTemplateNameItem
->GetValue(), sTemplateURL
);
410 sTemplateURL
= SfxObjectFactory::GetStandardTemplate( aServiceName
);
413 BOOL bUseTemplate
= (sTemplateURL
.Len()>0);
417 // Forget the filter, which was detected for the corresponding "private:factory/xxx" URL.
418 // We must use the right filter, matching to this document ... not to the private URL!
419 const SfxFilter
* pTemplateFilter
= impl_detectFilterForURL(sTemplateURL
, rArgs
, rMatcher
);
422 pFilter
= pTemplateFilter
;
423 aFilterName
= pTemplateFilter
->GetName();
424 // standard template set -> load it "AsTemplate"
425 aSet
.Put( SfxStringItem ( SID_FILE_NAME
, sTemplateURL
) );
426 aSet
.Put( SfxBoolItem( SID_TEMPLATE
, sal_True
) );
430 // something is wrong with the set default template (e.g. unknown format, missing file etcpp)
431 // The we have to jump into the following special code, where "private:factory/ URL's are handled.
432 // We cant "load" such private/factory URL's!
434 bUseTemplate
= FALSE
;
439 // execute "NewDocument" request
442 Pointers can't be used to check if two objects are equals!
443 E.g. the memory manager can reuse freed memory ...
444 and then the holded copy of a pointer will point to another
445 (and different!) object - may using the same type then before.
446 In such case we compare one object with itself ...
448 SfxRequest
aReq( SID_NEWDOCDIRECT
, SFX_CALLMODE_SYNCHRON
, aSet
);
449 aReq
.AppendItem( SfxFrameItem( SID_DOCFRAME
, pFrame
) );
450 aReq
.AppendItem( SfxStringItem( SID_NEWDOCDIRECT
, aFact
) );
452 if ( pDocumentTitleItem
)
453 aReq
.AppendItem( *pDocumentTitleItem
);
455 const SfxPoolItem
* pRet
= pApp
->NewDocDirectExec_ImplOld(aReq
);
458 // default must be set to true, because some return values
459 // cant be checked ... but indicates "success"!
460 bLoadState
= sal_True
;
462 // On the other side some special slots return a boolean state,
463 // which can be set to FALSE.
464 SfxBoolItem
*pItem
= PTR_CAST( SfxBoolItem
, pRet
);
466 bLoadState
= pItem
->GetValue();
469 bLoadState
= sal_False
;
471 if ( !bLoadState
&& bFrameCreated
&& wFrame
&& !wFrame
->GetCurrentDocument() )
473 css::uno::Reference
< css::frame::XFrame
> axFrame
;
474 wFrame
->SetFrameInterface_Impl( axFrame
);
485 // load the desired file
486 aSet
.Put( SfxStringItem ( SID_FILE_NAME
, rURL
) );
489 aSet
.Put( SfxFrameItem( SID_DOCFRAME
, pFrame
) );
490 aSet
.Put( SfxUnoAnyItem( SID_FILLFRAME
, css::uno::makeAny(xFrame
) ) );
491 aSet
.Put( SfxStringItem( SID_FILTER_NAME
, aFilterName
) );
493 // !TODO: replace by direct construction of model (needs view factory)
494 DBG_ASSERT( pFilter
, "No filter set!" );
498 sal_Bool bDisaster
= sal_False
;
499 SfxObjectShell
* pDoc
= SfxObjectShell::CreateObject( pFilter
->GetServiceName() );
502 css::uno::Reference
< css::frame::XLoadable
> xLoadable
= css::uno::Reference
< css::frame::XLoadable
>( pDoc
->GetModel(), css::uno::UNO_QUERY
);
503 css::uno::Sequence
< css::beans::PropertyValue
> aLoadArgs
;
504 TransformItems( SID_OPENDOC
, aSet
, aLoadArgs
);
507 xLoadable
->load( aLoadArgs
);
509 SfxMedium
* pDocMedium
= pDoc
->GetMedium();
510 BOOL bHidden
= FALSE
;
511 SFX_ITEMSET_ARG( pDocMedium
->GetItemSet(), pHidItem
, SfxBoolItem
, SID_HIDDEN
, sal_False
);
513 bHidden
= pHidItem
->GetValue();
515 // !TODO: will be done by Framework!
516 pDocMedium
->SetUpdatePickList( !bHidden
);
520 We dont know why pFrame can be corrupt here.
521 But if it was deleted it shouldnt exists inside our global list.
522 May be we can use the damaged pointer to detect if it was removed from
526 for ( pTmp
= SfxFrame::GetFirst(); pTmp
; pTmp
= SfxFrame::GetNext( *pTmp
) )
528 if ( pFrame
== pTmp
)
532 if ( pTmp
== pFrame
)
534 // !TODO: replace by ViewFactory
535 if ( pFrame
->GetFrameInterface()->getController().is() )
537 // remove old component
538 // if a frame was created already, it can't be an SfxComponent!
539 // pFrame->GetFrameInterface()->setComponent( 0, 0 );
540 if ( !bFrameCreated
)
541 pFrame
= SfxTopFrame::Create( rFrame
);
545 aSet
.Put( SfxFrameItem( SID_DOCFRAME
, pFrame
) );
546 if( pFrame
->InsertDocument( pDoc
) )
548 pFrame
->GetCurrentViewFrame()->UpdateDocument_Impl();
549 String aURL
= pDoc
->GetMedium()->GetName();
550 SFX_APP()->Broadcast( SfxStringHint( SID_OPENURL
, aURL
) );
551 bLoadState
= sal_True
;
554 bDisaster
= sal_True
;
558 DBG_ERROR("#121119# You found the reason for a stacktrace! Frame destroyed while loading document.");
559 bLoadState
= sal_False
;
562 catch ( css::uno::Exception
& )
564 bDisaster
= sal_True
;
569 if ( wFrame
&& !wFrame
->GetCurrentDocument() )
571 // document loading was not successful; close SfxFrame (but not XFrame!)
572 css::uno::Reference
< css::frame::XFrame
> axFrame
;
573 wFrame
->SetFrameInterface_Impl( axFrame
);
575 aSet
.ClearItem( SID_DOCFRAME
);
578 css::uno::Reference
< css::util::XCloseable
> xCloseable( xLoadable
, css::uno::UNO_QUERY
);
579 if ( xCloseable
.is() )
582 xCloseable
->close( sal_True
);
583 } catch ( css::uno::Exception
& )
594 void SfxFrameLoader_Impl::cancel() throw( RUNTIME_EXCEPTION
)
598 SFX_IMPL_SINGLEFACTORY( SfxFrameLoader_Impl
)
601 UNOOUSTRING SAL_CALL
SfxFrameLoader_Impl::getImplementationName() throw( UNORUNTIMEEXCEPTION
)
603 return impl_getStaticImplementationName();
607 sal_Bool SAL_CALL
SfxFrameLoader_Impl::supportsService( const UNOOUSTRING
& sServiceName
) throw( UNORUNTIMEEXCEPTION
)
609 UNOSEQUENCE
< UNOOUSTRING
> seqServiceNames
= getSupportedServiceNames();
610 const UNOOUSTRING
* pArray
= seqServiceNames
.getConstArray();
611 for ( sal_Int32 nCounter
=0; nCounter
<seqServiceNames
.getLength(); nCounter
++ )
613 if ( pArray
[nCounter
] == sServiceName
)
622 UNOSEQUENCE
< UNOOUSTRING
> SAL_CALL
SfxFrameLoader_Impl::getSupportedServiceNames() throw( UNORUNTIMEEXCEPTION
)
624 return impl_getStaticSupportedServiceNames();
627 /* Helper for XServiceInfo */
628 UNOSEQUENCE
< UNOOUSTRING
> SfxFrameLoader_Impl::impl_getStaticSupportedServiceNames()
630 UNOMUTEXGUARD
aGuard( UNOMUTEX::getGlobalMutex() );
631 UNOSEQUENCE
< UNOOUSTRING
> seqServiceNames( 1 );
632 seqServiceNames
.getArray() [0] = UNOOUSTRING::createFromAscii( "com.sun.star.frame.SynchronousFrameLoader" );
633 return seqServiceNames
;
636 /* Helper for XServiceInfo */
637 UNOOUSTRING
SfxFrameLoader_Impl::impl_getStaticImplementationName()
639 return UNOOUSTRING::createFromAscii( "com.sun.star.comp.office.FrameLoader" );
642 /* Helper for registry */
643 UNOREFERENCE
< UNOXINTERFACE
> SAL_CALL
SfxFrameLoader_Impl::impl_createInstance( const UNOREFERENCE
< UNOXMULTISERVICEFACTORY
>& xServiceManager
) throw( UNOEXCEPTION
)
645 return UNOREFERENCE
< UNOXINTERFACE
>( *new SfxFrameLoader_Impl( xServiceManager
) );