xref: /aoo41x/main/sfx2/source/appl/appopen.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sfx2.hxx"
30 #include <com/sun/star/uno/Reference.h>
31 #include <com/sun/star/beans/PropertyValue.hpp>
32 #include <com/sun/star/frame/FrameSearchFlag.hpp>
33 #include <com/sun/star/frame/XComponentLoader.hpp>
34 #include <com/sun/star/frame/XNotifyingDispatch.hpp>
35 #include <com/sun/star/frame/XDispatchProvider.hpp>
36 #include <com/sun/star/util/XCloseable.hpp>
37 #include <com/sun/star/frame/XFrame.hpp>
38 #include <com/sun/star/frame/XDesktop.hpp>
39 #include <com/sun/star/frame/DispatchResultState.hpp>
40 #include <com/sun/star/frame/XDispatchResultListener.hpp>
41 #include <com/sun/star/util/URL.hpp>
42 #include <com/sun/star/util/XURLTransformer.hpp>
43 #include <com/sun/star/system/XSystemShellExecute.hpp>
44 #include <com/sun/star/document/XTypeDetection.hpp>
45 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
46 #include <com/sun/star/document/MacroExecMode.hpp>
47 #include <com/sun/star/document/UpdateDocMode.hpp>
48 #include <com/sun/star/task/ErrorCodeRequest.hpp>
49 #include <com/sun/star/beans/XPropertySet.hpp>
50 #include <com/sun/star/embed/ElementModes.hpp>
51 #include <com/sun/star/container/XNameAccess.hpp>
52 #include <com/sun/star/uno/Sequence.h>
53 #include <comphelper/processfactory.hxx>
54 #include <cppuhelper/implbase1.hxx>
55 #include <rtl/ustring.hxx>
56 
57 
58 #include <comphelper/storagehelper.hxx>
59 #include <comphelper/synchronousdispatch.hxx>
60 #include <comphelper/configurationhelper.hxx>
61 #include <comphelper/sequenceasvector.hxx>
62 
63 #include <vcl/wrkwin.hxx>
64 #include <svl/intitem.hxx>
65 #include <vcl/msgbox.hxx>
66 #include <svl/stritem.hxx>
67 #include <svl/eitem.hxx>
68 #include <sfx2/doctempl.hxx>
69 #include <svtools/sfxecode.hxx>
70 #include <framework/preventduplicateinteraction.hxx>
71 #include <svtools/ehdl.hxx>
72 #include <basic/sbxobj.hxx>
73 #include <svl/urihelper.hxx>
74 #include <unotools/localfilehelper.hxx>
75 #include <unotools/pathoptions.hxx>
76 #include <unotools/moduleoptions.hxx>
77 #include <svtools/templdlg.hxx>
78 #include <osl/file.hxx>
79 #include <unotools/extendedsecurityoptions.hxx>
80 #include <comphelper/docpasswordhelper.hxx>
81 #include <vcl/svapp.hxx>
82 
83 #include <vos/mutex.hxx>
84 
85 #include <rtl/logfile.hxx>
86 
87 #include <sfx2/app.hxx>
88 #include <sfx2/bindings.hxx>
89 #include <sfx2/dispatch.hxx>
90 #include <sfx2/docfile.hxx>
91 #include <sfx2/fcontnr.hxx>
92 #include <sfx2/new.hxx>
93 #include <sfx2/objitem.hxx>
94 #include <sfx2/objsh.hxx>
95 #include <svl/slstitm.hxx>
96 #include "objshimp.hxx"
97 #include "openflag.hxx"
98 #include <sfx2/passwd.hxx>
99 #include "referers.hxx"
100 #include <sfx2/request.hxx>
101 #include "sfx2/sfxresid.hxx"
102 #include <sfx2/viewsh.hxx>
103 #include "app.hrc"
104 #include <sfx2/viewfrm.hxx>
105 #include <sfx2/sfxuno.hxx>
106 #include <sfx2/objface.hxx>
107 #include <sfx2/filedlghelper.hxx>
108 #include <sfx2/docfac.hxx>
109 #include <sfx2/event.hxx>
110 
111 #define _SVSTDARR_STRINGSDTOR
112 #include <svl/svstdarr.hxx>
113 
114 using namespace ::com::sun::star;
115 using namespace ::com::sun::star::beans;
116 using namespace ::com::sun::star::frame;
117 using namespace ::com::sun::star::lang;
118 using namespace ::com::sun::star::uno;
119 using namespace ::com::sun::star::util;
120 using namespace ::com::sun::star::system;
121 using namespace ::com::sun::star::task;
122 using namespace ::com::sun::star::container;
123 using namespace ::cppu;
124 using namespace ::sfx2;
125 
126 namespace css = ::com::sun::star;
127 
128 //=========================================================================
129 
130 class SfxOpenDocStatusListener_Impl : public WeakImplHelper1< XDispatchResultListener >
131 {
132 public:
133     sal_Bool    bFinished;
134     sal_Bool    bSuccess;
135     virtual void SAL_CALL   dispatchFinished( const DispatchResultEvent& Event ) throw(RuntimeException);
136     virtual void SAL_CALL   disposing( const EventObject& Source ) throw(RuntimeException);
137                             SfxOpenDocStatusListener_Impl()
138                                 : bFinished( sal_False )
139                                 , bSuccess( sal_False )
140                             {}
141 };
142 
143 void SAL_CALL SfxOpenDocStatusListener_Impl::dispatchFinished( const DispatchResultEvent& aEvent ) throw(RuntimeException)
144 {
145     bSuccess = ( aEvent.State == DispatchResultState::SUCCESS );
146     bFinished = sal_True;
147 }
148 
149 void SAL_CALL SfxOpenDocStatusListener_Impl::disposing( const EventObject& ) throw(RuntimeException)
150 {
151 }
152 
153 SfxObjectShellRef SfxApplication::DocAlreadyLoaded
154 (
155     const String&   rName,      // Name des Dokuments mit Pfad
156     sal_Bool            bSilent,    // sal_True: nicht nach neuer Sicht fragen
157     sal_Bool            bActivate,   // soll bestehende Sicht aktiviert werden
158     sal_Bool            bForbidVisible,
159 	const String*   pPostStr
160 )
161 
162 /*  [Beschreibung]
163 
164     Stellt fest, ob ein Dokument mit dem Namen 'rName' bereits geladen
165     ist und liefert einen Pointer darauf zu"uck.
166 
167     Ist das Dokument noch nicht geladen, wird ein 0-Pointer zur"uckgeliefert.
168 */
169 
170 {
171     // zu suchenden Namen als URL aufbereiten
172     INetURLObject aUrlToFind( rName );
173     DBG_ASSERT( aUrlToFind.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL" );
174 	String aPostString;
175 	if (  pPostStr )
176 		aPostString = *pPostStr;
177 
178     // noch offen?
179     SfxObjectShellRef xDoc;
180 
181     if ( !aUrlToFind.HasError() )
182     {
183 		// dann bei den normal geoeffneten Docs
184 		if ( !xDoc.Is() )
185 		{
186 			xDoc = SfxObjectShell::GetFirst( 0, sal_False ); // auch hidden Docs
187 			while( xDoc.Is() )
188 			{
189 				if ( xDoc->GetMedium() &&
190 					 xDoc->GetCreateMode() == SFX_CREATE_MODE_STANDARD &&
191 					 !xDoc->IsAbortingImport() && !xDoc->IsLoading() )
192 				{
193 					// Vergleiche anhand der URLs
194                     INetURLObject aUrl( xDoc->GetMedium()->GetName() );
195 					if ( !aUrl.HasError() && aUrl == aUrlToFind &&
196                          (!bForbidVisible || !SfxViewFrame::GetFirst( xDoc, sal_True )) &&
197 						 !xDoc->IsLoading())
198 					{
199 							break;
200 					}
201 				}
202 				xDoc = SfxObjectShell::GetNext( *xDoc, 0, sal_False );
203 			}
204 		}
205     }
206 
207     // gefunden?
208     if ( xDoc.Is() && bActivate )
209     {
210         DBG_ASSERT(
211             !bForbidVisible, "Unsichtbares kann nicht aktiviert werden" );
212 
213 		SfxViewFrame* pFrame;
214         for( pFrame = SfxViewFrame::GetFirst( xDoc );
215              pFrame && !pFrame->IsVisible();
216              pFrame = SfxViewFrame::GetNext( *pFrame, xDoc ) ) ;
217 		if ( pFrame )
218 		{
219 		    SfxViewFrame *pCur = SfxViewFrame::Current();
220 		    if ( !bSilent && pFrame == pCur )
221 		        InfoBox( 0, SfxResId(RID_DOCALREADYLOADED_DLG)).Execute();
222 		    if ( bActivate )
223             {
224                 pFrame->MakeActive_Impl( sal_True );
225             }
226 		}
227     }
228     return xDoc;
229 }
230 
231 //====================================================================
232 
233 void SetTemplate_Impl( const String &rFileName,
234 						const String &rLongName,
235 						SfxObjectShell *pDoc)
236 {
237     // write TemplateName to DocumentInfo of document
238     // TemplateDate stays as default (=current date)
239     pDoc->ResetFromTemplate( rLongName, rFileName );
240 }
241 
242 //====================================================================
243 class SfxDocPasswordVerifier : public ::comphelper::IDocPasswordVerifier
244 {
245 public:
246     inline explicit     SfxDocPasswordVerifier( const Reference< embed::XStorage >& rxStorage ) :
247                             mxStorage( rxStorage ) {}
248 
249     virtual ::comphelper::DocPasswordVerifierResult
250                         verifyPassword( const ::rtl::OUString& rPassword, uno::Sequence< beans::NamedValue >& o_rEncryptionData );
251     virtual ::comphelper::DocPasswordVerifierResult
252                         verifyEncryptionData( const uno::Sequence< beans::NamedValue >& rEncryptionData );
253 
254 
255 private:
256     Reference< embed::XStorage > mxStorage;
257 };
258 
259 //--------------------------------------------------------------------
260 ::comphelper::DocPasswordVerifierResult SfxDocPasswordVerifier::verifyPassword( const ::rtl::OUString& rPassword, uno::Sequence< beans::NamedValue >& o_rEncryptionData )
261 {
262     o_rEncryptionData = ::comphelper::OStorageHelper::CreatePackageEncryptionData( rPassword );
263     return verifyEncryptionData( o_rEncryptionData );
264 }
265 
266 
267 //--------------------------------------------------------------------
268 ::comphelper::DocPasswordVerifierResult SfxDocPasswordVerifier::verifyEncryptionData( const uno::Sequence< beans::NamedValue >& rEncryptionData )
269 {
270     ::comphelper::DocPasswordVerifierResult eResult = ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD;
271     try
272     {
273         // check the encryption data
274         // if the data correct is the stream will be opened successfuly
275         // and immediatelly closed
276         ::comphelper::OStorageHelper::SetCommonStorageEncryptionData( mxStorage, rEncryptionData );
277 
278         mxStorage->openStreamElement(
279                 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "content.xml" ) ),
280                 embed::ElementModes::READ | embed::ElementModes::NOCREATE );
281 
282         // no exception -> success
283         eResult = ::comphelper::DocPasswordVerifierResult_OK;
284     }
285     catch( const packages::WrongPasswordException& )
286     {
287         eResult = ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD;
288     }
289     catch( const uno::Exception& )
290     {
291         // unknown error, report it as wrong password
292         // TODO/LATER: we need an additional way to report unknown problems in this case
293         eResult = ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD;
294     }
295     return eResult;
296 }
297 
298 //====================================================================
299 
300 //--------------------------------------------------------------------
301 
302 sal_uInt32 CheckPasswd_Impl
303 (
304     //Window *pWin,             // Parent des Dialogs
305     SfxObjectShell*  pDoc,
306     SfxItemPool&     /*rPool*/, // Pool, falls ein Set erzeugt werden mus
307     SfxMedium*       pFile      // das Medium, dessen Passwort gfs. erfragt werden soll
308 )
309 
310 /*  [Beschreibung]
311 
312     Zu einem Medium das Passwort erfragen; funktioniert nur, wenn es sich
313     um einen Storage handelt.
314     Wenn in der Documentinfo das Passwort-Flag gesetzt ist, wird
315     das Passwort vom Benutzer per Dialog erfragt und an dem Set
316     des Mediums gesetzt; das Set wird, wenn nicht vorhanden, erzeugt.
317 */
318 {
319     sal_uIntPtr nRet = ERRCODE_NONE;
320 
321     if( ( !pFile->GetFilter() || pFile->IsStorage() ) )
322     {
323 		uno::Reference< embed::XStorage > xStorage = pFile->GetStorage( sal_True );
324         if( xStorage.is() )
325         {
326 			uno::Reference< beans::XPropertySet > xStorageProps( xStorage, uno::UNO_QUERY );
327 			if ( xStorageProps.is() )
328 			{
329             	sal_Bool bIsEncrypted = sal_False;
330 				try {
331 					xStorageProps->getPropertyValue( ::rtl::OUString::createFromAscii("HasEncryptedEntries") )
332 						>>= bIsEncrypted;
333 				} catch( uno::Exception& )
334 				{
335                     // TODO/LATER:
336 					// the storage either has no encrypted elements or it's just
337 					// does not allow to detect it, probably it should be implemented laiter
338 					/*
339                 	bIsEncrypted = ( aInfo.Load( xStorage ) && aInfo.IsPasswd() );
340 					*/
341 				}
342 
343             	if ( bIsEncrypted )
344             	{
345 			    	Window* pWin = pDoc ? pDoc->GetDialogParent( pFile ) : NULL;
346                 	if ( pWin )
347                     	pWin->Show();
348 
349 					nRet = ERRCODE_SFX_CANTGETPASSWD;
350 
351                 	SfxItemSet *pSet = pFile->GetItemSet();
352 					if( pSet )
353 					{
354                         Reference< ::com::sun::star::task::XInteractionHandler > xInteractionHandler = pFile->GetInteractionHandler();
355                         if( xInteractionHandler.is() )
356 						{
357                             // use the comphelper password helper to request a password
358                             ::rtl::OUString aPassword;
359                             SFX_ITEMSET_ARG( pSet, pPasswordItem, SfxStringItem, SID_PASSWORD, sal_False);
360                             if ( pPasswordItem )
361                                 aPassword = pPasswordItem->GetValue();
362 
363                             uno::Sequence< beans::NamedValue > aEncryptionData;
364                             SFX_ITEMSET_ARG( pSet, pEncryptionDataItem, SfxUnoAnyItem, SID_ENCRYPTIONDATA, sal_False);
365                             if ( pEncryptionDataItem )
366                                 pEncryptionDataItem->GetValue() >>= aEncryptionData;
367 
368                             ::rtl::OUString aDocumentName = INetURLObject( pFile->GetOrigURL() ).GetMainURL( INetURLObject::DECODE_WITH_CHARSET );
369 
370                             SfxDocPasswordVerifier aVerifier( xStorage );
371                             aEncryptionData = ::comphelper::DocPasswordHelper::requestAndVerifyDocPassword(
372                                 aVerifier, aEncryptionData, aPassword, xInteractionHandler, aDocumentName, comphelper::DocPasswordRequestType_STANDARD );
373 
374                             pSet->ClearItem( SID_PASSWORD );
375                             pSet->ClearItem( SID_ENCRYPTIONDATA );
376 
377                             if ( aEncryptionData.getLength() > 0 )
378                             {
379                     			pSet->Put( SfxUnoAnyItem( SID_ENCRYPTIONDATA, uno::makeAny( aEncryptionData ) ) );
380 
381 								try
382 								{
383 									// update the version list of the medium using the new password
384 									pFile->GetVersionList();
385 								}
386 								catch( uno::Exception& )
387 								{
388 									// TODO/LATER: set the error code
389 								}
390 
391 								nRet = ERRCODE_NONE;
392 							}
393 							else
394 								nRet = ERRCODE_IO_ABORT;
395 						}
396 					}
397             	}
398         	}
399 			else
400 			{
401 				OSL_ENSURE( sal_False, "A storage must implement XPropertySet interface!" );
402 				nRet = ERRCODE_SFX_CANTGETPASSWD;
403 			}
404     	}
405 	}
406 
407     return nRet;
408 }
409 
410 //--------------------------------------------------------------------
411 
412 
413 sal_uIntPtr SfxApplication::LoadTemplate( SfxObjectShellLock& xDoc, const String &rFileName, sal_Bool bCopy, SfxItemSet* pSet )
414 {
415     const SfxFilter* pFilter = NULL;
416     SfxMedium aMedium( rFileName,  ( STREAM_READ | STREAM_SHARE_DENYNONE ), sal_False );
417 
418     if ( !aMedium.GetStorage( sal_True ).is() )
419         aMedium.GetInStream();
420 
421     if ( aMedium.GetError() )
422 	{
423 		delete pSet;
424         return aMedium.GetErrorCode();
425 	}
426 
427     aMedium.UseInteractionHandler( sal_True );
428     sal_uIntPtr nErr = GetFilterMatcher().GuessFilter( aMedium,&pFilter,SFX_FILTER_TEMPLATE, 0 );
429     if ( 0 != nErr)
430     {
431 		delete pSet;
432         return ERRCODE_SFX_NOTATEMPLATE;
433     }
434 
435     if( !pFilter || !pFilter->IsAllowedAsTemplate() )
436     {
437 		delete pSet;
438         return ERRCODE_SFX_NOTATEMPLATE;
439     }
440 
441 	if ( pFilter->GetFilterFlags() & SFX_FILTER_STARONEFILTER )
442 	{
443 		DBG_ASSERT( !xDoc.Is(), "Sorry, not implemented!" );
444 		delete pSet;
445 		SfxStringItem aName( SID_FILE_NAME, rFileName );
446 		SfxStringItem aReferer( SID_REFERER, String::CreateFromAscii("private:user") );
447 		SfxStringItem aFlags( SID_OPTIONS, String::CreateFromAscii("T") );
448 		SfxBoolItem aHidden( SID_HIDDEN, sal_True );
449 		const SfxPoolItem *pRet = GetDispatcher_Impl()->Execute( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, &aName, &aHidden, &aReferer, &aFlags, 0L );
450 		const SfxObjectItem *pObj = PTR_CAST( SfxObjectItem, pRet );
451         if ( pObj )
452             xDoc = PTR_CAST( SfxObjectShell, pObj->GetShell() );
453         else
454         {
455             const SfxViewFrameItem *pView = PTR_CAST( SfxViewFrameItem, pRet );
456             if ( pView )
457             {
458                 SfxViewFrame *pFrame = pView->GetFrame();
459                 if ( pFrame )
460                     xDoc = pFrame->GetObjectShell();
461             }
462         }
463 
464 		if ( !xDoc.Is() )
465 			return ERRCODE_SFX_DOLOADFAILED;
466 	}
467 	else
468 	{
469 		if ( !xDoc.Is() )
470 			xDoc = SfxObjectShell::CreateObject( pFilter->GetServiceName() );
471 
472 		SfxMedium *pMedium = new SfxMedium( rFileName, STREAM_STD_READ, sal_False, pFilter, pSet );
473 		if(!xDoc->DoLoad(pMedium))
474 		{
475 			ErrCode nErrCode = xDoc->GetErrorCode();
476 			xDoc->DoClose();
477 			xDoc.Clear();
478 			return nErrCode;
479 		}
480 	}
481 
482     if( bCopy )
483     {
484 		try
485 		{
486             // TODO: introduce error handling
487 
488 			uno::Reference< embed::XStorage > xTempStorage = ::comphelper::OStorageHelper::GetTemporaryStorage();
489         	if( !xTempStorage.is() )
490 				throw uno::RuntimeException();
491 
492        		xDoc->GetStorage()->copyToStorage( xTempStorage );
493 
494 //REMOVE				// the following operations should be done in one step
495 //REMOVE	       		xDoc->DoHandsOff();
496             if ( !xDoc->DoSaveCompleted( new SfxMedium( xTempStorage, String() ) ) )
497 				throw uno::RuntimeException();
498 		}
499 		catch( uno::Exception& )
500 		{
501 			xDoc->DoClose();
502 			xDoc.Clear();
503 
504             // TODO: transfer correct error outside
505 			return ERRCODE_SFX_GENERAL;
506 		}
507 
508         SetTemplate_Impl( rFileName, String(), xDoc );
509     }
510     else
511         SetTemplate_Impl( rFileName, String(), xDoc );
512 
513     xDoc->SetNoName();
514     xDoc->InvalidateName();
515     xDoc->SetModified(sal_False);
516     xDoc->ResetError();
517 
518     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >  xModel ( xDoc->GetModel(), ::com::sun::star::uno::UNO_QUERY );
519     if ( xModel.is() )
520     {
521         SfxItemSet* pNew = xDoc->GetMedium()->GetItemSet()->Clone();
522         pNew->ClearItem( SID_PROGRESS_STATUSBAR_CONTROL );
523 		pNew->ClearItem( SID_FILTER_NAME );
524         //pNew->Put( SfxStringItem( SID_FILTER_NAME, xDoc->GetFactory().GetFilter(0)->GetFilterName() ) );
525         ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs;
526         TransformItems( SID_OPENDOC, *pNew, aArgs );
527         sal_Int32 nLength = aArgs.getLength();
528         aArgs.realloc( nLength + 1 );
529         aArgs[nLength].Name = DEFINE_CONST_UNICODE("Title");
530         aArgs[nLength].Value <<= ::rtl::OUString( xDoc->GetTitle( SFX_TITLE_DETECT ) );
531         xModel->attachResource( ::rtl::OUString(), aArgs );
532         delete pNew;
533     }
534 
535     return xDoc->GetErrorCode();
536 }
537 
538 //--------------------------------------------------------------------
539 
540 void SfxApplication::NewDocDirectExec_Impl( SfxRequest& rReq )
541 {
542     DBG_MEMTEST();
543 
544     SFX_REQUEST_ARG( rReq, pFactoryItem, SfxStringItem, SID_NEWDOCDIRECT, sal_False);
545     String aFactName;
546     if ( pFactoryItem )
547         aFactName = pFactoryItem->GetValue();
548    else
549     	aFactName = SvtModuleOptions().GetDefaultModuleName();
550 
551 
552     SfxRequest aReq( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, GetPool() );
553     String aFact = String::CreateFromAscii("private:factory/");
554     aFact += aFactName;
555     aReq.AppendItem( SfxStringItem( SID_FILE_NAME, aFact ) );
556     aReq.AppendItem( SfxFrameItem( SID_DOCFRAME, GetFrame() ) );
557     aReq.AppendItem( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii( "_default" ) ) );
558 
559     // TODO/LATER: Should the other arguments be transfered as well?
560     SFX_REQUEST_ARG( rReq, pDefaultPathItem, SfxStringItem, SID_DEFAULTFILEPATH, sal_False);
561     if ( pDefaultPathItem )
562         aReq.AppendItem( *pDefaultPathItem );
563     SFX_REQUEST_ARG( rReq, pDefaultNameItem, SfxStringItem, SID_DEFAULTFILENAME, sal_False);
564     if ( pDefaultNameItem )
565         aReq.AppendItem( *pDefaultNameItem );
566 
567     SFX_APP()->ExecuteSlot( aReq );
568     const SfxViewFrameItem* pItem = PTR_CAST( SfxViewFrameItem, aReq.GetReturnValue() );
569     if ( pItem )
570         rReq.SetReturnValue( SfxFrameItem( 0, pItem->GetFrame() ) );
571 }
572 
573 //--------------------------------------------------------------------
574 
575 void SfxApplication::NewDocExec_Impl( SfxRequest& rReq )
576 {
577     DBG_MEMTEST();
578 
579     // keine Parameter vom BASIC nur Factory angegeben?
580     SFX_REQUEST_ARG(rReq, pTemplNameItem, SfxStringItem, SID_TEMPLATE_NAME, sal_False);
581     SFX_REQUEST_ARG(rReq, pTemplFileNameItem, SfxStringItem, SID_FILE_NAME, sal_False);
582     SFX_REQUEST_ARG(rReq, pTemplRegionNameItem, SfxStringItem, SID_TEMPLATE_REGIONNAME, sal_False);
583 
584     SfxObjectShellLock xDoc;
585 
586     String  aTemplateRegion, aTemplateName, aTemplateFileName;
587     sal_Bool    bDirect = sal_False; // "uber FileName anstelle Region/Template
588     SfxErrorContext aEc(ERRCTX_SFX_NEWDOC);
589     if ( !pTemplNameItem && !pTemplFileNameItem )
590     {
591 		Window* pTopWin = GetTopWindow();
592 		SvtDocumentTemplateDialog* pDocTemplDlg = new SvtDocumentTemplateDialog( NULL );
593         int nRet = pDocTemplDlg->Execute();
594 		sal_Bool bNewWin = sal_False;
595         if ( nRet == RET_OK )
596 		{
597             rReq.Done();
598             if ( pTopWin != GetTopWindow() )
599             {
600                 // the dialogue opens a document -> a new TopWindow appears
601                 pTopWin = GetTopWindow();
602                 bNewWin = sal_True;
603             }
604 		}
605 
606 		delete pDocTemplDlg;
607         if ( bNewWin && pTopWin )
608 			// after the destruction of the dialogue its parent comes to top,
609 			// but we want that the new document is on top
610 			pTopWin->ToTop();
611 
612 		return;
613     }
614     else
615     {
616         // Template-Name
617         if ( pTemplNameItem )
618             aTemplateName = pTemplNameItem->GetValue();
619 
620         // Template-Region
621         if ( pTemplRegionNameItem )
622             aTemplateRegion = pTemplRegionNameItem->GetValue();
623 
624         // Template-File-Name
625         if ( pTemplFileNameItem )
626         {
627             aTemplateFileName = pTemplFileNameItem->GetValue();
628             bDirect = sal_True;
629         }
630     }
631 
632 	sal_uIntPtr lErr = 0;
633 	SfxItemSet* pSet = new SfxAllItemSet( GetPool() );
634 	pSet->Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
635     if ( !bDirect )
636 	{
637 		SfxDocumentTemplates aTmpFac;
638 		if( !aTemplateFileName.Len() )
639 			aTmpFac.GetFull( aTemplateRegion, aTemplateName, aTemplateFileName );
640 
641         if( !aTemplateFileName.Len() )
642 			lErr = ERRCODE_SFX_TEMPLATENOTFOUND;
643 	}
644 
645     INetURLObject aObj( aTemplateFileName );
646     SfxErrorContext aEC( ERRCTX_SFX_LOADTEMPLATE, aObj.PathToFileName() );
647 
648     if ( lErr != ERRCODE_NONE )
649     {
650         sal_uIntPtr lFatalErr = ERRCODE_TOERROR(lErr);
651         if ( lFatalErr )
652             ErrorHandler::HandleError(lErr);
653     }
654     else
655     {
656         SfxCallMode eMode = SFX_CALLMODE_SYNCHRON;
657 
658         const SfxPoolItem *pRet=0;
659         SfxStringItem aReferer( SID_REFERER, DEFINE_CONST_UNICODE("private:user") );
660         SfxStringItem aTarget( SID_TARGETNAME, DEFINE_CONST_UNICODE("_default") );
661         if ( aTemplateFileName.Len() )
662         {
663             DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Illegal URL!" );
664 
665             SfxStringItem aName( SID_FILE_NAME, aObj.GetMainURL( INetURLObject::NO_DECODE ) );
666             SfxStringItem aTemplName( SID_TEMPLATE_NAME, aTemplateName );
667             SfxStringItem aTemplRegionName( SID_TEMPLATE_REGIONNAME, aTemplateRegion );
668             pRet = GetDispatcher_Impl()->Execute( SID_OPENDOC, eMode, &aName, &aTarget, &aReferer, &aTemplName, &aTemplRegionName, 0L );
669         }
670         else
671         {
672             SfxStringItem aName( SID_FILE_NAME, DEFINE_CONST_UNICODE("private:factory") );
673             pRet = GetDispatcher_Impl()->Execute( SID_OPENDOC, eMode, &aName, &aTarget, &aReferer, 0L );
674         }
675 
676         if ( pRet )
677             rReq.SetReturnValue( *pRet );
678     }
679 }
680 
681 //---------------------------------------------------------------------------
682 
683 void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
684 {
685     DBG_MEMTEST();
686 
687 	sal_uInt16 nSID = rReq.GetSlot();
688     SFX_REQUEST_ARG( rReq, pFileNameItem, SfxStringItem, SID_FILE_NAME, sal_False );
689     if ( pFileNameItem )
690     {
691         String aCommand( pFileNameItem->GetValue() );
692         const SfxSlot* pSlot = GetInterface()->GetSlot( aCommand );
693         if ( pSlot )
694         {
695             pFileNameItem = NULL;
696         }
697         else
698         {
699             sal_Int32 nIndex = aCommand.SearchAscii("slot:");
700             if ( !nIndex )
701             {
702                 sal_uInt16 nSlotId = (sal_uInt16) String( aCommand, 5, aCommand.Len()-5 ).ToInt32();
703                 if ( nSlotId == SID_OPENDOC )
704                     pFileNameItem = NULL;
705             }
706         }
707     }
708 
709     if ( !pFileNameItem )
710     {
711         // get FileName from dialog
712         SvStringsDtor* pURLList = NULL;
713         String aFilter;
714         SfxItemSet* pSet = NULL;
715         String aPath;
716 	    SFX_REQUEST_ARG( rReq, pFolderNameItem, SfxStringItem, SID_PATH, sal_False );
717 		if ( pFolderNameItem )
718 			aPath = pFolderNameItem->GetValue();
719         else if ( nSID == SID_OPENTEMPLATE )
720         {
721 			aPath = SvtPathOptions().GetTemplatePath();
722 			sal_Int32 nTokenCount = aPath.GetTokenCount( ';' );
723             aPath = aPath.GetToken(
724                 sal::static_int_cast< xub_StrLen >(
725                     nTokenCount ? ( nTokenCount - 1 ) : 0 ),
726                 ';' );
727         }
728 
729 		sal_Int16 nDialog = SFX2_IMPL_DIALOG_CONFIG;
730 		SFX_REQUEST_ARG( rReq, pSystemDialogItem, SfxBoolItem, SID_FILE_DIALOG, sal_False );
731 		if ( pSystemDialogItem )
732 			nDialog = pSystemDialogItem->GetValue() ? SFX2_IMPL_DIALOG_SYSTEM : SFX2_IMPL_DIALOG_OOO;
733 
734 		String sStandardDir;
735 
736 		SFX_REQUEST_ARG( rReq, pStandardDirItem, SfxStringItem, SID_STANDARD_DIR, sal_False );
737 		if ( pStandardDirItem )
738 			sStandardDir = pStandardDirItem->GetValue();
739 
740 		::com::sun::star::uno::Sequence< ::rtl::OUString >	aBlackList;
741 
742 		SFX_REQUEST_ARG( rReq, pBlackListItem, SfxStringListItem, SID_BLACK_LIST, sal_False );
743 		if ( pBlackListItem )
744 			pBlackListItem->GetStringList( aBlackList );
745 
746 
747         sal_uIntPtr nErr = sfx2::FileOpenDialog_Impl(
748                 WB_OPEN | SFXWB_MULTISELECTION | SFXWB_SHOWVERSIONS, String(), pURLList, aFilter, pSet, &aPath, nDialog, sStandardDir, aBlackList );
749 
750         if ( nErr == ERRCODE_ABORT )
751         {
752             delete pURLList;
753             return;
754         }
755 
756         rReq.SetArgs( *(SfxAllItemSet*)pSet );
757         if (aFilter.Len() >0 )
758             rReq.AppendItem( SfxStringItem( SID_FILTER_NAME, aFilter ) );
759         rReq.AppendItem( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_default") ) );
760         rReq.AppendItem( SfxStringItem( SID_REFERER, String::CreateFromAscii(SFX_REFERER_USER) ) );
761         delete pSet;
762 
763         if ( pURLList->Count() )
764         {
765     		if ( nSID == SID_OPENTEMPLATE )
766         		rReq.AppendItem( SfxBoolItem( SID_TEMPLATE, sal_False ) );
767 
768             // This helper wraps an existing (or may new created InteractionHandler)
769             // intercept all incoming interactions and provide usefull informations
770             // later if the following transaction was finished.
771 
772             ::framework::PreventDuplicateInteraction*                 pHandler       = new ::framework::PreventDuplicateInteraction(::comphelper::getProcessServiceFactory());
773             css::uno::Reference< css::task::XInteractionHandler >     xHandler       (static_cast< css::task::XInteractionHandler* >(pHandler), css::uno::UNO_QUERY);
774             css::uno::Reference< css::task::XInteractionHandler >     xWrappedHandler;
775 
776             // wrap existing handler or create new UUI handler
777             SFX_REQUEST_ARG(rReq, pInteractionItem, SfxUnoAnyItem, SID_INTERACTIONHANDLER, sal_False);
778             if (pInteractionItem)
779             {
780                 pInteractionItem->GetValue() >>= xWrappedHandler;
781     			rReq.RemoveItem( SID_INTERACTIONHANDLER );
782             }
783             if (xWrappedHandler.is())
784                 pHandler->setHandler(xWrappedHandler);
785             else
786                 pHandler->useDefaultUUIHandler();
787             rReq.AppendItem( SfxUnoAnyItem(SID_INTERACTIONHANDLER,::com::sun::star::uno::makeAny(xHandler)) );
788 
789             // define rules for this handler
790             css::uno::Type                                            aInteraction = ::getCppuType(static_cast< css::task::ErrorCodeRequest* >(0));
791             ::framework::PreventDuplicateInteraction::InteractionInfo aRule        (aInteraction, 1);
792             pHandler->addInteractionRule(aRule);
793 
794             for ( sal_uInt16 i = 0; i < pURLList->Count(); ++i )
795             {
796                 String aURL = *(pURLList->GetObject(i));
797                 rReq.RemoveItem( SID_FILE_NAME );
798                 rReq.AppendItem( SfxStringItem( SID_FILE_NAME, aURL ) );
799 
800                 // synchron ausf"uhren, damit beim Reschedulen nicht schon das n"achste Dokument
801                 // geladen wird
802                 // TODO/LATER: use URLList argument and always remove one document after another, each step in asychronous execution, until finished
803                 // but only if reschedule is a problem
804                 GetDispatcher_Impl()->Execute( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, *rReq.GetArgs() );
805 
806                 // check for special interaction "NO MORE DOCUMENTS ALLOWED" and
807                 // break loop then. Otherwise we risk showing the same interaction more then once.
808                 if ( pHandler->getInteractionInfo(aInteraction, &aRule) )
809                 {
810                     if (aRule.m_nCallCount > 0)
811                     {
812                         if (aRule.m_xRequest.is())
813                         {
814                             css::task::ErrorCodeRequest aRequest;
815                             if (aRule.m_xRequest->getRequest() >>= aRequest)
816                             {
817                                 if (aRequest.ErrCode ==
818                                     sal::static_int_cast< sal_Int32 >(
819                                         ERRCODE_SFX_NOMOREDOCUMENTSALLOWED))
820                                     break;
821                             }
822                         }
823                     }
824                 }
825             }
826 
827             delete pURLList;
828             return;
829         }
830         delete pURLList;
831     }
832 
833     if ( !rReq.IsSynchronCall() )
834     {
835         // now check wether a stream is already there
836         // if not: download it in a thread and restart the call
837         // return;
838     }
839 
840     sal_Bool bHyperlinkUsed = sal_False;
841 
842 	if ( SID_OPENURL == nSID )
843 	{
844         // SID_OPENURL does the same as SID_OPENDOC!
845 		rReq.SetSlot( SID_OPENDOC );
846 		nSID = SID_OPENDOC;
847 	}
848     else if ( nSID == SID_OPENTEMPLATE )
849     {
850         rReq.AppendItem( SfxBoolItem( SID_TEMPLATE, sal_False ) );
851     }
852     // pass URL to OS by using ShellExecuter or open it internal
853     // if it seams to be an own format.
854     /* Attention!
855             There exist two possibilities to open hyperlinks:
856             a) using SID_OPENHYPERLINK (new)
857             b) using SID_BROWSE        (old)
858      */
859     else if ( nSID == SID_OPENHYPERLINK )
860     {
861         rReq.SetSlot( SID_OPENDOC );
862         nSID = SID_OPENDOC;
863         bHyperlinkUsed = sal_True;
864     }
865 
866     // no else here! It's optional ...
867     if (!bHyperlinkUsed)
868     {
869         SFX_REQUEST_ARG(rReq, pHyperLinkUsedItem, SfxBoolItem, SID_BROWSE, sal_False);
870         if ( pHyperLinkUsedItem )
871             bHyperlinkUsed = pHyperLinkUsedItem->GetValue();
872         // no "official" item, so remove it from ItemSet before using UNO-API
873         rReq.RemoveItem( SID_BROWSE );
874     }
875 
876 	SFX_REQUEST_ARG( rReq, pFileName, SfxStringItem, SID_FILE_NAME, sal_False );
877 	String aFileName = pFileName->GetValue();
878 
879     String aReferer;
880     SFX_REQUEST_ARG( rReq, pRefererItem, SfxStringItem, SID_REFERER, sal_False );
881     if ( pRefererItem )
882         aReferer = pRefererItem->GetValue();
883 
884     SFX_REQUEST_ARG( rReq, pFileFlagsItem, SfxStringItem, SID_OPTIONS, sal_False);
885     if ( pFileFlagsItem )
886     {
887         String aFileFlags = pFileFlagsItem->GetValue();
888         aFileFlags.ToUpperAscii();
889         if ( STRING_NOTFOUND != aFileFlags.Search( 0x0054 ) )               // T = 54h
890 		{
891 			rReq.RemoveItem( SID_TEMPLATE );
892             rReq.AppendItem( SfxBoolItem( SID_TEMPLATE, sal_True ) );
893 		}
894 
895         if ( STRING_NOTFOUND != aFileFlags.Search( 0x0048 ) )               // H = 48h
896 		{
897 			rReq.RemoveItem( SID_HIDDEN );
898             rReq.AppendItem( SfxBoolItem( SID_HIDDEN, sal_True ) );
899 		}
900 
901         if ( STRING_NOTFOUND != aFileFlags.Search( 0x0052 ) )               // R = 52h
902 		{
903 			rReq.RemoveItem( SID_DOC_READONLY );
904             rReq.AppendItem( SfxBoolItem( SID_DOC_READONLY, sal_True ) );
905 		}
906 
907         if ( STRING_NOTFOUND != aFileFlags.Search( 0x0042 ) )               // B = 42h
908 		{
909 			rReq.RemoveItem( SID_PREVIEW );
910             rReq.AppendItem( SfxBoolItem( SID_PREVIEW, sal_True ) );
911 		}
912 
913         if ( STRING_NOTFOUND != aFileFlags.Search( 0x0053 ) )               // S = 53h
914 		{
915 			// not supported anymore
916 			//rReq.RemoveItem( SID_SILENT );
917             //rReq.AppendItem( SfxBoolItem( SID_SILENT, sal_True ) );
918 		}
919 
920 		rReq.RemoveItem( SID_OPTIONS );
921     }
922 
923 	// Mark without URL cannot be handled by hyperlink code
924 	if ( bHyperlinkUsed && aFileName.Len() && aFileName.GetChar(0) != '#' )
925 	{
926 		Reference< ::com::sun::star::document::XTypeDetection >	xTypeDetection(
927 																	::comphelper::getProcessServiceFactory()->createInstance(
928 																	::rtl::OUString::createFromAscii( "com.sun.star.document.TypeDetection" )),
929 																	UNO_QUERY );
930 		if ( xTypeDetection.is() )
931 		{
932 			URL				aURL;
933 			::rtl::OUString	aTypeName;
934 
935 			aURL.Complete = aFileName;
936 			Reference < XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance(
937 													::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), UNO_QUERY );
938 			xTrans->parseStrict( aURL );
939 
940 			INetProtocol aINetProtocol = INetURLObject( aURL.Complete ).GetProtocol();
941 			SvtExtendedSecurityOptions aExtendedSecurityOptions;
942 			SvtExtendedSecurityOptions::OpenHyperlinkMode eMode = aExtendedSecurityOptions.GetOpenHyperlinkMode();
943 			if ( eMode == SvtExtendedSecurityOptions::OPEN_WITHSECURITYCHECK )
944 			{
945 				if ( aINetProtocol == INET_PROT_FILE )
946 				{
947 /*!!! pb: #i49802# no security warning any longer
948 					// Check if file URL is a directory. This is not insecure!
949 					osl::Directory aDir( aURL.Main );
950 					sal_Bool bIsDir = ( aDir.open() == osl::Directory::E_None );
951 
952                     if ( !bIsDir && !aExtendedSecurityOptions.IsSecureHyperlink( aURL.Complete ) )
953 					{
954 						// Security check for local files depending on the extension
955 						vos::OGuard aGuard( Application::GetSolarMutex() );
956 						Window *pWindow = SFX_APP()->GetTopWindow();
957 
958 						String aSecurityWarningBoxTitle( SfxResId( RID_SECURITY_WARNING_TITLE ));
959 						WarningBox	aSecurityWarningBox( pWindow, SfxResId( RID_SECURITY_WARNING_HYPERLINK ));
960 						aSecurityWarningBox.SetText( aSecurityWarningBoxTitle );
961 
962 						// Replace %s with the real file name
963 						String aMsgText = aSecurityWarningBox.GetMessText();
964 						String aMainURL( aURL.Main );
965 						String aFileName;
966 
967 						utl::LocalFileHelper::ConvertURLToPhysicalName( aMainURL, aFileName );
968 						aMsgText.SearchAndReplaceAscii( "%s", aFileName );
969 						aSecurityWarningBox.SetMessText( aMsgText );
970 
971 						if( aSecurityWarningBox.Execute() == RET_NO )
972 							return;
973 					}
974 */
975 				}
976 			}
977             else if ( eMode == SvtExtendedSecurityOptions::OPEN_NEVER && aINetProtocol != INET_PROT_VND_SUN_STAR_HELP )
978 			{
979                 vos::OGuard aGuard( Application::GetSolarMutex() );
980                 Window *pWindow = SFX_APP()->GetTopWindow();
981 
982                 String aSecurityWarningBoxTitle( SfxResId( RID_SECURITY_WARNING_TITLE ));
983                 WarningBox  aSecurityWarningBox( pWindow, SfxResId( RID_SECURITY_WARNING_NO_HYPERLINKS ));
984                 aSecurityWarningBox.SetText( aSecurityWarningBoxTitle );
985                 aSecurityWarningBox.Execute();
986 				return;
987 			}
988 
989 			aTypeName = xTypeDetection->queryTypeByURL( aURL.Main );
990 			SfxFilterMatcher& rMatcher = SFX_APP()->GetFilterMatcher();
991 			const SfxFilter* pFilter = rMatcher.GetFilter4EA( aTypeName );
992 			if ( !pFilter || !( pFilter->IsOwnFormat() ))
993 			{
994 				// hyperlink does not link to own type => special handling (http, ftp) browser and (other external protocols) OS
995 				Reference< XSystemShellExecute > xSystemShellExecute( ::comphelper::getProcessServiceFactory()->createInstance(
996 													::rtl::OUString::createFromAscii( "com.sun.star.system.SystemShellExecute" )), UNO_QUERY );
997 				if ( xSystemShellExecute.is() )
998 				{
999 					if ( aINetProtocol == INET_PROT_MAILTO )
1000 					{
1001 						// don't dispatch mailto hyperlink to desktop dispatcher
1002 						rReq.RemoveItem( SID_TARGETNAME );
1003 						rReq.AppendItem( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_self") ) );
1004 					}
1005 					else if ( aINetProtocol == INET_PROT_FTP ||
1006 						 aINetProtocol == INET_PROT_HTTP ||
1007 						 aINetProtocol == INET_PROT_HTTPS )
1008 					{
1009 						try
1010 						{
1011 							// start browser
1012 							::rtl::OUString aURLString( aURL.Complete );
1013 							xSystemShellExecute->execute( aURLString, ::rtl::OUString(), SystemShellExecuteFlags::DEFAULTS );
1014 						}
1015 						catch ( ::com::sun::star::lang::IllegalArgumentException& )
1016 						{
1017 							vos::OGuard aGuard( Application::GetSolarMutex() );
1018                             Window *pWindow = SFX_APP()->GetTopWindow();
1019 							ErrorBox( pWindow, SfxResId( MSG_ERR_NO_WEBBROWSER_FOUND )).Execute();
1020 						}
1021 						catch ( ::com::sun::star::system::SystemShellExecuteException& )
1022 						{
1023 							vos::OGuard aGuard( Application::GetSolarMutex() );
1024                             Window *pWindow = SFX_APP()->GetTopWindow();
1025 							ErrorBox( pWindow, SfxResId( MSG_ERR_NO_WEBBROWSER_FOUND )).Execute();
1026 						}
1027 
1028 						return;
1029 					}
1030 					else
1031 					{
1032 						// check for "internal" protocols that should not be forwarded to the system
1033 						Sequence < ::rtl::OUString > aProtocols(2);
1034 
1035 						// add special protocols that always should be treated as internal
1036 						aProtocols[0] = ::rtl::OUString::createFromAscii("private:*");
1037 						aProtocols[1] = ::rtl::OUString::createFromAscii("vnd.sun.star.*");
1038 
1039 						try
1040 						{
1041 							// get registered protocol handlers from configuration
1042 							Reference < XNameAccess > xAccess( ::comphelper::ConfigurationHelper::openConfig( ::comphelper::getProcessServiceFactory(),
1043 								::rtl::OUString::createFromAscii("org.openoffice.Office.ProtocolHandler/HandlerSet"), ::comphelper::ConfigurationHelper::E_READONLY ), UNO_QUERY );
1044 							if ( xAccess.is() )
1045 							{
1046 								Sequence < ::rtl::OUString > aNames = xAccess->getElementNames();
1047 								for ( sal_Int32 nName = 0; nName < aNames.getLength(); nName ++)
1048 								{
1049 									Reference < XPropertySet > xSet;
1050 									Any aRet = xAccess->getByName( aNames[nName] );
1051 									aRet >>= xSet;
1052 									if ( xSet.is() )
1053 									{
1054 										// copy protocols
1055 										aRet = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("Protocols") );
1056 										Sequence < ::rtl::OUString > aTmp;
1057 										aRet >>= aTmp;
1058 
1059 										// todo: add operator+= to SequenceAsVector class and use SequenceAsVector for aProtocols
1060 										sal_Int32 nLength = aProtocols.getLength();
1061 										aProtocols.realloc( nLength+aTmp.getLength() );
1062 										for ( sal_Int32 n=0; n<aTmp.getLength(); n++ )
1063 											aProtocols[(++nLength)-1] = aTmp[n];
1064 									}
1065 								}
1066 							}
1067 						}
1068 						catch ( Exception& )
1069 						{
1070 							// registered protocols could not be read
1071 						}
1072 
1073 						sal_Bool bFound = sal_False;
1074 						for ( sal_Int32 nProt=0; nProt<aProtocols.getLength(); nProt++ )
1075 						{
1076 							WildCard aPattern(aProtocols[nProt]);
1077 							if ( aPattern.Matches( aURL.Complete ) )
1078 							{
1079 								bFound = sal_True;
1080 								break;
1081 							}
1082 						}
1083 
1084 						if ( !bFound )
1085 						{
1086 							sal_Bool bLoadInternal = sal_False;
1087 
1088 							// security reservation: => we have to check the referer before executing
1089 							if (SFX_APP()->IsSecureURL(rtl::OUString(), &aReferer))
1090 							{
1091 								::rtl::OUString aURLString( aURL.Complete );
1092 
1093 								try
1094 								{
1095 									// give os this file
1096 									xSystemShellExecute->execute( aURLString, ::rtl::OUString(), SystemShellExecuteFlags::DEFAULTS );
1097 								}
1098 								catch ( ::com::sun::star::lang::IllegalArgumentException& )
1099 								{
1100 									vos::OGuard aGuard( Application::GetSolarMutex() );
1101 									Window *pWindow = SFX_APP()->GetTopWindow();
1102 									ErrorBox( pWindow, SfxResId( MSG_ERR_NO_WEBBROWSER_FOUND )).Execute();
1103 								}
1104 								catch ( ::com::sun::star::system::SystemShellExecuteException& )
1105 								{
1106 									if ( !pFilter )
1107 									{
1108 										vos::OGuard aGuard( Application::GetSolarMutex() );
1109 										Window *pWindow = SFX_APP()->GetTopWindow();
1110 										ErrorBox( pWindow, SfxResId( MSG_ERR_NO_WEBBROWSER_FOUND )).Execute();
1111 									}
1112 									else
1113 									{
1114 										rReq.RemoveItem( SID_TARGETNAME );
1115 										rReq.AppendItem( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_default") ) );
1116 										bLoadInternal = sal_True;
1117 									}
1118 								}
1119 							}
1120 							else
1121 							{
1122 								SfxErrorContext aCtx( ERRCTX_SFX_OPENDOC, aURL.Complete );
1123 								ErrorHandler::HandleError( ERRCODE_IO_ACCESSDENIED );
1124 							}
1125 
1126 							if ( !bLoadInternal )
1127 								return;
1128 						}
1129 					}
1130 				}
1131 			}
1132 			else
1133 			{
1134                 // hyperlink document must be loaded into a new frame
1135 				rReq.RemoveItem( SID_TARGETNAME );
1136                 rReq.AppendItem( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_default") ) );
1137 			}
1138 		}
1139 	}
1140 
1141     if ( !SFX_APP()->IsSecureURL( INetURLObject(aFileName), &aReferer ) )
1142     {
1143         SfxErrorContext aCtx( ERRCTX_SFX_OPENDOC, aFileName );
1144         ErrorHandler::HandleError( ERRCODE_IO_ACCESSDENIED );
1145         return;
1146     }
1147 
1148 	SfxFrame* pTargetFrame = NULL;
1149     Reference< XFrame > xTargetFrame;
1150 
1151     SFX_REQUEST_ARG(rReq, pFrameItem, SfxFrameItem, SID_DOCFRAME, sal_False);
1152 	if ( pFrameItem )
1153 		pTargetFrame = pFrameItem->GetFrame();
1154 
1155     if ( !pTargetFrame )
1156     {
1157         SFX_REQUEST_ARG(rReq, pUnoFrameItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False);
1158 	    if ( pUnoFrameItem )
1159 		    xTargetFrame = pUnoFrameItem->GetFrame();
1160     }
1161 
1162     if ( !pTargetFrame && !xTargetFrame.is() && SfxViewFrame::Current() )
1163         pTargetFrame = &SfxViewFrame::Current()->GetFrame();
1164 
1165     // check if caller has set a callback
1166     SFX_REQUEST_ARG(rReq, pLinkItem, SfxLinkItem, SID_DONELINK, sal_False );
1167 
1168 	// remove from Itemset, because it confuses the parameter transformation
1169 	if ( pLinkItem )
1170 		pLinkItem = (SfxLinkItem*) pLinkItem->Clone();
1171 
1172 	rReq.RemoveItem( SID_DONELINK );
1173 
1174     // check if the view must be hidden
1175     sal_Bool bHidden = sal_False;
1176     SFX_REQUEST_ARG(rReq, pHidItem, SfxBoolItem, SID_HIDDEN, sal_False);
1177     if ( pHidItem )
1178         bHidden = pHidItem->GetValue();
1179 
1180     // This request is a UI call. We have to set the right values inside the MediaDescriptor
1181     // for: InteractionHandler, StatusIndicator, MacroExecutionMode and DocTemplate.
1182     // But we have to look for already existing values or for real hidden requests.
1183     SFX_REQUEST_ARG(rReq, pPreviewItem, SfxBoolItem, SID_PREVIEW, sal_False);
1184     if (!bHidden && ( !pPreviewItem || !pPreviewItem->GetValue() ) )
1185     {
1186         SFX_REQUEST_ARG(rReq, pInteractionItem, SfxUnoAnyItem, SID_INTERACTIONHANDLER, sal_False);
1187         SFX_REQUEST_ARG(rReq, pMacroExecItem  , SfxUInt16Item, SID_MACROEXECMODE     , sal_False);
1188         SFX_REQUEST_ARG(rReq, pDocTemplateItem, SfxUInt16Item, SID_UPDATEDOCMODE     , sal_False);
1189 
1190         if (!pInteractionItem)
1191         {
1192             Reference < ::com::sun::star::task::XInteractionHandler > xHdl( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.comp.uui.UUIInteractionHandler")), UNO_QUERY );
1193             if (xHdl.is())
1194                 rReq.AppendItem( SfxUnoAnyItem(SID_INTERACTIONHANDLER,::com::sun::star::uno::makeAny(xHdl)) );
1195         }
1196         if (!pMacroExecItem)
1197             rReq.AppendItem( SfxUInt16Item(SID_MACROEXECMODE,::com::sun::star::document::MacroExecMode::USE_CONFIG) );
1198         if (!pDocTemplateItem)
1199             rReq.AppendItem( SfxUInt16Item(SID_UPDATEDOCMODE,::com::sun::star::document::UpdateDocMode::ACCORDING_TO_CONFIG) );
1200     }
1201 
1202     // extract target name
1203     ::rtl::OUString aTarget;
1204     SFX_REQUEST_ARG(rReq, pTargetItem, SfxStringItem, SID_TARGETNAME, sal_False);
1205     if ( pTargetItem )
1206         aTarget = pTargetItem->GetValue();
1207     else
1208     {
1209         SFX_REQUEST_ARG( rReq, pNewViewItem, SfxBoolItem, SID_OPEN_NEW_VIEW, sal_False );
1210         if ( pNewViewItem && pNewViewItem->GetValue() )
1211             aTarget = String::CreateFromAscii("_blank" );
1212     }
1213 
1214     if ( bHidden )
1215     {
1216         aTarget = String::CreateFromAscii("_blank");
1217         DBG_ASSERT( rReq.IsSynchronCall() || pLinkItem, "Hidden load process must be done synchronously!" );
1218     }
1219 
1220     Reference < XController > xController;
1221 //    if ( ( !bIsBlankTarget && pFrame ) || pLinkItem || !rReq.IsSynchronCall() )
1222 //    {
1223         // if a frame is given, it must be used for the starting point of the targetting mechanism
1224         // this code is also used if asynchronous loading is possible, because loadComponent always is synchron
1225         if ( !xTargetFrame.is() )
1226         {
1227             if ( pTargetFrame )
1228             {
1229                 xTargetFrame = pTargetFrame->GetFrameInterface();
1230             }
1231             else
1232             {
1233                 xTargetFrame.set( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop")), UNO_QUERY );
1234             }
1235         }
1236 
1237         // make URL ready
1238         SFX_REQUEST_ARG( rReq, pURLItem, SfxStringItem, SID_FILE_NAME, sal_False );
1239         aFileName = pURLItem->GetValue();
1240         if( aFileName.Len() && aFileName.GetChar(0) == '#' ) // Mark without URL
1241         {
1242             SfxViewFrame *pView = pTargetFrame ? pTargetFrame->GetCurrentViewFrame() : 0;
1243             if ( !pView )
1244                 pView = SfxViewFrame::Current();
1245             pView->GetViewShell()->JumpToMark( aFileName.Copy(1) );
1246             rReq.SetReturnValue( SfxViewFrameItem( 0, pView ) );
1247             return;
1248         }
1249 
1250         // convert items to properties for framework API calls
1251         Sequence < PropertyValue > aArgs;
1252         TransformItems( SID_OPENDOC, *rReq.GetArgs(), aArgs );
1253 
1254         // TODO/LATER: either remove LinkItem or create an asynchronous process for it
1255         if( bHidden || pLinkItem || rReq.IsSynchronCall() )
1256         {
1257             // if loading must be done synchron, we must wait for completion to get a return value
1258             // find frame by myself; I must konw the exact frame to get the controller for the return value from it
1259             //if( aTarget.getLength() )
1260             //    xTargetFrame = xTargetFrame->findFrame( aTarget, FrameSearchFlag::ALL );
1261             Reference < XComponent > xComp;
1262 
1263             try
1264             {
1265                 xComp = ::comphelper::SynchronousDispatch::dispatch( xTargetFrame, aFileName, aTarget, 0, aArgs );
1266 //                Reference < XComponentLoader > xLoader( xTargetFrame, UNO_QUERY );
1267 //                xComp = xLoader->loadComponentFromURL( aFileName, aTarget, 0, aArgs );
1268             }
1269             catch(const RuntimeException&)
1270             {
1271                 throw;
1272             }
1273             catch(const ::com::sun::star::uno::Exception&)
1274             {
1275             }
1276 
1277             Reference < XModel > xModel( xComp, UNO_QUERY );
1278             if ( xModel.is() )
1279                 xController = xModel->getCurrentController();
1280             else
1281                 xController = Reference < XController >( xComp, UNO_QUERY );
1282 
1283         }
1284         else
1285         {
1286             URL aURL;
1287             aURL.Complete = aFileName;
1288             Reference < XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), UNO_QUERY );
1289             xTrans->parseStrict( aURL );
1290 
1291             Reference < XDispatchProvider > xProv( xTargetFrame, UNO_QUERY );
1292             Reference < XDispatch > xDisp = xProv.is() ? xProv->queryDispatch( aURL, aTarget, FrameSearchFlag::ALL ) : Reference < XDispatch >();;
1293 			RTL_LOGFILE_PRODUCT_CONTEXT( aLog2, "PERFORMANCE - SfxApplication::OpenDocExec_Impl" );
1294             if ( xDisp.is() )
1295                 xDisp->dispatch( aURL, aArgs );
1296         }
1297     /*
1298     }
1299     else
1300     {
1301         // synchron loading without a given frame or as blank frame
1302         SFX_REQUEST_ARG( rReq, pFileNameItem, SfxStringItem, SID_FILE_NAME, sal_False );
1303 
1304         // Desktop service must exists! dont catch() or check for problems here ...
1305         // But loading of documents can fail by other reasons. Handle it more gracefully.
1306         Reference < XComponentLoader > xDesktop( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop")), UNO_QUERY );
1307         Reference < XComponent >       xComp;
1308         try
1309         {
1310             xComp = xDesktop->loadComponentFromURL( pFileNameItem->GetValue(), aTarget, 0, aArgs );
1311         }
1312         catch(const RuntimeException&)
1313         {
1314             throw;
1315         }
1316         catch(const ::com::sun::star::uno::Exception&)
1317         {
1318             xDesktop.clear();
1319             xComp.clear();
1320         }
1321 
1322 		Reference < XModel > xModel( xComp, UNO_QUERY );
1323         if ( xModel.is() )
1324             xController = xModel->getCurrentController();
1325 		else
1326 			xController = Reference < XController >( xComp, UNO_QUERY );
1327     }*/
1328 
1329 	if ( xController.is() )
1330 	{
1331 		// try to find the SfxFrame for the controller
1332 		SfxFrame* pCntrFrame = NULL;
1333 		for ( SfxViewShell* pShell = SfxViewShell::GetFirst( 0, sal_False ); pShell; pShell = SfxViewShell::GetNext( *pShell, 0, sal_False ) )
1334 		{
1335 		    if ( pShell->GetController() == xController )
1336 		    {
1337 		        pCntrFrame = &pShell->GetViewFrame()->GetFrame();
1338 		        break;
1339 		    }
1340 		}
1341 
1342 		if ( pCntrFrame )
1343 		{
1344 		    SfxObjectShell* pSh = pCntrFrame->GetCurrentDocument();
1345 		    DBG_ASSERT( pSh, "Controller without ObjectShell ?!" );
1346 
1347 	        rReq.SetReturnValue( SfxViewFrameItem( 0, pCntrFrame->GetCurrentViewFrame() ) );
1348 
1349 		    if ( bHidden )
1350 		        pSh->RestoreNoDelete();
1351 		}
1352 	}
1353 
1354 	if ( pLinkItem )
1355 	{
1356 		SfxPoolItem* pRet = rReq.GetReturnValue()->Clone();
1357 		pLinkItem->GetValue().Call(pRet);
1358 		delete pLinkItem;
1359 	}
1360 }
1361