xref: /aoo42x/main/sfx2/source/doc/objmisc.cxx (revision 42773270)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sfx2.hxx"
26 
27 #ifndef _INETMSG_HXX //autogen
28 #include <svl/inetmsg.hxx>
29 #endif
30 #include <tools/diagnose_ex.h>
31 #include <svl/eitem.hxx>
32 #include <svl/stritem.hxx>
33 #include <svl/intitem.hxx>
34 #include <svtools/svparser.hxx> // SvKeyValue
35 #include <vos/mutex.hxx>
36 #include <cppuhelper/exc_hlp.hxx>
37 
38 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
39 #include <com/sun/star/document/XDocumentProperties.hpp>
40 #include <com/sun/star/document/UpdateDocMode.hpp>
41 #include <com/sun/star/script/XTypeConverter.hpp>
42 #include <com/sun/star/script/provider/XScriptProviderFactory.hpp>
43 #include <com/sun/star/script/FinishEngineEvent.hpp>
44 #include <com/sun/star/script/InterruptReason.hpp>
45 #include <com/sun/star/script/XEngineListener.hpp>
46 #include <com/sun/star/script/XDebugging.hpp>
47 #ifndef _COM_SUN_STAR_SCRIPT_XINVOKATION_HPP_
48 #include <com/sun/star/script/XInvocation.hpp>
49 #endif
50 #include <com/sun/star/script/ContextInformation.hpp>
51 #include <com/sun/star/script/FinishReason.hpp>
52 #include <com/sun/star/script/XEngine.hpp>
53 #include <com/sun/star/script/InterruptEngineEvent.hpp>
54 #include <com/sun/star/script/XLibraryAccess.hpp>
55 #include <com/sun/star/document/MacroExecMode.hpp>
56 #include <com/sun/star/document/XScriptInvocationContext.hpp>
57 #include <com/sun/star/embed/EmbedStates.hpp>
58 #include <com/sun/star/embed/XEmbedPersist.hpp>
59 #include <com/sun/star/util/XModifiable.hpp>
60 #include <com/sun/star/container/XChild.hpp>
61 #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
62 
63 
64 #include <com/sun/star/script/provider/XScript.hpp>
65 #include <com/sun/star/script/provider/XScriptProvider.hpp>
66 #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
67 
68 #ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
69 #include <toolkit/helper/vclunohelper.hxx>
70 #endif
71 
72 #include <com/sun/star/uno/Reference.h>
73 #include <com/sun/star/uno/Any.h>
74 #include <com/sun/star/ucb/XContent.hpp>
75 #include <com/sun/star/task/ErrorCodeRequest.hpp>
76 #include <unotools/securityoptions.hxx>
77 
78 #include "com/sun/star/uri/XUriReferenceFactory.hpp"
79 #include <com/sun/star/uri/XVndSunStarScriptUrlReference.hpp>
80 
81 #include <comphelper/processfactory.hxx>
82 #include <comphelper/componentcontext.hxx>
83 #include <comphelper/configurationhelper.hxx>
84 
85 #include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
86 #include <com/sun/star/task/DocumentMacroConfirmationRequest.hpp>
87 #include <com/sun/star/task/InteractionClassification.hpp>
88 #include <com/sun/star/frame/XModel.hpp>
89 
90 using namespace ::com::sun::star;
91 using namespace ::com::sun::star::uno;
92 using namespace ::com::sun::star::ucb;
93 using namespace ::com::sun::star::document;
94 using namespace ::com::sun::star::frame;
95 using namespace ::com::sun::star::script;
96 using namespace ::com::sun::star::script::provider;
97 using namespace ::com::sun::star::container;
98 #include <basic/sbuno.hxx>
99 #include <basic/sbstar.hxx>
100 #ifndef _SB_BASMGR_HXX
101 #include <basic/basmgr.hxx>
102 #endif
103 #ifndef _VCL_MSGBOX_HXX
104 #include <vcl/msgbox.hxx>
105 #endif
106 #include <basic/sbx.hxx>
107 #include <svtools/sfxecode.hxx>
108 #include <svtools/ehdl.hxx>
109 
110 #include <unotools/pathoptions.hxx>
111 #include <unotools/ucbhelper.hxx>
112 #include <tools/inetmime.hxx>
113 #include <tools/urlobj.hxx>
114 #include <svl/inettype.hxx>
115 #include <svl/sharecontrolfile.hxx>
116 #include <osl/file.hxx>
117 #include <rtl/bootstrap.hxx>
118 #include <vcl/svapp.hxx>
119 #include <framework/interaction.hxx>
120 #include <framework/documentundoguard.hxx>
121 #include <comphelper/interaction.hxx>
122 #include <comphelper/storagehelper.hxx>
123 #include <comphelper/documentconstants.hxx>
124 
125 #include <sfx2/signaturestate.hxx>
126 #include <sfx2/app.hxx>
127 #include "appdata.hxx"
128 #include <sfx2/request.hxx>
129 #include <sfx2/bindings.hxx>
130 #include "sfx2/sfxresid.hxx"
131 #include <sfx2/docfile.hxx>
132 #include <sfx2/docfilt.hxx>
133 #include <sfx2/objsh.hxx>
134 #include "objshimp.hxx"
135 #include <sfx2/event.hxx>
136 #include "fltfnc.hxx"
137 #include <sfx2/sfx.hrc>
138 #include <sfx2/dispatch.hxx>
139 #include <sfx2/viewfrm.hxx>
140 #include <sfx2/viewsh.hxx>
141 #include <sfx2/ctrlitem.hxx>
142 #include "arrdecl.hxx"
143 #include <sfx2/module.hxx>
144 #include <sfx2/docfac.hxx>
145 #include "helper.hxx"
146 #include "doc.hrc"
147 #include "workwin.hxx"
148 #include "helpid.hrc"
149 #include "../appl/app.hrc"
150 #include <sfx2/sfxdlg.hxx>
151 #include "appbaslib.hxx"
152 #include <openflag.hxx>                 // SFX_STREAM_READWRITE
153 
154 using namespace ::com::sun::star;
155 
156 // class SfxHeaderAttributes_Impl ----------------------------------------
157 
158 class SfxHeaderAttributes_Impl : public SvKeyValueIterator
159 {
160 private:
161 	SfxObjectShell* pDoc;
162 	SvKeyValueIteratorRef xIter;
163 	sal_Bool bAlert;
164 
165 public:
166 	SfxHeaderAttributes_Impl( SfxObjectShell* pSh ) :
167 		SvKeyValueIterator(), pDoc( pSh ),
168 		xIter( pSh->GetMedium()->GetHeaderAttributes_Impl() ),
169 		bAlert( sal_False ) {}
170 
171 	virtual sal_Bool GetFirst( SvKeyValue& rKV ) { return xIter->GetFirst( rKV ); }
172 	virtual sal_Bool GetNext( SvKeyValue& rKV ) { return xIter->GetNext( rKV ); }
173 	virtual void Append( const SvKeyValue& rKV );
174 
175 	void ClearForSourceView() { xIter = new SvKeyValueIterator; bAlert = sal_False; }
176 	void SetAttributes();
177 	void SetAttribute( const SvKeyValue& rKV );
178 };
179 
180 //=========================================================================
181 
182 sal_uInt16 __READONLY_DATA aTitleMap_Impl[3][2] =
183 {
184 								//	local				remote
185 	/*	SFX_TITLE_CAPTION	*/	{ 	SFX_TITLE_FILENAME, SFX_TITLE_TITLE },
186 	/*	SFX_TITLE_PICKLIST  */	{ 	32,					SFX_TITLE_FULLNAME },
187 	/*	SFX_TITLE_HISTORY	*/	{ 	32,					SFX_TITLE_FULLNAME }
188 };
189 
190 //=========================================================================
191 
192 void SfxObjectShell::AbortImport()
193 {
194 	pImp->bIsAbortingImport = sal_True;
195 }
196 
197 //-------------------------------------------------------------------------
198 
199 sal_Bool SfxObjectShell::IsAbortingImport() const
200 {
201 	return pImp->bIsAbortingImport;
202 }
203 
204 //-------------------------------------------------------------------------
205 
206 uno::Reference<document::XDocumentProperties>
207 SfxObjectShell::getDocProperties()
208 {
209     uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
210         GetModel(), uno::UNO_QUERY_THROW);
211     uno::Reference<document::XDocumentProperties> xDocProps(
212         xDPS->getDocumentProperties());
213     DBG_ASSERT(xDocProps.is(),
214         "SfxObjectShell: model has no DocumentProperties");
215     return xDocProps;
216 }
217 
218 //-------------------------------------------------------------------------
219 
220 void SfxObjectShell::DoFlushDocInfo()
221 {
222 }
223 
224 //-------------------------------------------------------------------------
225 
226 // Note: the only thing that calls this is the modification event handler
227 // that is installed at the XDocumentProperties
228 void SfxObjectShell::FlushDocInfo()
229 {
230     if ( IsLoading() )
231         return;
232 
233 	SetModified(sal_True);
234     uno::Reference<document::XDocumentProperties> xDocProps(getDocProperties());
235     DoFlushDocInfo(); // call template method
236     ::rtl::OUString url(xDocProps->getAutoloadURL());
237     sal_Int32 delay(xDocProps->getAutoloadSecs());
238     SetAutoLoad( INetURLObject(url), delay * 1000,
239                  (delay > 0) || url.getLength() );
240 /*
241 	// bitte beachten:
242 	// 1. Titel in DocInfo aber nicht am Doc (nach HTML-Import)
243 	// 	=> auch am Doc setzen
244 	// 2. Titel in DocInfo leer (Briefumschlagsdruck)
245 	//	=> nicht am Doc setzen, da sonst "unbenanntX" daraus wird
246 	String aDocInfoTitle = GetDocInfo().GetTitle();
247 	if ( aDocInfoTitle.Len() )
248 		SetTitle( aDocInfoTitle );
249 	else
250 	{
251 		pImp->aTitle.Erase();
252 		SetNamedVisibility_Impl();
253     	if ( GetMedium() )
254     	{
255         	SfxShell::SetName( GetTitle(SFX_TITLE_APINAME) );
256         	Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
257     	}
258     }*/
259 }
260 
261 //-------------------------------------------------------------------------
262 
263 void SfxObjectShell::SetError( sal_uInt32 lErr, const ::rtl::OUString& aLogMessage )
264 {
265 	if(pImp->lErr==ERRCODE_NONE)
266     {
267 		pImp->lErr=lErr;
268 
269         if( lErr != ERRCODE_NONE && aLogMessage.getLength() )
270             AddLog( aLogMessage );
271     }
272 }
273 
274 //-------------------------------------------------------------------------
275 
276 sal_uInt32 SfxObjectShell::GetError() const
277 {
278 	return ERRCODE_TOERROR(GetErrorCode());
279 }
280 
281 //-------------------------------------------------------------------------
282 
283 sal_uInt32 SfxObjectShell::GetErrorCode() const
284 {
285 	sal_uInt32 lError=pImp->lErr;
286 	if(!lError && GetMedium())
287 		lError=GetMedium()->GetErrorCode();
288 	return lError;
289 }
290 
291 //-------------------------------------------------------------------------
292 
293 void SfxObjectShell::ResetError()
294 {
295     if( pImp->lErr != ERRCODE_NONE )
296         AddLog( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Resetting Error." ) ) );
297 
298 	pImp->lErr=0;
299 	SfxMedium * pMed = GetMedium();
300 	if( pMed )
301 		pMed->ResetError();
302 }
303 
304 //-------------------------------------------------------------------------
305 
306 sal_Bool SfxObjectShell::IsTemplate() const
307 {
308 	return pImp->bIsTemplate;
309 }
310 
311 //-------------------------------------------------------------------------
312 
313 void SfxObjectShell::SetTemplate(sal_Bool bIs)
314 {
315 	pImp->bIsTemplate=bIs;
316 	SfxFilterMatcher aMatcher( GetFactory().GetFactoryName() );
317 	SfxFilterMatcherIter aIter( &aMatcher, SFX_FILTER_TEMPLATEPATH );
318 	SfxMedium* pMed = GetMedium();
319 	if( pMed ) pMed->SetFilter( aIter.First() );
320 }
321 
322 //-------------------------------------------------------------------------
323 
324 void SfxObjectShell::EnableSetModified( sal_Bool bEnable )
325 {
326 #ifdef DBG_UTIL
327     if ( bEnable == pImp->m_bEnableSetModified )
328         DBG_WARNING( "SFX_PERSIST: EnableSetModified 2x mit dem gleichen Wert gerufen" );
329 #endif
330 	pImp->m_bEnableSetModified = bEnable;
331 }
332 
333 //-------------------------------------------------------------------------
334 
335 sal_Bool SfxObjectShell::IsEnableSetModified() const
336 {
337     return pImp->m_bEnableSetModified && !IsReadOnly();
338 }
339 
340 //-------------------------------------------------------------------------
341 
342 sal_Bool SfxObjectShell::IsModified()
343 {
344     if ( pImp->m_bIsModified )
345         return sal_True;
346 
347     if ( !pImp->m_xDocStorage.is() || IsReadOnly() )
348     {
349         // if the document still has no storage and is not set to be modified explicitly it is not modified
350         // a readonly document is also not modified
351 
352         return sal_False;
353     }
354 
355     uno::Sequence < ::rtl::OUString > aNames = GetEmbeddedObjectContainer().GetObjectNames();
356     for ( sal_Int32 n=0; n<aNames.getLength(); n++ )
357     {
358         uno::Reference < embed::XEmbeddedObject > xObj = GetEmbeddedObjectContainer().GetEmbeddedObject( aNames[n] );
359         OSL_ENSURE( xObj.is(), "An empty entry in the embedded objects list!\n" );
360         if ( xObj.is() )
361         {
362             try
363             {
364                 sal_Int32 nState = xObj->getCurrentState();
365                 if ( nState != embed::EmbedStates::LOADED )
366                 {
367                     uno::Reference< util::XModifiable > xModifiable( xObj->getComponent(), uno::UNO_QUERY );
368                     if ( xModifiable.is() && xModifiable->isModified() )
369                         return sal_True;
370                 }
371             }
372             catch( uno::Exception& )
373             {}
374         }
375     }
376 
377     return sal_False;
378 }
379 
380 //-------------------------------------------------------------------------
381 
382 void SfxObjectShell::SetModified( sal_Bool bModifiedP )
383 {
384 #ifdef DBG_UTIL
385     if ( !bModifiedP && !IsEnableSetModified() )
386         DBG_WARNING( "SFX_PERSIST: SetModified( sal_False ), obwohl IsEnableSetModified() == sal_False" );
387 #endif
388 
389 	if( !IsEnableSetModified() )
390 		return;
391 
392 	if( pImp->m_bIsModified != bModifiedP )
393 	{
394 		pImp->m_bIsModified = bModifiedP;
395 		ModifyChanged();
396 	}
397 }
398 
399 //-------------------------------------------------------------------------
400 
401 void SfxObjectShell::ModifyChanged()
402 {
403 	if ( pImp->bClosing )
404 		// SetModified aus dem dispose des Models!
405 		return;
406 
407 	{DBG_CHKTHIS(SfxObjectShell, 0);}
408 
409     SfxViewFrame* pViewFrame = SfxViewFrame::Current();
410     if ( pViewFrame )
411         pViewFrame->GetBindings().Invalidate( SID_SAVEDOCS );
412 
413     Invalidate( SID_SIGNATURE );
414     Invalidate( SID_MACRO_SIGNATURE );
415 	Broadcast( SfxSimpleHint( SFX_HINT_TITLECHANGED ) );	// xmlsec05, signed state might change in title...
416 
417     SFX_APP()->NotifyEvent( SfxEventHint( SFX_EVENT_MODIFYCHANGED, GlobalEventConfig::GetEventName(STR_EVENT_MODIFYCHANGED), this ) );
418 }
419 
420 //-------------------------------------------------------------------------
421 
422 sal_Bool SfxObjectShell::IsReadOnlyUI() const
423 
424 /* 	[Beschreibung]
425 
426 	Liefert sal_True, wenn das Dokument fuer die UI wie r/o behandelt werden
427 	soll. Dieses ist unabhaengig vom tatsaechlichen r/o, welches per
428 	<IsReadOnly()> erfragbar ist.
429 */
430 
431 {
432 	return pImp->bReadOnlyUI;
433 }
434 
435 //-------------------------------------------------------------------------
436 
437 sal_Bool SfxObjectShell::IsReadOnlyMedium() const
438 
439 /* 	[Beschreibung]
440 
441 	Liefert sal_True, wenn das Medium r/o ist bzw. r/o geoeffnet wurde.
442 */
443 
444 {
445 	if ( !pMedium )
446 		return sal_True;
447 	return pMedium->IsReadOnly();
448 }
449 
450 //-------------------------------------------------------------------------
451 
452 void SfxObjectShell::SetReadOnlyUI( sal_Bool bReadOnly )
453 
454 /* 	[Beschreibung]
455 
456 	Schaltet das Dokument in einen r/o bzw. r/w Zustand ohne es neu
457 	zu laden und ohne die Open-Modi des Mediums zu aendern.
458 */
459 
460 {
461 	sal_Bool bWasRO = IsReadOnly();
462 	pImp->bReadOnlyUI = bReadOnly;
463 	if ( bWasRO != IsReadOnly() )
464 	{
465 		Broadcast( SfxSimpleHint(SFX_HINT_MODECHANGED) );
466 		//if ( pImp->pDocInfo )
467 		//	pImp->pDocInfo->SetReadOnly( IsReadOnly() );
468 	}
469 }
470 
471 //-------------------------------------------------------------------------
472 
473 void SfxObjectShell::SetReadOnly()
474 {
475     // Let the document be completely readonly, means that the
476     // medium open mode is adjusted accordingly, and the write lock
477     // on the file is removed.
478 
479  	if ( pMedium && !IsReadOnlyMedium() )
480     {
481         sal_Bool bWasROUI = IsReadOnly();
482 
483         pMedium->UnlockFile( sal_False );
484 
485         // the storage-based mediums are already based on the temporary file
486         // so UnlockFile has already closed the locking stream
487         if ( !pMedium->HasStorage_Impl() && IsLoadingFinished() )
488             pMedium->CloseInStream();
489 
490         pMedium->SetOpenMode( SFX_STREAM_READONLY, pMedium->IsDirect(), sal_True );
491         pMedium->GetItemSet()->Put( SfxBoolItem( SID_DOC_READONLY, sal_True ) );
492 
493         if ( !bWasROUI )
494             Broadcast( SfxSimpleHint(SFX_HINT_MODECHANGED) );
495     }
496 }
497 //-------------------------------------------------------------------------
498 
499 sal_Bool SfxObjectShell::IsReadOnly() const
500 {
501 	return pImp->bReadOnlyUI || IsReadOnlyMedium();
502 }
503 
504 //-------------------------------------------------------------------------
505 
506 sal_Bool SfxObjectShell::IsInModalMode() const
507 {
508     return pImp->bModalMode || pImp->bRunningMacro;
509 }
510 
511 //<!--Added by PengYunQuan for Validity Cell Range Picker
512 sal_Bool SfxObjectShell::AcceptStateUpdate() const
513 {
514 	return !IsInModalMode();
515 }
516 //-->Added by PengYunQuan for Validity Cell Range Picker
517 
518 //-------------------------------------------------------------------------
519 
520 sal_Bool SfxObjectShell::HasModalViews() const
521 {
522 	SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
523 	while( pFrame )
524 	{
525 		if ( pFrame->IsInModalMode() )
526 			return sal_True;
527 
528 		pFrame = SfxViewFrame::GetNext( *pFrame, this );
529 	}
530 
531 	return sal_False;
532 }
533 
534 //-------------------------------------------------------------------------
535 
536 void SfxObjectShell::SetMacroMode_Impl( sal_Bool bModal )
537 {
538     if ( !pImp->bRunningMacro != !bModal )
539 	{
540         pImp->bRunningMacro = bModal;
541 		Broadcast( SfxSimpleHint( SFX_HINT_MODECHANGED ) );
542 	}
543 }
544 
545 //-------------------------------------------------------------------------
546 
547 void SfxObjectShell::SetModalMode_Impl( sal_Bool bModal )
548 {
549 	// nur Broadcasten wenn modifiziert, sonst ggf. Endlosrekursion
550 	if ( !pImp->bModalMode != !bModal )
551 	{
552 		// zentral mitz"ahlen
553 		sal_uInt16 &rDocModalCount = SFX_APP()->Get_Impl()->nDocModalMode;
554 		if ( bModal )
555 			++rDocModalCount;
556 		else
557 			--rDocModalCount;
558 
559 		// umschalten
560 		pImp->bModalMode = bModal;
561 		Broadcast( SfxSimpleHint( SFX_HINT_MODECHANGED ) );
562 	}
563 }
564 
565 //--------------------------------------------------------------------
566 sal_Bool SfxObjectShell::SwitchToShared( sal_Bool bShared, sal_Bool bSave )
567 {
568     sal_Bool bResult = sal_True;
569 
570     if ( bShared != IsDocShared() )
571     {
572         ::rtl::OUString aOrigURL = GetMedium()->GetURLObject().GetMainURL( INetURLObject::NO_DECODE );
573 
574         if ( !aOrigURL.getLength() && bSave )
575         {
576             // this is a new document, let it be stored before switching to the shared mode;
577             // the storing should be done without shared flag, since it is possible that the
578             // target location does not allow to create sharing control file;
579             // the shared flag will be set later after creation of sharing control file
580             SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst( this );
581 
582             if ( pViewFrame )
583             {
584                 // TODO/LATER: currently the application guards against the reentrance problem
585 				const SfxPoolItem* pItem = pViewFrame->GetBindings().ExecuteSynchron( HasName() ? SID_SAVEDOC : SID_SAVEASDOC );
586                 SfxBoolItem* pResult = PTR_CAST( SfxBoolItem, pItem );
587                 bResult = ( pResult && pResult->GetValue() );
588                 if ( bResult )
589                     aOrigURL = GetMedium()->GetURLObject().GetMainURL( INetURLObject::NO_DECODE );
590             }
591         }
592 
593         sal_Bool bOldValue = HasSharedXMLFlagSet();
594         SetSharedXMLFlag( bShared );
595 
596         sal_Bool bRemoveEntryOnError = sal_False;
597         if ( bResult && bShared )
598         {
599             try
600             {
601                 ::svt::ShareControlFile aControlFile( aOrigURL );
602                 aControlFile.InsertOwnEntry();
603                 bRemoveEntryOnError = sal_True;
604             }
605             catch( uno::Exception& )
606             {
607                 bResult = sal_False;
608             }
609         }
610 
611         if ( bResult && bSave )
612         {
613             SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst( this );
614 
615             if ( pViewFrame )
616             {
617                 // TODO/LATER: currently the application guards against the reentrance problem
618                 SetModified( sal_True ); // the modified flag has to be set to let the document be stored with the shared flag
619 				const SfxPoolItem* pItem = pViewFrame->GetBindings().ExecuteSynchron( HasName() ? SID_SAVEDOC : SID_SAVEASDOC );
620                 SfxBoolItem* pResult = PTR_CAST( SfxBoolItem, pItem );
621                 bResult = ( pResult && pResult->GetValue() );
622             }
623         }
624 
625         if ( bResult )
626         {
627             // TODO/LATER: Is it possible that the following calls fail?
628             if ( bShared )
629             {
630                 pImp->m_aSharedFileURL = aOrigURL;
631                 GetMedium()->SwitchDocumentToTempFile();
632             }
633             else
634             {
635                 ::rtl::OUString aTempFileURL = pMedium->GetURLObject().GetMainURL( INetURLObject::NO_DECODE );
636                 GetMedium()->SwitchDocumentToFile( GetSharedFileURL() );
637                 pImp->m_aSharedFileURL = ::rtl::OUString();
638 
639                 // now remove the temporary file the document was based on
640                 ::utl::UCBContentHelper::Kill( aTempFileURL );
641 
642                 try
643                 {
644                     // aOrigURL can not be used since it contains an old value
645                     ::svt::ShareControlFile aControlFile( GetMedium()->GetURLObject().GetMainURL( INetURLObject::NO_DECODE ) );
646                     aControlFile.RemoveFile();
647                 }
648                 catch( uno::Exception& )
649                 {
650                 }
651             }
652         }
653         else
654         {
655             // the saving has failed!
656             if ( bRemoveEntryOnError )
657             {
658                 try
659                 {
660                     ::svt::ShareControlFile aControlFile( aOrigURL );
661                     aControlFile.RemoveEntry();
662                 }
663                 catch( uno::Exception& )
664                 {}
665             }
666 
667             SetSharedXMLFlag( bOldValue );
668         }
669     }
670     else
671         bResult = sal_False; // the second switch to the same mode
672 
673     if ( bResult )
674         SetTitle( String() );
675 
676     return bResult;
677 }
678 
679 //--------------------------------------------------------------------
680 
681 void SfxObjectShell::DisconnectFromShared()
682 {
683     if ( IsDocShared() )
684     {
685         if ( pMedium && pMedium->GetStorage().is() )
686         {
687             // set medium to noname
688             pMedium->SetName( String(), sal_True );
689             pMedium->Init_Impl();
690 
691             // drop resource
692             SetNoName();
693             InvalidateName();
694 
695             // untitled document must be based on temporary storage
696             // the medium should not dispose the storage in this case
697             if ( pMedium->GetStorage() == GetStorage() )
698                 ConnectTmpStorage_Impl( pMedium->GetStorage(), pMedium );
699 
700             pMedium->Close();
701             FreeSharedFile();
702 
703             SfxMedium* pTmpMedium = pMedium;
704             ForgetMedium();
705             if( !DoSaveCompleted( pTmpMedium ) )
706                 SetError( ERRCODE_IO_GENERAL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
707             else
708             {
709                 // the medium should not dispose the storage, DoSaveCompleted() has let it to do so
710                 pMedium->CanDisposeStorage_Impl( sal_False );
711             }
712 
713             pMedium->GetItemSet()->ClearItem( SID_DOC_READONLY );
714             pMedium->SetOpenMode( SFX_STREAM_READWRITE, sal_True, sal_True );
715 
716             SetTitle( String() );
717         }
718     }
719 }
720 
721 //--------------------------------------------------------------------
722 
723 void SfxObjectShell::FreeSharedFile()
724 {
725     if ( pMedium )
726         FreeSharedFile( pMedium->GetURLObject().GetMainURL( INetURLObject::NO_DECODE ) );
727 }
728 
729 //--------------------------------------------------------------------
730 void SfxObjectShell::FreeSharedFile( const ::rtl::OUString& aTempFileURL )
731 {
732     SetSharedXMLFlag( sal_False );
733 
734     if ( IsDocShared() && aTempFileURL.getLength()
735       && !::utl::UCBContentHelper::EqualURLs( aTempFileURL, GetSharedFileURL() ) )
736     {
737         if ( pImp->m_bAllowShareControlFileClean )
738         {
739             try
740             {
741                 ::svt::ShareControlFile aControlFile( GetSharedFileURL() );
742                 aControlFile.RemoveEntry();
743             }
744             catch( uno::Exception& )
745             {
746             }
747         }
748 
749         // the cleaning is forbidden only once
750         pImp->m_bAllowShareControlFileClean = sal_True;
751 
752         // now remove the temporary file the document is based currently on
753         ::utl::UCBContentHelper::Kill( aTempFileURL );
754 
755         pImp->m_aSharedFileURL = ::rtl::OUString();
756     }
757 }
758 
759 //--------------------------------------------------------------------
760 void SfxObjectShell::DoNotCleanShareControlFile()
761 {
762     pImp->m_bAllowShareControlFileClean = sal_False;
763 }
764 
765 //--------------------------------------------------------------------
766 void SfxObjectShell::SetSharedXMLFlag( sal_Bool bFlag ) const
767 {
768     pImp->m_bSharedXMLFlag = bFlag;
769 }
770 
771 //--------------------------------------------------------------------
772 sal_Bool SfxObjectShell::HasSharedXMLFlagSet() const
773 {
774     return pImp->m_bSharedXMLFlag;
775 }
776 
777 //--------------------------------------------------------------------
778 
779 sal_Bool SfxObjectShell::IsDocShared() const
780 {
781     return ( pImp->m_aSharedFileURL.getLength() > 0 );
782 }
783 
784 //--------------------------------------------------------------------
785 
786 ::rtl::OUString SfxObjectShell::GetSharedFileURL() const
787 {
788     return pImp->m_aSharedFileURL;
789 }
790 
791 //--------------------------------------------------------------------
792 
793 Size SfxObjectShell::GetFirstPageSize()
794 {
795     return GetVisArea(ASPECT_THUMBNAIL).GetSize();
796 }
797 
798 
799 //--------------------------------------------------------------------
800 
801 IndexBitSet& SfxObjectShell::GetNoSet_Impl()
802 {
803 	return pImp->aBitSet;
804 }
805 
806 //--------------------------------------------------------------------
807 // changes the title of the document
808 
809 void SfxObjectShell::SetTitle
810 (
811 	const String& rTitle		// der neue Titel des Dokuments
812 )
813 
814 /*	[Beschreibung]
815 
816 	Mit dieser Methode kann der Titel des Dokuments gesetzt werden.
817 	Dieser entspricht initial dem kompletten Dateinamen. Ein Setzen
818 	des Titels wirkt jedoch nicht zu"uck auf den Dateinamen; er wird
819 	jedoch in den Caption-Bars der MDI-Fenster angezeigt.
820 */
821 
822 {
823 	DBG_CHKTHIS(SfxObjectShell, 0);
824 
825 	// nix zu tun?
826 	if ( ( ( HasName() && pImp->aTitle == rTitle )
827 		|| ( !HasName() && GetTitle() == rTitle ) )
828 	  && !IsDocShared() )
829 		return;
830 
831 	SfxApplication *pSfxApp = SFX_APP();
832 #if 0
833 	// wird 'unbenannt#' als Titel gesetzt
834 	String aNoName(SfxResId(STR_NONAME));
835 	if ( rTitle.Match(aNoName) <= aNoName.Len() )
836 	{
837 		// er ist es selbst => ignorieren
838 		pSfxApp->ReleaseIndex(pImp->nVisualDocumentNumber);
839 		pImp->bIsNamedVisible=0;
840 	}
841 #endif
842 
843 	// ggf. die unbenannt-Nummer freigeben
844 	if ( pImp->bIsNamedVisible && USHRT_MAX != pImp->nVisualDocumentNumber )
845 	{
846 		pSfxApp->ReleaseIndex(pImp->nVisualDocumentNumber);
847 		pImp->bIsNamedVisible = 0;
848 	}
849 
850 	// Title setzen
851 	pImp->aTitle = rTitle;
852 //  Wieso denn in der DocInfo?
853 //	GetDocInfo().SetTitle( rTitle );
854 //	FlushDocInfo();
855 
856 	// Benachrichtigungen
857     if ( GetMedium() )
858     {
859         SfxShell::SetName( GetTitle(SFX_TITLE_APINAME) );
860         Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
861     }
862 }
863 
864 //--------------------------------------------------------------------
865 
866 #if OSL_DEBUG_LEVEL > 1
867 String X(const String &rRet)
868 {
869 	if ( !rRet.Len() )
870 		return DEFINE_CONST_UNICODE( "-empty-" );
871 	return rRet;
872 }
873 #else
874 #define X(ret) ret
875 #endif
876 
877 //--------------------------------------------------------------------
878 //--------------------------------------------------------------------
879 String SfxObjectShell::GetTitle
880 (
881 	sal_uInt16	nMaxLength 		/*	0 (default)
882 								der Titel selbst, so wie er ist
883 
884 								1 (==SFX_TITLE_FILENAME)
885 								liefert den logischen Dateinamen ohne Pfad
886 								(unter WNT je nach Systemeinstellung ohne
887 								Extension)
888 
889 								2 (==SFX_TITLE_FULLNAME)
890 								liefert den mit komplettem logischen Dateinamen
891 								mit Pfad (remote => ::com::sun::star::util::URL)
892 
893 								3 (==SFX_TITLE_APINAME)
894 								liefert den logischen Dateinamen ohne Pfad
895 								und Extension
896 
897 								4 (==SFX_TITLE_DETECT)
898 								liefert den kompletten Titel, falls noch
899 								nicht gesetzt wird aber aus DocInfo oder
900 								dem Namen des Medium erzeugt
901 
902 								5 (==SFX_TITLE_CAPTION)
903 								liefert den Titel so, wie MB ihn heute in
904 								der CaptionBar anzeigen m"ochte
905 
906 								6 (==SFX_TITLE_PICKLIST)
907 								liefert den Titel so, wie MB ihn heute in
908 								der PickList anzeigen m"ochte
909 
910 								7 (==SFX_TITLE_HISTORY)
911 								liefert den Titel so, wie MB ihn heute in
912 								der History anzeigen m"ochte
913 
914 								10 bis USHRT_MAX
915 								liefert maximal 'nMaxLength' Zeichen vom logischen
916 								Dateinamen inkl. Pfad (remote => ::com::sun::star::util::URL)
917 								*/
918 ) const
919 
920 /*	[Beschreibung]
921 
922 	Liefert den Titel bzw. logischen Dateinamen des Dokuments, je nach
923 	'nMaxLength'.
924 
925 	Falls der Dateiname mit Pfad verwendet wird, wird die Namensk"urzung durch
926 	Ersetzung eines oder mehrerer Directory-Namen durch "..." durchgef"uhrt,
927 	URLs werden z.Zt. immer komplett geliefert.
928 */
929 
930 {
931 //    if ( GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
932 //        return String();
933     SfxMedium *pMed = GetMedium();
934     if ( IsLoading() )
935         return String();
936 
937 /*    if ( !nMaxLength && pImp->pDocInfo )
938     {
939         String aTitle = pImp->pDocInfo->GetTitle();
940         if ( aTitle.Len() )
941             return aTitle;
942     } */
943 
944 	// Titel erzeugen?
945 	if ( SFX_TITLE_DETECT == nMaxLength && !pImp->aTitle.Len() )
946 	{
947 		static sal_Bool bRecur = sal_False;
948 		if ( bRecur )
949 			return DEFINE_CONST_UNICODE( "-not available-" );
950 		bRecur = sal_True;
951 
952 		String aTitle;
953 		SfxObjectShell *pThis = (SfxObjectShell*) this;
954 
955 		if ( pMed )
956 		{
957 			SFX_ITEMSET_ARG( pMed->GetItemSet(), pNameItem, SfxStringItem, SID_DOCINFO_TITLE, sal_False );
958 			if ( pNameItem )
959 				aTitle = pNameItem->GetValue();
960 		}
961 
962 		if ( !aTitle.Len() )
963 			aTitle = GetTitle( SFX_TITLE_FILENAME );
964 
965 		if ( IsTemplate() )
966 			pThis->SetTitle( aTitle );
967 		bRecur = sal_False;
968 		return X(aTitle);
969 	}
970 	else if (SFX_TITLE_APINAME == nMaxLength )
971 		return X(GetAPIName());
972 
973 	// Sonderfall Vorlagen:
974 	if( IsTemplate() && pImp->aTitle.Len() &&
975 		 ( nMaxLength == SFX_TITLE_CAPTION || nMaxLength == SFX_TITLE_PICKLIST ) )
976 		return X(pImp->aTitle);
977 
978 	// Picklist/Caption wird gemappt
979 	if ( pMed && ( nMaxLength == SFX_TITLE_CAPTION || nMaxLength == SFX_TITLE_PICKLIST ) )
980 	{
981 		// Wenn ein spezieller Titel beim "Offnen mitgegeben wurde;
982 		// wichtig bei URLs, die INET_PROT_FILE verwenden, denn bei denen
983 		// wird der gesetzte Titel nicht beachtet.
984 		// (s.u., Auswertung von aTitleMap_Impl)
985 		SFX_ITEMSET_ARG( pMed->GetItemSet(), pNameItem, SfxStringItem, SID_DOCINFO_TITLE, sal_False );
986 		if ( pNameItem )
987 			return X( pNameItem->GetValue() );
988 	}
989 
990 	// noch unbenannt?
991 	DBG_ASSERT( !HasName() || pMed, "HasName() aber kein Medium?!?" );
992 	if ( !HasName() || !pMed )
993 	{
994 		// schon Titel gesezt?
995 		if ( pImp->aTitle.Len() )
996 			return X(pImp->aTitle);
997 
998 		// mu\s es durchnumeriert werden?
999 		String aNoName( SfxResId( STR_NONAME ) );
1000 		if ( pImp->bIsNamedVisible )
1001 			// Nummer hintenanh"angen
1002 			aNoName += String::CreateFromInt32( pImp->nVisualDocumentNumber );
1003 
1004 		// Dokument hei\st vorerst 'unbenannt#'
1005 		return X(aNoName);
1006 	}
1007 
1008 	const INetURLObject aURL( IsDocShared() ? GetSharedFileURL() : ::rtl::OUString( GetMedium()->GetName() ) );
1009 	if ( nMaxLength > SFX_TITLE_CAPTION && nMaxLength <= SFX_TITLE_HISTORY )
1010 	{
1011 		sal_uInt16 nRemote;
1012 		if( !pMed || aURL.GetProtocol() == INET_PROT_FILE )
1013 			nRemote = 0;
1014 		else
1015 			nRemote = 1;
1016 		nMaxLength = aTitleMap_Impl[nMaxLength-SFX_TITLE_CAPTION][nRemote];
1017 	}
1018 
1019 	// lokale Datei?
1020 	if ( aURL.GetProtocol() == INET_PROT_FILE )
1021 	{
1022         String aName( aURL.HasMark() ? INetURLObject( aURL.GetURLNoMark() ).PathToFileName() : aURL.PathToFileName() );
1023 		if ( nMaxLength == SFX_TITLE_FULLNAME )
1024 			return X( aName );
1025 		else if ( nMaxLength == SFX_TITLE_FILENAME )
1026             return X( aURL.getName( INetURLObject::LAST_SEGMENT,
1027 				true, INetURLObject::DECODE_WITH_CHARSET ) );
1028 		else if ( !pImp->aTitle.Len() )
1029             pImp->aTitle = aURL.getBase( INetURLObject::LAST_SEGMENT,
1030 										 true, INetURLObject::DECODE_WITH_CHARSET );
1031 	}
1032 	else
1033 	{
1034 		// ::com::sun::star::util::URL-Versionen
1035 		if ( nMaxLength >= SFX_TITLE_MAXLEN )
1036 		{
1037             String aComplete( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
1038 			if( aComplete.Len() > nMaxLength )
1039 			{
1040 				String aRet( DEFINE_CONST_UNICODE( "..." ) );
1041 				aRet += aComplete.Copy( aComplete.Len() - nMaxLength + 3, nMaxLength - 3 );
1042 				return X( aRet );
1043 			}
1044 			else
1045                 return X( aComplete );
1046 		}
1047 		else if ( nMaxLength == SFX_TITLE_FILENAME )
1048 		{
1049             String aName( aURL.GetBase() );
1050 			aName = INetURLObject::decode( aName, INET_HEX_ESCAPE, INetURLObject::DECODE_WITH_CHARSET );
1051 			if( !aName.Len() )
1052 				aName = aURL.GetURLNoPass();
1053 			return X(aName);
1054 		}
1055 		else if ( nMaxLength == SFX_TITLE_FULLNAME )
1056 			return X(aURL.GetMainURL( INetURLObject::DECODE_TO_IURI ));
1057 
1058 		// ggf. Titel aus Dateiname generieren
1059 		if ( !pImp->aTitle.Len() )
1060 			pImp->aTitle = aURL.GetBase();
1061 
1062 		// workaround for the case when the name can not be retrieved from URL by INetURLObject
1063 		if ( !pImp->aTitle.Len() )
1064 			pImp->aTitle = aURL.GetMainURL( INetURLObject::DECODE_WITH_CHARSET );
1065 	}
1066 
1067 	// ganzer Titel
1068 	return X(pImp->aTitle);
1069 }
1070 
1071 //--------------------------------------------------------------------
1072 
1073 void SfxObjectShell::InvalidateName()
1074 
1075 /*	[Beschreibung]
1076 
1077 	Ermittelt den Titel des Dokuments neu aus 'unbenannt', DocInfo-Titel
1078 	bzw. Dateinamen. Wird nach Laden aus Template oder SaveAs ben"otigt.
1079 */
1080 
1081 {
1082 	// Title neu erzeugen
1083 	pImp->aTitle.Erase();
1084 //	pImp->nVisualDocumentNumber = USHRT_MAX;
1085 	//GetTitle( SFX_TITLE_DETECT );
1086 	SetName( GetTitle( SFX_TITLE_APINAME ) );
1087 
1088 	// Benachrichtigungen
1089 	Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
1090 }
1091 
1092 //--------------------------------------------------------------------
1093 
1094 void SfxObjectShell::SetNamedVisibility_Impl()
1095 {
1096 	if ( !pImp->bIsNamedVisible )
1097 	{
1098 		// Nummer verpassen
1099 		pImp->bIsNamedVisible = sal_True;
1100 		// ggf. neue Nummer verpassen
1101 		if ( !HasName() && USHRT_MAX == pImp->nVisualDocumentNumber && !pImp->aTitle.Len() )
1102 		{
1103 			pImp->nVisualDocumentNumber = SFX_APP()->GetFreeIndex();
1104 			Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
1105 		}
1106 	}
1107 
1108 	SetName( GetTitle(SFX_TITLE_APINAME) );
1109 }
1110 
1111 void SfxObjectShell::SetNoName()
1112 {
1113     bHasName = 0;
1114     bIsTmp = sal_True;
1115     GetModel()->attachResource( ::rtl::OUString(), GetModel()->getArgs() );
1116 }
1117 
1118 //--------------------------------------------------------------------
1119 
1120 void SfxObjectShell::MemoryError()
1121 {
1122 }
1123 
1124 //--------------------------------------------------------------------
1125 
1126 SfxProgress* SfxObjectShell::GetProgress() const
1127 {
1128 	return pImp->pProgress;
1129 }
1130 
1131 //--------------------------------------------------------------------
1132 
1133 void SfxObjectShell::SetProgress_Impl
1134 (
1135 	SfxProgress *pProgress	/*	zu startender <SfxProgress> oder 0, falls
1136 								der Progress zur"uckgesetzt werden soll */
1137 )
1138 
1139 /*	[Beschreibung]
1140 
1141 	Interne Methode zum setzen oder zur"ucksetzen des Progress-Modes
1142 	f"ur diese SfxObjectShell.
1143 */
1144 
1145 {
1146 	DBG_ASSERT( ( !pImp->pProgress && pProgress ) ||
1147 				( pImp->pProgress && !pProgress ),
1148 				"Progress activation/deacitivation mismatch" );
1149 	pImp->pProgress = pProgress;
1150 }
1151 
1152 //--------------------------------------------------------------------
1153 
1154 void SfxObjectShell::PostActivateEvent_Impl( SfxViewFrame* pFrame )
1155 {
1156 	SfxApplication* pSfxApp = SFX_APP();
1157     if ( !pSfxApp->IsDowning() && !IsLoading() && pFrame && !pFrame->GetFrame().IsClosing_Impl() )
1158 	{
1159         SFX_ITEMSET_ARG( pMedium->GetItemSet(), pHiddenItem, SfxBoolItem, SID_HIDDEN, sal_False );
1160         if ( !pHiddenItem || !pHiddenItem->GetValue() )
1161         {
1162             sal_uInt16 nId = pImp->nEventId;
1163             pImp->nEventId = 0;
1164             if ( nId == SFX_EVENT_OPENDOC )
1165                 pSfxApp->NotifyEvent(SfxViewEventHint( nId, GlobalEventConfig::GetEventName(STR_EVENT_OPENDOC), this, pFrame->GetFrame().GetController() ), sal_False);
1166 			else if (nId == SFX_EVENT_CREATEDOC )
1167                 pSfxApp->NotifyEvent(SfxViewEventHint( nId, GlobalEventConfig::GetEventName(STR_EVENT_CREATEDOC), this, pFrame->GetFrame().GetController() ), sal_False);
1168         }
1169 	}
1170 }
1171 
1172 //--------------------------------------------------------------------
1173 
1174 void SfxObjectShell::SetActivateEvent_Impl(sal_uInt16 nId )
1175 {
1176 	if ( GetFactory().GetFlags() & SFXOBJECTSHELL_HASOPENDOC )
1177 		pImp->nEventId = nId;
1178 }
1179 
1180 //--------------------------------------------------------------------
1181 
1182 void SfxObjectShell::RegisterTransfer( SfxMedium& rMedium )
1183 /*  [Beschreibung ]
1184 	Alle Medien, die aufgesetzt werden, um Teile eines Dokumentes zu
1185 	laden, muessen an der zugehoerigen SfxObjectShell angemeldet
1186 	werden. So kann dokumentweise abgebrochen werden.  */
1187 {
1188 	rMedium.SetReferer( GetMedium()->GetName() );
1189 }
1190 
1191 //-------------------------------------------------------------------------
1192 
1193 void SfxObjectShell::PrepareReload( )
1194 /*  [Beschreibung ]
1195 	Wird vor dem Reload gerufen und gibt die Moeglichkeit,
1196 	etwaige Caches zu leeren. */
1197 {
1198 }
1199 
1200 //-------------------------------------------------------------------------
1201 
1202 void SfxObjectShell::LockAutoLoad( sal_Bool bLock )
1203 
1204 /* 	Verhindert ein evtl. eintreffendes AutoLoad. Wird auch vor AutoLoad
1205 	eines umgebenden FrameSet beruecksichtigt.
1206 */
1207 
1208 {
1209 	if ( bLock )
1210 		++pImp->nAutoLoadLocks;
1211 	else
1212 		--pImp->nAutoLoadLocks;
1213 }
1214 
1215 //-------------------------------------------------------------------------
1216 
1217 // kann nach frame.cxx gemoved werden, wenn 358+36x-Stand gemerged sind
1218 
1219 sal_Bool SfxFrame::IsAutoLoadLocked_Impl() const
1220 {
1221 	// sein einges Doc gelockt?
1222 	const SfxObjectShell* pObjSh = GetCurrentDocument();
1223 	if ( !pObjSh || !pObjSh->IsAutoLoadLocked() )
1224 		return sal_False;
1225 
1226 	// seine Childs gelockt?
1227 	for ( sal_uInt16 n = GetChildFrameCount(); n--; )
1228 		if ( !GetChildFrame(n)->IsAutoLoadLocked_Impl() )
1229 			return sal_False;
1230 
1231 	// sonst ist AutoLoad erlaubt
1232 	return sal_True;
1233 }
1234 
1235 //-------------------------------------------------------------------------
1236 
1237 sal_Bool SfxObjectShell::IsAutoLoadLocked() const
1238 
1239 /* 	Liefert, ob ein eintreffendes AutoLoad ausgefuehrt werden darf. Wird auch
1240 	vor AutoLoad eines umgebenden FrameSet beruecksichtigt.
1241 */
1242 
1243 {
1244 	return !IsReadOnly() || pImp->nAutoLoadLocks > 0;
1245 }
1246 
1247 //-------------------------------------------------------------------------
1248 void SfxObjectShell::BreakMacroSign_Impl( sal_Bool bBreakMacroSign )
1249 {
1250 	pImp->m_bMacroSignBroken = bBreakMacroSign;
1251 }
1252 
1253 //-------------------------------------------------------------------------
1254 void SfxObjectShell::CheckSecurityOnLoading_Impl()
1255 {
1256     uno::Reference< task::XInteractionHandler > xInteraction;
1257     if ( GetMedium() )
1258         xInteraction = GetMedium()->GetInteractionHandler();
1259 
1260 	// check if there is a broken signature...
1261     CheckForBrokenDocSignatures_Impl( xInteraction );
1262 
1263     CheckEncryption_Impl( xInteraction );
1264 
1265     // check macro security
1266     pImp->aMacroMode.checkMacrosOnLoading( xInteraction );
1267 }
1268 
1269 //-------------------------------------------------------------------------
1270 void SfxObjectShell::CheckEncryption_Impl( const uno::Reference< task::XInteractionHandler >& xHandler )
1271 {
1272     ::rtl::OUString aVersion;
1273     sal_Bool bIsEncrypted = sal_False;
1274     sal_Bool bHasNonEncrypted = sal_False;
1275 
1276     try
1277     {
1278         uno::Reference < beans::XPropertySet > xPropSet( GetStorage(), uno::UNO_QUERY_THROW );
1279         xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) >>= aVersion;
1280         xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HasEncryptedEntries" ) ) ) >>= bIsEncrypted;
1281         xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HasNonEncryptedEntries" ) ) ) >>= bHasNonEncrypted;
1282     }
1283     catch( uno::Exception& )
1284     {
1285     }
1286 
1287     if ( aVersion.compareTo( ODFVER_012_TEXT ) >= 0 )
1288     {
1289         // this is ODF1.2 or later
1290         if ( bIsEncrypted && bHasNonEncrypted )
1291         {
1292             if ( !pImp->m_bIncomplEncrWarnShown )
1293             {
1294                 // this is an encrypted document with nonencrypted streams inside, show the warning
1295                 ::com::sun::star::task::ErrorCodeRequest aErrorCode;
1296                 aErrorCode.ErrCode = ERRCODE_SFX_INCOMPLETE_ENCRYPTION;
1297 
1298                 SfxMedium::CallApproveHandler( xHandler, uno::makeAny( aErrorCode ), sal_False );
1299                 pImp->m_bIncomplEncrWarnShown = sal_True;
1300             }
1301 
1302             // broken signatures imply no macro execution at all
1303             pImp->aMacroMode.disallowMacroExecution();
1304         }
1305     }
1306 }
1307 
1308 //-------------------------------------------------------------------------
1309 void SfxObjectShell::CheckForBrokenDocSignatures_Impl( const uno::Reference< task::XInteractionHandler >& xHandler )
1310 {
1311     sal_Int16 nSignatureState = GetDocumentSignatureState();
1312     bool bSignatureBroken = ( nSignatureState == SIGNATURESTATE_SIGNATURES_BROKEN );
1313     if ( !bSignatureBroken )
1314         return;
1315 
1316     pImp->showBrokenSignatureWarning( xHandler );
1317 
1318     // broken signatures imply no macro execution at all
1319     pImp->aMacroMode.disallowMacroExecution();
1320 }
1321 
1322 //-------------------------------------------------------------------------
1323 void SfxObjectShell::SetAutoLoad(
1324 	const INetURLObject& rUrl, sal_uInt32 nTime, sal_Bool bReload )
1325 {
1326 	if ( pImp->pReloadTimer )
1327 		DELETEZ(pImp->pReloadTimer);
1328 	if ( bReload )
1329 	{
1330 		pImp->pReloadTimer = new AutoReloadTimer_Impl(
1331 								rUrl.GetMainURL( INetURLObject::DECODE_TO_IURI ),
1332 								nTime, bReload, this );
1333 		pImp->pReloadTimer->Start();
1334 	}
1335 }
1336 
1337 sal_Bool SfxObjectShell::IsLoadingFinished() const
1338 {
1339 	return ( pImp->nLoadedFlags == SFX_LOADED_ALL );
1340 }
1341 
1342 void impl_addToModelCollection(const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& xModel);
1343 void SfxObjectShell::InitOwnModel_Impl()
1344 {
1345 	if ( !pImp->bModelInitialized )
1346 	{
1347 		SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSalvageItem, SfxStringItem, SID_DOC_SALVAGE, sal_False);
1348 		if ( pSalvageItem )
1349 		{
1350             pImp->aTempName = pMedium->GetPhysicalName();
1351 			pMedium->GetItemSet()->ClearItem( SID_DOC_SALVAGE );
1352 			pMedium->GetItemSet()->ClearItem( SID_FILE_NAME );
1353 			pMedium->GetItemSet()->Put( SfxStringItem( SID_FILE_NAME, pMedium->GetOrigURL() ) );
1354 		}
1355 		else
1356 		{
1357 			pMedium->GetItemSet()->ClearItem( SID_PROGRESS_STATUSBAR_CONTROL );
1358 			pMedium->GetItemSet()->ClearItem( SID_DOCUMENT );
1359 		}
1360 
1361 		pMedium->GetItemSet()->ClearItem( SID_REFERER );
1362 		uno::Reference< frame::XModel >  xModel ( GetModel(), uno::UNO_QUERY );
1363 		if ( xModel.is() )
1364 		{
1365 			::rtl::OUString aURL = GetMedium()->GetOrigURL();
1366 			SfxItemSet *pSet = GetMedium()->GetItemSet();
1367             if ( !GetMedium()->IsReadOnly() )
1368                 pSet->ClearItem( SID_INPUTSTREAM );
1369 			uno::Sequence< beans::PropertyValue > aArgs;
1370 			TransformItems( SID_OPENDOC, *pSet, aArgs );
1371 			xModel->attachResource( aURL, aArgs );
1372             impl_addToModelCollection(xModel);
1373 		}
1374 
1375 		pImp->bModelInitialized = sal_True;
1376 	}
1377 }
1378 
1379 void SfxObjectShell::FinishedLoading( sal_uInt16 nFlags )
1380 {
1381 	sal_Bool bSetModifiedTRUE = sal_False;
1382 	SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSalvageItem, SfxStringItem, SID_DOC_SALVAGE, sal_False );
1383     if( ( nFlags & SFX_LOADED_MAINDOCUMENT ) && !(pImp->nLoadedFlags & SFX_LOADED_MAINDOCUMENT )
1384 	    && !(pImp->nFlagsInProgress & SFX_LOADED_MAINDOCUMENT ))
1385 	{
1386 		pImp->nFlagsInProgress |= SFX_LOADED_MAINDOCUMENT;
1387 		((SfxHeaderAttributes_Impl*)GetHeaderAttributes())->SetAttributes();
1388 		pImp->bImportDone = sal_True;
1389 		if( !IsAbortingImport() )
1390 			PositionView_Impl();
1391 
1392         if ( ( GetModifyPasswordHash() || GetModifyPasswordInfo().getLength() ) && !IsModifyPasswordEntered() )
1393             SetReadOnly();
1394 
1395 		// Salvage
1396 		if ( pSalvageItem )
1397 			bSetModifiedTRUE = sal_True;
1398 
1399 		if ( !IsEnableSetModified() )
1400 			EnableSetModified( sal_True );
1401 
1402 		if( !bSetModifiedTRUE && IsEnableSetModified() )
1403 			SetModified( sal_False );
1404 
1405         CheckSecurityOnLoading_Impl();
1406 
1407 		bHasName = sal_True; // the document is loaded, so the name should already available
1408 		GetTitle( SFX_TITLE_DETECT );
1409 		InitOwnModel_Impl();
1410 		pImp->nFlagsInProgress &= ~SFX_LOADED_MAINDOCUMENT;
1411 	}
1412 
1413     if( ( nFlags & SFX_LOADED_IMAGES ) && !(pImp->nLoadedFlags & SFX_LOADED_IMAGES )
1414 	    && !(pImp->nFlagsInProgress & SFX_LOADED_IMAGES ))
1415 	{
1416 		pImp->nFlagsInProgress |= SFX_LOADED_IMAGES;
1417         uno::Reference<document::XDocumentProperties> xDocProps(
1418             getDocProperties());
1419         ::rtl::OUString url(xDocProps->getAutoloadURL());
1420         sal_Int32 delay(xDocProps->getAutoloadSecs());
1421         SetAutoLoad( INetURLObject(url), delay * 1000,
1422                      (delay > 0) || url.getLength() );
1423 		if( !bSetModifiedTRUE && IsEnableSetModified() )
1424 			SetModified( sal_False );
1425 		Invalidate( SID_SAVEASDOC );
1426 		pImp->nFlagsInProgress &= ~SFX_LOADED_IMAGES;
1427 	}
1428 
1429 	pImp->nLoadedFlags |= nFlags;
1430 
1431 	if ( !pImp->nFlagsInProgress )
1432 	{
1433 		// in case of reentrance calls the first called FinishedLoading() call on the stack
1434 		// should do the notification, in result the notification is done when all the FinishedLoading() calls are finished
1435 
1436 		if ( bSetModifiedTRUE )
1437 			SetModified( sal_True );
1438 		else
1439 			SetModified( sal_False );
1440 
1441 		if ( (pImp->nLoadedFlags & SFX_LOADED_MAINDOCUMENT ) && (pImp->nLoadedFlags & SFX_LOADED_IMAGES ) )
1442 		{
1443             SFX_ITEMSET_ARG( pMedium->GetItemSet(), pTemplateItem, SfxBoolItem, SID_TEMPLATE, sal_False);
1444             sal_Bool bTemplate = pTemplateItem && pTemplateItem->GetValue();
1445 
1446 			// closing the streams on loading should be under control of SFX!
1447 			DBG_ASSERT( pMedium->IsOpen(), "Don't close the medium when loading documents!" );
1448 
1449             if ( bTemplate )
1450             {
1451                 TemplateDisconnectionAfterLoad();
1452             }
1453             else
1454             {
1455                 // if a readonly medium has storage then it's stream is already based on temporary file
1456                 if( !(pMedium->GetOpenMode() & STREAM_WRITE) && !pMedium->HasStorage_Impl() )
1457                     // don't lock file opened read only
1458                     pMedium->CloseInStream();
1459             }
1460 		}
1461 
1462         SetInitialized_Impl( false );
1463 
1464 		// Title is not available until loading has finished
1465 		Broadcast( SfxSimpleHint( SFX_HINT_TITLECHANGED ) );
1466 		if ( pImp->nEventId )
1467 			PostActivateEvent_Impl(SfxViewFrame::GetFirst(this));
1468 	}
1469 }
1470 
1471 //-------------------------------------------------------------------------
1472 extern void SetTemplate_Impl( const String&, const String&, SfxObjectShell* );
1473 
1474 void SfxObjectShell::TemplateDisconnectionAfterLoad()
1475 {
1476     // document is created from a template
1477     //TODO/LATER: should the templates always be XML docs!
1478 
1479     SfxMedium* pTmpMedium = pMedium;
1480     if ( pTmpMedium )
1481     {
1482         String aName( pTmpMedium->GetName() );
1483         SFX_ITEMSET_ARG( pTmpMedium->GetItemSet(), pTemplNamItem, SfxStringItem, SID_TEMPLATE_NAME, sal_False);
1484         String aTemplateName;
1485         if ( pTemplNamItem )
1486             aTemplateName = pTemplNamItem->GetValue();
1487         else
1488         {
1489             // !TODO/LATER: what's this?!
1490             // Interaktiv ( DClick, Contextmenu ) kommt kein Langname mit
1491             aTemplateName = getDocProperties()->getTitle();
1492             if ( !aTemplateName.Len() )
1493             {
1494                 INetURLObject aURL( aName );
1495                 aURL.CutExtension();
1496                 aTemplateName = aURL.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
1497             }
1498         }
1499 
1500         // set medium to noname
1501         pTmpMedium->SetName( String(), sal_True );
1502         pTmpMedium->Init_Impl();
1503 
1504         // drop resource
1505         SetNoName();
1506         InvalidateName();
1507 
1508         if( IsPackageStorageFormat_Impl( *pTmpMedium ) )
1509         {
1510             // untitled document must be based on temporary storage
1511             // the medium should not dispose the storage in this case
1512             uno::Reference < embed::XStorage > xTmpStor = ::comphelper::OStorageHelper::GetTemporaryStorage();
1513             GetStorage()->copyToStorage( xTmpStor );
1514 
1515             // the medium should disconnect from the original location
1516             // the storage should not be disposed since the document is still
1517             // based on it, but in DoSaveCompleted it will be disposed
1518             pTmpMedium->CanDisposeStorage_Impl( sal_False );
1519             pTmpMedium->Close();
1520 
1521             // setting the new storage the medium will be based on
1522             pTmpMedium->SetStorage_Impl( xTmpStor );
1523 
1524             ForgetMedium();
1525             if( !DoSaveCompleted( pTmpMedium ) )
1526                 SetError( ERRCODE_IO_GENERAL, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
1527             else
1528             {
1529                 SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSalvageItem, SfxStringItem, SID_DOC_SALVAGE, sal_False );
1530                 sal_Bool bSalvage = pSalvageItem ? sal_True : sal_False;
1531 
1532                 if ( !bSalvage )
1533                 {
1534                     // some further initializations for templates
1535                     SetTemplate_Impl( aName, aTemplateName, this );
1536                 }
1537 
1538                 // the medium should not dispose the storage, DoSaveCompleted() has let it to do so
1539                 pTmpMedium->CanDisposeStorage_Impl( sal_False );
1540             }
1541         }
1542         else
1543         {
1544             // some further initializations for templates
1545             SetTemplate_Impl( aName, aTemplateName, this );
1546             pTmpMedium->CreateTempFile( sal_True );
1547         }
1548 
1549         // templates are never readonly
1550         pTmpMedium->GetItemSet()->ClearItem( SID_DOC_READONLY );
1551         pTmpMedium->SetOpenMode( SFX_STREAM_READWRITE, sal_True, sal_True );
1552 
1553         // notifications about possible changes in readonly state and document info
1554         Broadcast( SfxSimpleHint(SFX_HINT_MODECHANGED) );
1555 
1556         // created untitled document can't be modified
1557         SetModified( sal_False );
1558     }
1559 }
1560 
1561 //-------------------------------------------------------------------------
1562 
1563 void SfxObjectShell::PositionView_Impl()
1564 {
1565 	MarkData_Impl *pMark = Get_Impl()->pMarkData;
1566 	if( pMark )
1567 	{
1568 		SfxViewShell* pSh = pMark->pFrame->GetViewShell();
1569 		if( pMark->aUserData.Len() )
1570 			pSh->ReadUserData( pMark->aUserData, sal_True );
1571 		else if( pMark->aMark.Len() )
1572 			pSh->JumpToMark( pMark->aMark );
1573 		DELETEZ( Get_Impl()->pMarkData );
1574 	}
1575 }
1576 
1577 //-------------------------------------------------------------------------
1578 
1579 sal_Bool SfxObjectShell::IsLoading() const
1580 /*  [Beschreibung ]
1581 	Has FinishedLoading been called? */
1582 {
1583 	return !( pImp->nLoadedFlags & SFX_LOADED_MAINDOCUMENT );
1584 }
1585 
1586 //-------------------------------------------------------------------------
1587 
1588 void SfxObjectShell::CancelTransfers()
1589 /*  [Beschreibung ]
1590 	Hier koennen Transfers gecanceled werden, die nicht mit
1591 	RegisterTransfer registiert wurden */
1592 {
1593 	if( ( pImp->nLoadedFlags & SFX_LOADED_ALL ) != SFX_LOADED_ALL )
1594 	{
1595 		AbortImport();
1596 		if( IsLoading() )
1597 			FinishedLoading( SFX_LOADED_ALL );
1598 
1599 /*
1600 		SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
1601 		while( pFrame )
1602 		{
1603 			pFrame->CancelTransfers();
1604 			pFrame = SfxViewFrame::GetNext( *pFrame, this );
1605 		}*/
1606 	}
1607 }
1608 
1609 //-------------------------------------------------------------------------
1610 
1611 AutoReloadTimer_Impl::AutoReloadTimer_Impl(
1612 	const String& rURL, sal_uInt32 nTime, sal_Bool bReloadP, SfxObjectShell* pSh )
1613 	: aUrl( rURL ), bReload( bReloadP ), pObjSh( pSh )
1614 {
1615 	SetTimeout( nTime );
1616 }
1617 
1618 //-------------------------------------------------------------------------
1619 
1620 void AutoReloadTimer_Impl::Timeout()
1621 {
1622 	SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pObjSh );
1623 
1624 	if ( pFrame )
1625 	{
1626 		// momentan nicht m"oglich/sinnvoll?
1627         if ( !pObjSh->CanReload_Impl() || pObjSh->IsAutoLoadLocked() || Application::IsUICaptured() )
1628 		{
1629 			// erneuten Versuch erlauben
1630 			Start();
1631 			return;
1632 		}
1633 
1634 		SfxAllItemSet aSet( SFX_APP()->GetPool() );
1635 		aSet.Put( SfxBoolItem( SID_AUTOLOAD, sal_True ) );
1636 		if ( aUrl.Len() )
1637 			aSet.Put(  SfxStringItem( SID_FILE_NAME, aUrl ) );
1638 		SfxRequest aReq( SID_RELOAD, 0, aSet );
1639 		pObjSh->Get_Impl()->pReloadTimer = 0;
1640 		delete this;
1641 		pFrame->ExecReload_Impl( aReq );
1642 		return;
1643 	}
1644 
1645 	pObjSh->Get_Impl()->pReloadTimer = 0;
1646 	delete this;
1647 }
1648 
1649 SfxModule* SfxObjectShell::GetModule() const
1650 {
1651 	return GetFactory().GetModule();
1652 }
1653 
1654 ErrCode SfxObjectShell::CallBasic( const String& rMacro,
1655 	const String& rBasic, SbxArray* pArgs,
1656 	SbxValue* pRet )
1657 {
1658     SfxApplication* pApp = SFX_APP();
1659     if( pApp->GetName() != rBasic )
1660     {
1661         if ( !AdjustMacroMode( String() ) )
1662             return ERRCODE_IO_ACCESSDENIED;
1663     }
1664 
1665     BasicManager *pMgr = GetBasicManager();
1666     if( pApp->GetName() == rBasic )
1667         pMgr = pApp->GetBasicManager();
1668     ErrCode nRet = SfxApplication::CallBasic( rMacro, pMgr, pArgs, pRet );
1669     return nRet;
1670 }
1671 
1672 namespace
1673 {
1674     static bool lcl_isScriptAccessAllowed_nothrow( const Reference< XInterface >& _rxScriptContext )
1675     {
1676         try
1677         {
1678             Reference< XEmbeddedScripts > xScripts( _rxScriptContext, UNO_QUERY );
1679             if ( !xScripts.is() )
1680             {
1681                 Reference< XScriptInvocationContext > xContext( _rxScriptContext, UNO_QUERY_THROW );
1682                 xScripts.set( xContext->getScriptContainer(), UNO_SET_THROW );
1683             }
1684 
1685             return xScripts->getAllowMacroExecution();
1686         }
1687         catch( const Exception& )
1688         {
1689         	DBG_UNHANDLED_EXCEPTION();
1690         }
1691         return false;
1692     }
1693 }
1694 
1695 ErrCode SfxObjectShell::CallXScript( const Reference< XInterface >& _rxScriptContext, const ::rtl::OUString& _rScriptURL,
1696     const Sequence< Any >& aParams, Any& aRet, Sequence< sal_Int16 >& aOutParamIndex, Sequence< Any >& aOutParam, bool bRaiseError )
1697 {
1698     OSL_TRACE( "in CallXScript" );
1699 	ErrCode nErr = ERRCODE_NONE;
1700 
1701 	bool bCaughtException = false;
1702     Any aException;
1703     try
1704     {
1705         uno::Reference< lang::XMultiServiceFactory > xServiceManager( ::comphelper::getProcessServiceFactory(), uno::UNO_SET_THROW );
1706         Reference< uri::XUriReferenceFactory > xFac (
1707             xServiceManager->createInstance( rtl::OUString::createFromAscii(
1708                 "com.sun.star.uri.UriReferenceFactory") ) , UNO_QUERY_THROW );
1709         Reference< uri::XVndSunStarScriptUrlReference > xScriptUri( xFac->parse( _rScriptURL ), UNO_QUERY_THROW );
1710         ::rtl::OUString sLocation = xScriptUri->getParameter( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "location" ) ) );
1711         bool bIsDocumentScript = ( sLocation == ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "document" ) ) );
1712         if ( bIsDocumentScript && !lcl_isScriptAccessAllowed_nothrow( _rxScriptContext ) )
1713             return ERRCODE_IO_ACCESSDENIED;
1714 
1715         // obtain/create a script provider
1716         Reference< provider::XScriptProvider > xScriptProvider;
1717         Reference< provider::XScriptProviderSupplier > xSPS( _rxScriptContext, UNO_QUERY );
1718         if ( xSPS.is() )
1719             xScriptProvider.set( xSPS->getScriptProvider() );
1720 
1721         if ( !xScriptProvider.is() )
1722         {
1723             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
1724             Reference< provider::XScriptProviderFactory > xScriptProviderFactory(
1725                 aContext.getSingleton( "com.sun.star.script.provider.theMasterScriptProviderFactory" ), UNO_QUERY_THROW );
1726             xScriptProvider.set( xScriptProviderFactory->createScriptProvider( makeAny( _rxScriptContext ) ), UNO_SET_THROW );
1727         }
1728 
1729         // ry to protect the invocation context's undo manager (if present), just in case the script tampers with it
1730         ::framework::DocumentUndoGuard aUndoGuard( _rxScriptContext.get() );
1731 
1732         // obtain the script, and execute it
1733         Reference< provider::XScript > xScript( xScriptProvider->getScript( _rScriptURL ), UNO_QUERY_THROW );
1734         aRet = xScript->invoke( aParams, aOutParamIndex, aOutParam );
1735     }
1736     catch ( const uno::Exception& )
1737     {
1738         aException = ::cppu::getCaughtException();
1739 		bCaughtException = sal_True;
1740         nErr = ERRCODE_BASIC_INTERNAL_ERROR;
1741     }
1742 
1743 	if ( bCaughtException && bRaiseError )
1744 	{
1745         ::std::auto_ptr< VclAbstractDialog > pScriptErrDlg;
1746 		SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1747         if ( pFact )
1748             pScriptErrDlg.reset( pFact->CreateScriptErrorDialog( NULL, aException ) );
1749         OSL_ENSURE( pScriptErrDlg.get(), "SfxObjectShell::CallXScript: no script error dialog!" );
1750 
1751         if ( pScriptErrDlg.get() )
1752 			pScriptErrDlg->Execute();
1753 	}
1754 
1755     OSL_TRACE( "leaving CallXScript" );
1756     return nErr;
1757 }
1758 
1759 // perhaps rename to CallScript once we get rid of the existing CallScript
1760 // and Call, CallBasic, CallStarBasic methods
1761 ErrCode SfxObjectShell::CallXScript( const String& rScriptURL,
1762         const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >&
1763             aParams,
1764         ::com::sun::star::uno::Any& aRet,
1765         ::com::sun::star::uno::Sequence< sal_Int16 >& aOutParamIndex,
1766         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aOutParam
1767         , bool bRaiseError )
1768 {
1769     return CallXScript( GetModel(), rScriptURL, aParams, aRet, aOutParamIndex, aOutParam, bRaiseError );
1770 }
1771 
1772 //-------------------------------------------------------------------------
1773 SfxFrame* SfxObjectShell::GetSmartSelf( SfxFrame* pSelf, SfxMedium& /*rMedium*/ )
1774 {
1775 	return pSelf;
1776 }
1777 
1778 SfxObjectShellFlags SfxObjectShell::GetFlags() const
1779 {
1780 	if( pImp->eFlags == SFXOBJECTSHELL_UNDEFINED )
1781 		pImp->eFlags = GetFactory().GetFlags();
1782 	return pImp->eFlags;
1783 }
1784 
1785 void SfxObjectShell::SetFlags( SfxObjectShellFlags eFlags )
1786 {
1787 	pImp->eFlags = eFlags;
1788 }
1789 
1790 void SfxHeaderAttributes_Impl::SetAttributes()
1791 {
1792 	bAlert = sal_True;
1793 	SvKeyValue aPair;
1794 	for( sal_Bool bCont = xIter->GetFirst( aPair ); bCont;
1795 		 bCont = xIter->GetNext( aPair ) )
1796 		SetAttribute( aPair );
1797 }
1798 
1799 void SfxHeaderAttributes_Impl::SetAttribute( const SvKeyValue& rKV )
1800 {
1801 	String aValue = rKV.GetValue();
1802 	if( rKV.GetKey().CompareIgnoreCaseToAscii( "refresh" ) == COMPARE_EQUAL && rKV.GetValue().Len() )
1803 	{
1804 		sal_uInt32 nTime = aValue.GetToken(  0, ';' ).ToInt32() ;
1805 		String aURL = aValue.GetToken( 1, ';' );
1806 		aURL.EraseTrailingChars().EraseLeadingChars();
1807         uno::Reference<document::XDocumentProperties> xDocProps(
1808             pDoc->getDocProperties());
1809 		if( aURL.Copy(0, 4).CompareIgnoreCaseToAscii( "url=" ) == COMPARE_EQUAL )
1810 		{
1811 			INetURLObject aObj;
1812 			INetURLObject( pDoc->GetMedium()->GetName() ).GetNewAbsURL( aURL.Copy( 4 ), &aObj );
1813             xDocProps->setAutoloadURL(
1814                 aObj.GetMainURL( INetURLObject::NO_DECODE ) );
1815 		}
1816         try
1817         {
1818             xDocProps->setAutoloadSecs( nTime );
1819         }
1820         catch (lang::IllegalArgumentException &)
1821         {
1822             // ignore
1823         }
1824 	}
1825 	else if( rKV.GetKey().CompareIgnoreCaseToAscii( "expires" ) == COMPARE_EQUAL )
1826 	{
1827 		DateTime aDateTime;
1828 		if( INetRFC822Message::ParseDateField( rKV.GetValue(), aDateTime ) )
1829 		{
1830 			aDateTime.ConvertToLocalTime();
1831 			pDoc->GetMedium()->SetExpired_Impl( aDateTime );
1832 		}
1833 		else
1834 		{
1835 //			DBG_ERROR( "Schlechtes ::com::sun::star::util::DateTime fuer Expired" );
1836 			pDoc->GetMedium()->SetExpired_Impl( Date( 1, 1, 1970 ) );
1837 		}
1838 	}
1839 	else if( rKV.GetKey().CompareIgnoreCaseToAscii( "content-type" ) == COMPARE_EQUAL )
1840 	{
1841 		::rtl::OString sContent = ::rtl::OUStringToOString( aValue, RTL_TEXTENCODING_ASCII_US );
1842 		ByteString sType, sSubType;
1843 		INetContentTypeParameterList aParameters;
1844 
1845 		if( INetContentTypes::parse( sContent, sType, sSubType, &aParameters ) )
1846 		{
1847 			const INetContentTypeParameter * pCharset = aParameters.find("charset");
1848 			if (pCharset != 0)
1849 				pDoc->GetMedium()->SetCharset( pCharset->m_sValue );
1850 		}
1851 	}
1852 }
1853 
1854 void SfxHeaderAttributes_Impl::Append( const SvKeyValue& rKV )
1855 {
1856 	xIter->Append( rKV );
1857 	if( bAlert ) SetAttribute( rKV );
1858 }
1859 
1860 SvKeyValueIterator* SfxObjectShell::GetHeaderAttributes()
1861 {
1862 	if( !pImp->xHeaderAttributes.Is() )
1863 	{
1864 		DBG_ASSERT( pMedium, "Kein Medium" );
1865 		pImp->xHeaderAttributes = new SfxHeaderAttributes_Impl( this );
1866 	}
1867 	return ( SvKeyValueIterator*) &pImp->xHeaderAttributes;
1868 }
1869 
1870 void SfxObjectShell::ClearHeaderAttributesForSourceViewHack()
1871 {
1872 	((SfxHeaderAttributes_Impl*)GetHeaderAttributes())
1873 		->ClearForSourceView();
1874 }
1875 
1876 
1877 void SfxObjectShell::SetHeaderAttributesForSourceViewHack()
1878 {
1879 	((SfxHeaderAttributes_Impl*)GetHeaderAttributes())
1880 		->SetAttributes();
1881 }
1882 
1883 sal_Bool SfxObjectShell::IsPreview() const
1884 {
1885 	if ( !pMedium )
1886 		return sal_False;
1887 
1888 	sal_Bool bPreview = sal_False;
1889 	SFX_ITEMSET_ARG( pMedium->GetItemSet(), pFlags, SfxStringItem, SID_OPTIONS, sal_False);
1890 	if ( pFlags )
1891 	{
1892 		// Werte auf einzelne Items verteilen
1893 		String aFileFlags = pFlags->GetValue();
1894 		aFileFlags.ToUpperAscii();
1895 		if ( STRING_NOTFOUND != aFileFlags.Search( 'B' ) )
1896 			bPreview = sal_True;
1897 	}
1898 
1899 	if ( !bPreview )
1900 	{
1901 		SFX_ITEMSET_ARG( pMedium->GetItemSet(), pItem, SfxBoolItem, SID_PREVIEW, sal_False);
1902 		if ( pItem )
1903 			bPreview = pItem->GetValue();
1904 	}
1905 
1906 	return bPreview;
1907 }
1908 
1909 sal_Bool SfxObjectShell::IsSecure()
1910 {
1911 	// Wenn globale Warnung an ist, nach Secure-Referer-Liste gehen
1912 	String aReferer = GetMedium()->GetName();
1913 	if ( !aReferer.Len() )
1914 	{
1915 		// bei neuen Dokumenten das Template als Referer nehmen
1916 		::rtl::OUString aTempl( getDocProperties()->getTemplateURL() );
1917 		if ( aTempl.getLength() )
1918             aReferer = INetURLObject( aTempl ).GetMainURL( INetURLObject::NO_DECODE );
1919 	}
1920 
1921 	INetURLObject aURL( "macro:" );
1922     if ( !aReferer.Len() )
1923         // empty new or embedded document
1924         return sal_True;
1925 
1926 		SvtSecurityOptions aOpt;
1927 
1928 	if( aOpt.GetBasicMode() == eALWAYS_EXECUTE )
1929     	return sal_True;
1930 
1931 	if( aOpt.GetBasicMode() == eNEVER_EXECUTE )
1932     	return sal_False;
1933 
1934 	if ( aOpt.IsSecureURL( aURL.GetMainURL( INetURLObject::NO_DECODE ), aReferer ) )
1935     //if ( SvtSecurityOptions().IsSecureURL( aURL.GetMainURL( INetURLObject::NO_DECODE ), aReferer ) )
1936 	{
1937         if ( GetMedium()->GetContent().is() )
1938         {
1939             Any aAny( ::utl::UCBContentHelper::GetProperty( aURL.GetMainURL( INetURLObject::NO_DECODE ), String( RTL_CONSTASCII_USTRINGPARAM("IsProtected")) ) );
1940             sal_Bool bIsProtected = sal_False;
1941             if ( ( aAny >>= bIsProtected ) && bIsProtected )
1942                 return sal_False;
1943             else
1944                 return sal_True;
1945 		}
1946 		else
1947 			return sal_True;
1948 	}
1949 	else
1950 		return sal_False;
1951 }
1952 
1953 void SfxObjectShell::SetWaitCursor( sal_Bool bSet ) const
1954 {
1955     for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this ); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, this ) )
1956     {
1957         if ( bSet )
1958             pFrame->GetFrame().GetWindow().EnterWait();
1959         else
1960             pFrame->GetFrame().GetWindow().LeaveWait();
1961     }
1962 }
1963 
1964 String SfxObjectShell::GetAPIName() const
1965 {
1966 	INetURLObject aURL( IsDocShared() ? GetSharedFileURL() : ::rtl::OUString( GetMedium()->GetName() ) );
1967     String aName( aURL.GetBase() );
1968     if( !aName.Len() )
1969         aName = aURL.GetURLNoPass();
1970     if ( !aName.Len() )
1971         aName = GetTitle( SFX_TITLE_DETECT );
1972     return aName;
1973 }
1974 
1975 void SfxObjectShell::Invalidate( sal_uInt16 nId )
1976 {
1977     for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this ); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, this ) )
1978         Invalidate_Impl( pFrame->GetBindings(), nId );
1979 }
1980 
1981 bool SfxObjectShell::AdjustMacroMode( const String& /*rScriptType*/, bool bSuppressUI )
1982 {
1983     uno::Reference< task::XInteractionHandler > xInteraction;
1984     if ( pMedium && !bSuppressUI )
1985         xInteraction = pMedium->GetInteractionHandler();
1986 
1987     CheckForBrokenDocSignatures_Impl( xInteraction );
1988 
1989     CheckEncryption_Impl( xInteraction );
1990 
1991     return pImp->aMacroMode.adjustMacroMode( xInteraction );
1992 }
1993 
1994 Window* SfxObjectShell::GetDialogParent( SfxMedium* pLoadingMedium )
1995 {
1996     Window* pWindow = 0;
1997     SfxItemSet* pSet = pLoadingMedium ? pLoadingMedium->GetItemSet() : GetMedium()->GetItemSet();
1998     SFX_ITEMSET_ARG( pSet, pUnoItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
1999     if ( pUnoItem )
2000     {
2001         uno::Reference < frame::XFrame > xFrame( pUnoItem->GetFrame() );
2002         pWindow = VCLUnoHelper::GetWindow( xFrame->getContainerWindow() );
2003     }
2004 
2005     if ( !pWindow )
2006     {
2007         SfxFrame* pFrame = 0;
2008         SFX_ITEMSET_ARG( pSet, pFrameItem, SfxFrameItem, SID_DOCFRAME, sal_False );
2009         if( pFrameItem && pFrameItem->GetFrame() )
2010             // get target frame from ItemSet
2011             pFrame = pFrameItem->GetFrame();
2012         else
2013         {
2014             // try the current frame
2015             SfxViewFrame* pView = SfxViewFrame::Current();
2016             if ( !pView || pView->GetObjectShell() != this )
2017                 // get any visible frame
2018                 pView = SfxViewFrame::GetFirst(this);
2019             if ( pView )
2020                 pFrame = &pView->GetFrame();
2021         }
2022 
2023         if ( pFrame )
2024             // get topmost window
2025             pWindow = VCLUnoHelper::GetWindow( pFrame->GetFrameInterface()->getContainerWindow() );
2026     }
2027 
2028     if ( pWindow )
2029     {
2030         // this frame may be invisible, show it if it is allowed
2031         SFX_ITEMSET_ARG( pSet, pHiddenItem, SfxBoolItem, SID_HIDDEN, sal_False );
2032         if ( !pHiddenItem || !pHiddenItem->GetValue() )
2033         {
2034             pWindow->Show();
2035             pWindow->ToTop();
2036         }
2037     }
2038 
2039     return pWindow;
2040 }
2041 
2042 String SfxObjectShell::UpdateTitle( SfxMedium* pMed, sal_uInt16 nDocViewNumber )
2043 {
2044     // Titel des Fensters
2045     String aTitle;
2046     if ( pMed )
2047 	{
2048 		INetURLObject aTmp( pMed->GetName() );
2049         aTitle = aTmp.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
2050 	}
2051     else
2052     {
2053 		pMed = GetMedium();
2054         aTitle = GetTitle(SFX_TITLE_CAPTION);
2055         String aName(aTitle);
2056         if ( nDocViewNumber )
2057         {
2058             aName += ':';
2059             aName += String::CreateFromInt32( nDocViewNumber );
2060         }
2061     }
2062 
2063 	if ( pMed )
2064 	{
2065 		SFX_ITEMSET_ARG( pMed->GetItemSet(), pRepairedDocItem, SfxBoolItem, SID_REPAIRPACKAGE, sal_False );
2066 		if ( pRepairedDocItem && pRepairedDocItem->GetValue() )
2067         	aTitle += String( SfxResId(STR_REPAIREDDOCUMENT) );
2068 	}
2069 
2070 	if ( IsReadOnlyUI() || (pMed && pMed->IsReadOnly()) )
2071         aTitle += String( SfxResId(STR_READONLY) );
2072     else if ( IsDocShared() )
2073         aTitle += String( SfxResId(STR_SHARED) );
2074 
2075     return aTitle;
2076 }
2077 
2078 void SfxObjectShell::SetCreateMode_Impl( SfxObjectCreateMode nMode )
2079 {
2080 	eCreateMode = nMode;
2081 }
2082 
2083 sal_Bool SfxObjectShell::IsInPlaceActive()
2084 {
2085 	if ( eCreateMode != SFX_CREATE_MODE_EMBEDDED )
2086 		return sal_False;
2087 
2088     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
2089     return pFrame && pFrame->GetFrame().IsInPlace();
2090 }
2091 
2092 sal_Bool SfxObjectShell::IsUIActive()
2093 {
2094 	if ( eCreateMode != SFX_CREATE_MODE_EMBEDDED )
2095 		return sal_False;
2096 
2097     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
2098     return pFrame && pFrame->GetFrame().IsInPlace() && pFrame->GetFrame().GetWorkWindow_Impl()->IsVisible_Impl();
2099 }
2100 
2101 void SfxObjectShell::UIActivate( sal_Bool )
2102 {
2103 }
2104 
2105 void SfxObjectShell::InPlaceActivate( sal_Bool )
2106 {
2107 }
2108 
2109 sal_Bool SfxObjectShell::UseInteractionToHandleError(
2110                     const uno::Reference< task::XInteractionHandler >& xHandler,
2111                     sal_uInt32 nError )
2112 {
2113     sal_Bool bResult = sal_False;
2114 
2115     if ( xHandler.is() )
2116     {
2117         try
2118         {
2119             uno::Any aInteraction;
2120             uno::Sequence< uno::Reference< task::XInteractionContinuation > > lContinuations(2);
2121             ::comphelper::OInteractionAbort* pAbort = new ::comphelper::OInteractionAbort();
2122             ::comphelper::OInteractionApprove* pApprove = new ::comphelper::OInteractionApprove();
2123             lContinuations[0] = uno::Reference< task::XInteractionContinuation >(
2124                                  static_cast< task::XInteractionContinuation* >( pAbort ), uno::UNO_QUERY );
2125             lContinuations[1] = uno::Reference< task::XInteractionContinuation >(
2126                                  static_cast< task::XInteractionContinuation* >( pApprove ), uno::UNO_QUERY );
2127 
2128             task::ErrorCodeRequest aErrorCode;
2129             aErrorCode.ErrCode = nError;
2130             aInteraction <<= aErrorCode;
2131             xHandler->handle(::framework::InteractionRequest::CreateRequest (aInteraction,lContinuations));
2132             bResult = pAbort->wasSelected();
2133         }
2134         catch( uno::Exception& )
2135         {}
2136     }
2137 
2138     return bResult;
2139 }
2140 
2141 sal_Bool SfxObjectShell_Impl::NeedsOfficeUpdateDialog()
2142 {
2143     // if the configuration is not available for any reason, the default behavior is to show the message
2144     sal_Bool bResult = sal_True;
2145 
2146     try
2147     {
2148     	uno::Reference< lang::XMultiServiceFactory > xServiceManager( ::comphelper::getProcessServiceFactory(), uno::UNO_SET_THROW );
2149 		uno::Reference< uno::XInterface > xCommonConfig(
2150                         ::comphelper::ConfigurationHelper::openConfig(
2151 							xServiceManager,
2152 							::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common" ) ),
2153 							::comphelper::ConfigurationHelper::E_STANDARD ),
2154                         uno::UNO_SET_THROW );
2155 
2156         ::comphelper::ConfigurationHelper::readRelativeKey(
2157                         xCommonConfig,
2158                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Load/" ) ),
2159                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ShowOfficeUpdateDialog" ) ) ) >>= bResult;
2160     }
2161     catch( uno::Exception& )
2162     {
2163     }
2164 
2165 	return bResult;
2166 }
2167 
2168 sal_Int16 SfxObjectShell_Impl::getCurrentMacroExecMode() const
2169 {
2170     sal_Int16 nImposedExecMode( MacroExecMode::NEVER_EXECUTE );
2171 
2172     const SfxMedium* pMedium( rDocShell.GetMedium() );
2173     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getCurrentMacroExecMode: no medium!" );
2174     if ( pMedium )
2175     {
2176         SFX_ITEMSET_ARG( pMedium->GetItemSet(), pMacroModeItem, SfxUInt16Item, SID_MACROEXECMODE, sal_False);
2177         if ( pMacroModeItem )
2178             nImposedExecMode = pMacroModeItem->GetValue();
2179     }
2180     return nImposedExecMode;
2181 }
2182 
2183 sal_Bool SfxObjectShell_Impl::setCurrentMacroExecMode( sal_uInt16 nMacroMode )
2184 {
2185     const SfxMedium* pMedium( rDocShell.GetMedium() );
2186     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getCurrentMacroExecMode: no medium!" );
2187     if ( pMedium )
2188     {
2189 		pMedium->GetItemSet()->Put( SfxUInt16Item( SID_MACROEXECMODE, nMacroMode ) );
2190         return sal_True;
2191     }
2192 
2193     return sal_False;
2194 }
2195 
2196 ::rtl::OUString SfxObjectShell_Impl::getDocumentLocation() const
2197 {
2198     ::rtl::OUString sLocation;
2199 
2200     const SfxMedium* pMedium( rDocShell.GetMedium() );
2201     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getDocumentLocation: no medium!" );
2202     if ( pMedium )
2203     {
2204         sLocation = pMedium->GetName();
2205         if ( !sLocation.getLength() )
2206         {
2207             // for documents made from a template: get the name of the template
2208             sLocation = rDocShell.getDocProperties()->getTemplateURL();
2209         }
2210     }
2211     return sLocation;
2212 }
2213 
2214 uno::Reference< embed::XStorage > SfxObjectShell_Impl::getZipStorageToSign()
2215 {
2216     Reference < embed::XStorage > xStore;
2217 
2218     SfxMedium* pMedium( rDocShell.GetMedium() );
2219     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getLastCommitDocumentStorage: no medium!" );
2220     if ( pMedium )
2221         xStore = pMedium->GetZipStorageToSign_Impl();
2222 
2223     return xStore;
2224 }
2225 
2226 sal_Bool SfxObjectShell_Impl::documentStorageHasMacros() const
2227 {
2228     return ::sfx2::DocumentMacroMode::storageHasMacros( m_xDocStorage );
2229 }
2230 
2231 Reference< XEmbeddedScripts > SfxObjectShell_Impl::getEmbeddedDocumentScripts() const
2232 {
2233     return Reference< XEmbeddedScripts >( rDocShell.GetModel(), UNO_QUERY );
2234 }
2235 
2236 sal_Int16 SfxObjectShell_Impl::getScriptingSignatureState()
2237 {
2238     sal_Int16 nSignatureState( rDocShell.GetScriptingSignatureState() );
2239 
2240     if ( nSignatureState != SIGNATURESTATE_NOSIGNATURES && m_bMacroSignBroken )
2241     {
2242         // if there is a macro signature it must be handled as broken
2243         nSignatureState = SIGNATURESTATE_SIGNATURES_BROKEN;
2244     }
2245 
2246     return nSignatureState;
2247 }
2248 
2249 sal_Bool SfxObjectShell_Impl::hasTrustedScriptingSignature( sal_Bool bAllowUIToAddAuthor )
2250 {
2251     sal_Bool bResult = sal_False;
2252 
2253     try
2254     {
2255         ::rtl::OUString aVersion;
2256         try
2257         {
2258             uno::Reference < beans::XPropertySet > xPropSet( rDocShell.GetStorage(), uno::UNO_QUERY_THROW );
2259             xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) >>= aVersion;
2260         }
2261         catch( uno::Exception& )
2262         {
2263         }
2264         uno::Sequence< uno::Any > aArgs( 1 );
2265         aArgs[0] <<= aVersion;
2266 
2267         uno::Reference< security::XDocumentDigitalSignatures > xSigner( comphelper::getProcessServiceFactory()->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.security.DocumentDigitalSignatures" ) ), aArgs ), uno::UNO_QUERY_THROW );
2268 
2269         if ( nScriptingSignatureState == SIGNATURESTATE_UNKNOWN
2270           || nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_OK
2271           || nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_NOTVALIDATED )
2272         {
2273             uno::Sequence< security::DocumentSignatureInformation > aInfo = rDocShell.ImplAnalyzeSignature( sal_True, xSigner );
2274 
2275             if ( aInfo.getLength() )
2276             {
2277                 if ( nScriptingSignatureState == SIGNATURESTATE_UNKNOWN )
2278                     nScriptingSignatureState = rDocShell.ImplCheckSignaturesInformation( aInfo );
2279 
2280                 if ( nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_OK
2281                   || nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_NOTVALIDATED )
2282                 {
2283                     for ( sal_Int32 nInd = 0; !bResult && nInd < aInfo.getLength(); nInd++ )
2284                     {
2285                         bResult = xSigner->isAuthorTrusted( aInfo[nInd].Signer );
2286                     }
2287 
2288                     if ( !bResult && bAllowUIToAddAuthor )
2289                     {
2290                         uno::Reference< task::XInteractionHandler > xInteraction;
2291                         if ( rDocShell.GetMedium() )
2292                             xInteraction = rDocShell.GetMedium()->GetInteractionHandler();
2293 
2294                         if ( xInteraction.is() )
2295                         {
2296                             task::DocumentMacroConfirmationRequest aRequest;
2297                             aRequest.DocumentURL = getDocumentLocation();
2298                             aRequest.DocumentStorage = rDocShell.GetMedium()->GetZipStorageToSign_Impl();
2299                             aRequest.DocumentSignatureInformation = aInfo;
2300                             aRequest.DocumentVersion = aVersion;
2301                             aRequest.Classification = task::InteractionClassification_QUERY;
2302                             bResult = SfxMedium::CallApproveHandler( xInteraction, uno::makeAny( aRequest ), sal_True );
2303                         }
2304                     }
2305                 }
2306             }
2307         }
2308     }
2309     catch( uno::Exception& )
2310     {}
2311 
2312     return bResult;
2313 }
2314 
2315 void SfxObjectShell_Impl::showBrokenSignatureWarning( const uno::Reference< task::XInteractionHandler >& _rxInteraction ) const
2316 {
2317     if  ( !bSignatureErrorIsShown )
2318     {
2319         SfxObjectShell::UseInteractionToHandleError( _rxInteraction, ERRCODE_SFX_BROKENSIGNATURE );
2320 	    const_cast< SfxObjectShell_Impl* >( this )->bSignatureErrorIsShown = sal_True;
2321     }
2322 }
2323 
2324 void SfxObjectShell::AddLog( const ::rtl::OUString& aMessage )
2325 {
2326     if ( !pImp->m_xLogRing.is() )
2327     {
2328         try
2329         {
2330             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
2331             if ( aContext.is() )
2332                 pImp->m_xLogRing.set( aContext.getSingleton( "com.sun.star.logging.DocumentIOLogRing" ), UNO_QUERY_THROW );
2333         }
2334         catch( uno::Exception& )
2335         {}
2336     }
2337 
2338     if ( pImp->m_xLogRing.is() )
2339         pImp->m_xLogRing->logString( aMessage );
2340 }
2341 
2342 namespace {
2343 
2344 void WriteStringInStream( const uno::Reference< io::XOutputStream >& xOutStream, const ::rtl::OUString& aString )
2345 {
2346     if ( xOutStream.is() )
2347     {
2348         ::rtl::OString aStrLog = ::rtl::OUStringToOString( aString, RTL_TEXTENCODING_UTF8 );
2349         uno::Sequence< sal_Int8 > aLogData( (const sal_Int8*)aStrLog.getStr(), aStrLog.getLength() );
2350         xOutStream->writeBytes( aLogData );
2351 
2352         aLogData.realloc( 1 );
2353         aLogData[0] = '\n';
2354         xOutStream->writeBytes( aLogData );
2355     }
2356 }
2357 
2358 }
2359 
2360 void SfxObjectShell::StoreLog()
2361 {
2362     if ( !pImp->m_xLogRing.is() )
2363     {
2364         try
2365         {
2366             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
2367             if ( aContext.is() )
2368                 pImp->m_xLogRing.set( aContext.getSingleton( "com.sun.star.logging.DocumentIOLogRing" ), UNO_QUERY_THROW );
2369         }
2370         catch( uno::Exception& )
2371         {}
2372     }
2373 
2374     if ( pImp->m_xLogRing.is() )
2375     {
2376         ::rtl::OUString aFileURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}" ) );
2377 //#ifdef WNT
2378 //        ::rtl::OUString aFileURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}" ) );
2379 //#else
2380 //        ::rtl::OUString aFileURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/bootstraprc:UserInstallation}" ) );
2381 //#endif
2382         ::rtl::Bootstrap::expandMacros( aFileURL );
2383 
2384 //#ifdef WNT
2385 //        ::rtl::OUString aBuildID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/setup.ini:buildid}" ) );
2386 //#else
2387 //        ::rtl::OUString aBuildID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/setuprc:buildid}" ) );
2388 //#endif
2389         ::rtl::OUString aBuildID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("setup") ":buildid}" ) );
2390         ::rtl::Bootstrap::expandMacros( aBuildID );
2391 
2392         if ( aFileURL.getLength() )
2393         {
2394             aFileURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/user/temp/document_io_logring.txt" ) );
2395             try
2396             {
2397                 uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory(), uno::UNO_SET_THROW );
2398                 uno::Reference< ucb::XSimpleFileAccess > xSimpleFileAccess( xFactory->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.ucb.SimpleFileAccess" ) ), uno::UNO_QUERY_THROW );
2399                 uno::Reference< io::XStream > xStream( xSimpleFileAccess->openFileReadWrite( aFileURL ), uno::UNO_SET_THROW );
2400                 uno::Reference< io::XOutputStream > xOutStream( xStream->getOutputStream(), uno::UNO_SET_THROW );
2401                 uno::Reference< io::XTruncate > xTruncate( xOutStream, uno::UNO_QUERY_THROW );
2402                 xTruncate->truncate();
2403 
2404                 if ( aBuildID.getLength() )
2405                     WriteStringInStream( xOutStream, aBuildID );
2406 
2407                 uno::Sequence< ::rtl::OUString > aLogSeq = pImp->m_xLogRing->getCollectedLog();
2408                 for ( sal_Int32 nInd = 0; nInd < aLogSeq.getLength(); nInd++ )
2409                     WriteStringInStream( xOutStream, aLogSeq[nInd] );
2410             }
2411             catch( uno::Exception& )
2412             {}
2413         }
2414     }
2415 }
2416 
2417