xref: /aoo42x/main/sfx2/source/doc/objmisc.cxx (revision 5aea3bf7)
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         if ( !lcl_isScriptAccessAllowed_nothrow( _rxScriptContext ) )
1711             return ERRCODE_IO_ACCESSDENIED;
1712 
1713         // obtain/create a script provider
1714         Reference< provider::XScriptProvider > xScriptProvider;
1715         Reference< provider::XScriptProviderSupplier > xSPS( _rxScriptContext, UNO_QUERY );
1716         if ( xSPS.is() )
1717             xScriptProvider.set( xSPS->getScriptProvider() );
1718 
1719         if ( !xScriptProvider.is() )
1720         {
1721             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
1722             Reference< provider::XScriptProviderFactory > xScriptProviderFactory(
1723                 aContext.getSingleton( "com.sun.star.script.provider.theMasterScriptProviderFactory" ), UNO_QUERY_THROW );
1724             xScriptProvider.set( xScriptProviderFactory->createScriptProvider( makeAny( _rxScriptContext ) ), UNO_SET_THROW );
1725         }
1726 
1727         // ry to protect the invocation context's undo manager (if present), just in case the script tampers with it
1728         ::framework::DocumentUndoGuard aUndoGuard( _rxScriptContext.get() );
1729 
1730         // obtain the script, and execute it
1731         Reference< provider::XScript > xScript( xScriptProvider->getScript( _rScriptURL ), UNO_QUERY_THROW );
1732         aRet = xScript->invoke( aParams, aOutParamIndex, aOutParam );
1733     }
1734     catch ( const uno::Exception& )
1735     {
1736         aException = ::cppu::getCaughtException();
1737 		bCaughtException = sal_True;
1738         nErr = ERRCODE_BASIC_INTERNAL_ERROR;
1739     }
1740 
1741 	if ( bCaughtException && bRaiseError )
1742 	{
1743         ::std::auto_ptr< VclAbstractDialog > pScriptErrDlg;
1744 		SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1745         if ( pFact )
1746             pScriptErrDlg.reset( pFact->CreateScriptErrorDialog( NULL, aException ) );
1747         OSL_ENSURE( pScriptErrDlg.get(), "SfxObjectShell::CallXScript: no script error dialog!" );
1748 
1749         if ( pScriptErrDlg.get() )
1750 			pScriptErrDlg->Execute();
1751 	}
1752 
1753     OSL_TRACE( "leaving CallXScript" );
1754     return nErr;
1755 }
1756 
1757 // perhaps rename to CallScript once we get rid of the existing CallScript
1758 // and Call, CallBasic, CallStarBasic methods
1759 ErrCode SfxObjectShell::CallXScript( const String& rScriptURL,
1760         const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >&
1761             aParams,
1762         ::com::sun::star::uno::Any& aRet,
1763         ::com::sun::star::uno::Sequence< sal_Int16 >& aOutParamIndex,
1764         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aOutParam
1765         , bool bRaiseError )
1766 {
1767     return CallXScript( GetModel(), rScriptURL, aParams, aRet, aOutParamIndex, aOutParam, bRaiseError );
1768 }
1769 
1770 //-------------------------------------------------------------------------
1771 SfxFrame* SfxObjectShell::GetSmartSelf( SfxFrame* pSelf, SfxMedium& /*rMedium*/ )
1772 {
1773 	return pSelf;
1774 }
1775 
1776 SfxObjectShellFlags SfxObjectShell::GetFlags() const
1777 {
1778 	if( pImp->eFlags == SFXOBJECTSHELL_UNDEFINED )
1779 		pImp->eFlags = GetFactory().GetFlags();
1780 	return pImp->eFlags;
1781 }
1782 
1783 void SfxObjectShell::SetFlags( SfxObjectShellFlags eFlags )
1784 {
1785 	pImp->eFlags = eFlags;
1786 }
1787 
1788 void SfxHeaderAttributes_Impl::SetAttributes()
1789 {
1790 	bAlert = sal_True;
1791 	SvKeyValue aPair;
1792 	for( sal_Bool bCont = xIter->GetFirst( aPair ); bCont;
1793 		 bCont = xIter->GetNext( aPair ) )
1794 		SetAttribute( aPair );
1795 }
1796 
1797 void SfxHeaderAttributes_Impl::SetAttribute( const SvKeyValue& rKV )
1798 {
1799 	String aValue = rKV.GetValue();
1800 	if( rKV.GetKey().CompareIgnoreCaseToAscii( "refresh" ) == COMPARE_EQUAL && rKV.GetValue().Len() )
1801 	{
1802 		sal_uInt32 nTime = aValue.GetToken(  0, ';' ).ToInt32() ;
1803 		String aURL = aValue.GetToken( 1, ';' );
1804 		aURL.EraseTrailingChars().EraseLeadingChars();
1805         uno::Reference<document::XDocumentProperties> xDocProps(
1806             pDoc->getDocProperties());
1807 		if( aURL.Copy(0, 4).CompareIgnoreCaseToAscii( "url=" ) == COMPARE_EQUAL )
1808 		{
1809 			INetURLObject aObj;
1810 			INetURLObject( pDoc->GetMedium()->GetName() ).GetNewAbsURL( aURL.Copy( 4 ), &aObj );
1811             xDocProps->setAutoloadURL(
1812                 aObj.GetMainURL( INetURLObject::NO_DECODE ) );
1813 		}
1814         try
1815         {
1816             xDocProps->setAutoloadSecs( nTime );
1817         }
1818         catch (lang::IllegalArgumentException &)
1819         {
1820             // ignore
1821         }
1822 	}
1823 	else if( rKV.GetKey().CompareIgnoreCaseToAscii( "expires" ) == COMPARE_EQUAL )
1824 	{
1825 		DateTime aDateTime;
1826 		if( INetRFC822Message::ParseDateField( rKV.GetValue(), aDateTime ) )
1827 		{
1828 			aDateTime.ConvertToLocalTime();
1829 			pDoc->GetMedium()->SetExpired_Impl( aDateTime );
1830 		}
1831 		else
1832 		{
1833 //			DBG_ERROR( "Schlechtes ::com::sun::star::util::DateTime fuer Expired" );
1834 			pDoc->GetMedium()->SetExpired_Impl( Date( 1, 1, 1970 ) );
1835 		}
1836 	}
1837 	else if( rKV.GetKey().CompareIgnoreCaseToAscii( "content-type" ) == COMPARE_EQUAL )
1838 	{
1839 		::rtl::OString sContent = ::rtl::OUStringToOString( aValue, RTL_TEXTENCODING_ASCII_US );
1840 		ByteString sType, sSubType;
1841 		INetContentTypeParameterList aParameters;
1842 
1843 		if( INetContentTypes::parse( sContent, sType, sSubType, &aParameters ) )
1844 		{
1845 			const INetContentTypeParameter * pCharset = aParameters.find("charset");
1846 			if (pCharset != 0)
1847 				pDoc->GetMedium()->SetCharset( pCharset->m_sValue );
1848 		}
1849 	}
1850 }
1851 
1852 void SfxHeaderAttributes_Impl::Append( const SvKeyValue& rKV )
1853 {
1854 	xIter->Append( rKV );
1855 	if( bAlert ) SetAttribute( rKV );
1856 }
1857 
1858 SvKeyValueIterator* SfxObjectShell::GetHeaderAttributes()
1859 {
1860 	if( !pImp->xHeaderAttributes.Is() )
1861 	{
1862 		DBG_ASSERT( pMedium, "Kein Medium" );
1863 		pImp->xHeaderAttributes = new SfxHeaderAttributes_Impl( this );
1864 	}
1865 	return ( SvKeyValueIterator*) &pImp->xHeaderAttributes;
1866 }
1867 
1868 void SfxObjectShell::ClearHeaderAttributesForSourceViewHack()
1869 {
1870 	((SfxHeaderAttributes_Impl*)GetHeaderAttributes())
1871 		->ClearForSourceView();
1872 }
1873 
1874 
1875 void SfxObjectShell::SetHeaderAttributesForSourceViewHack()
1876 {
1877 	((SfxHeaderAttributes_Impl*)GetHeaderAttributes())
1878 		->SetAttributes();
1879 }
1880 
1881 sal_Bool SfxObjectShell::IsPreview() const
1882 {
1883 	if ( !pMedium )
1884 		return sal_False;
1885 
1886 	sal_Bool bPreview = sal_False;
1887 	SFX_ITEMSET_ARG( pMedium->GetItemSet(), pFlags, SfxStringItem, SID_OPTIONS, sal_False);
1888 	if ( pFlags )
1889 	{
1890 		// Werte auf einzelne Items verteilen
1891 		String aFileFlags = pFlags->GetValue();
1892 		aFileFlags.ToUpperAscii();
1893 		if ( STRING_NOTFOUND != aFileFlags.Search( 'B' ) )
1894 			bPreview = sal_True;
1895 	}
1896 
1897 	if ( !bPreview )
1898 	{
1899 		SFX_ITEMSET_ARG( pMedium->GetItemSet(), pItem, SfxBoolItem, SID_PREVIEW, sal_False);
1900 		if ( pItem )
1901 			bPreview = pItem->GetValue();
1902 	}
1903 
1904 	return bPreview;
1905 }
1906 
1907 sal_Bool SfxObjectShell::IsSecure()
1908 {
1909 	// Wenn globale Warnung an ist, nach Secure-Referer-Liste gehen
1910 	String aReferer = GetMedium()->GetName();
1911 	if ( !aReferer.Len() )
1912 	{
1913 		// bei neuen Dokumenten das Template als Referer nehmen
1914 		::rtl::OUString aTempl( getDocProperties()->getTemplateURL() );
1915 		if ( aTempl.getLength() )
1916             aReferer = INetURLObject( aTempl ).GetMainURL( INetURLObject::NO_DECODE );
1917 	}
1918 
1919 	INetURLObject aURL( "macro:" );
1920     if ( !aReferer.Len() )
1921         // empty new or embedded document
1922         return sal_True;
1923 
1924 		SvtSecurityOptions aOpt;
1925 
1926 	if( aOpt.GetBasicMode() == eALWAYS_EXECUTE )
1927     	return sal_True;
1928 
1929 	if( aOpt.GetBasicMode() == eNEVER_EXECUTE )
1930     	return sal_False;
1931 
1932 	if ( aOpt.IsSecureURL( aURL.GetMainURL( INetURLObject::NO_DECODE ), aReferer ) )
1933     //if ( SvtSecurityOptions().IsSecureURL( aURL.GetMainURL( INetURLObject::NO_DECODE ), aReferer ) )
1934 	{
1935         if ( GetMedium()->GetContent().is() )
1936         {
1937             Any aAny( ::utl::UCBContentHelper::GetProperty( aURL.GetMainURL( INetURLObject::NO_DECODE ), String( RTL_CONSTASCII_USTRINGPARAM("IsProtected")) ) );
1938             sal_Bool bIsProtected = sal_False;
1939             if ( ( aAny >>= bIsProtected ) && bIsProtected )
1940                 return sal_False;
1941             else
1942                 return sal_True;
1943 		}
1944 		else
1945 			return sal_True;
1946 	}
1947 	else
1948 		return sal_False;
1949 }
1950 
1951 void SfxObjectShell::SetWaitCursor( sal_Bool bSet ) const
1952 {
1953     for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this ); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, this ) )
1954     {
1955         if ( bSet )
1956             pFrame->GetFrame().GetWindow().EnterWait();
1957         else
1958             pFrame->GetFrame().GetWindow().LeaveWait();
1959     }
1960 }
1961 
1962 String SfxObjectShell::GetAPIName() const
1963 {
1964 	INetURLObject aURL( IsDocShared() ? GetSharedFileURL() : ::rtl::OUString( GetMedium()->GetName() ) );
1965     String aName( aURL.GetBase() );
1966     if( !aName.Len() )
1967         aName = aURL.GetURLNoPass();
1968     if ( !aName.Len() )
1969         aName = GetTitle( SFX_TITLE_DETECT );
1970     return aName;
1971 }
1972 
1973 void SfxObjectShell::Invalidate( sal_uInt16 nId )
1974 {
1975     for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this ); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, this ) )
1976         Invalidate_Impl( pFrame->GetBindings(), nId );
1977 }
1978 
1979 bool SfxObjectShell::AdjustMacroMode( const String& /*rScriptType*/, bool bSuppressUI )
1980 {
1981     uno::Reference< task::XInteractionHandler > xInteraction;
1982     if ( pMedium && !bSuppressUI )
1983         xInteraction = pMedium->GetInteractionHandler();
1984 
1985     CheckForBrokenDocSignatures_Impl( xInteraction );
1986 
1987     CheckEncryption_Impl( xInteraction );
1988 
1989     return pImp->aMacroMode.adjustMacroMode( xInteraction );
1990 }
1991 
1992 Window* SfxObjectShell::GetDialogParent( SfxMedium* pLoadingMedium )
1993 {
1994     Window* pWindow = 0;
1995     SfxItemSet* pSet = pLoadingMedium ? pLoadingMedium->GetItemSet() : GetMedium()->GetItemSet();
1996     SFX_ITEMSET_ARG( pSet, pUnoItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
1997     if ( pUnoItem )
1998     {
1999         uno::Reference < frame::XFrame > xFrame( pUnoItem->GetFrame() );
2000         pWindow = VCLUnoHelper::GetWindow( xFrame->getContainerWindow() );
2001     }
2002 
2003     if ( !pWindow )
2004     {
2005         SfxFrame* pFrame = 0;
2006         SFX_ITEMSET_ARG( pSet, pFrameItem, SfxFrameItem, SID_DOCFRAME, sal_False );
2007         if( pFrameItem && pFrameItem->GetFrame() )
2008             // get target frame from ItemSet
2009             pFrame = pFrameItem->GetFrame();
2010         else
2011         {
2012             // try the current frame
2013             SfxViewFrame* pView = SfxViewFrame::Current();
2014             if ( !pView || pView->GetObjectShell() != this )
2015                 // get any visible frame
2016                 pView = SfxViewFrame::GetFirst(this);
2017             if ( pView )
2018                 pFrame = &pView->GetFrame();
2019         }
2020 
2021         if ( pFrame )
2022             // get topmost window
2023             pWindow = VCLUnoHelper::GetWindow( pFrame->GetFrameInterface()->getContainerWindow() );
2024     }
2025 
2026     if ( pWindow )
2027     {
2028         // this frame may be invisible, show it if it is allowed
2029         SFX_ITEMSET_ARG( pSet, pHiddenItem, SfxBoolItem, SID_HIDDEN, sal_False );
2030         if ( !pHiddenItem || !pHiddenItem->GetValue() )
2031         {
2032             pWindow->Show();
2033             pWindow->ToTop();
2034         }
2035     }
2036 
2037     return pWindow;
2038 }
2039 
2040 String SfxObjectShell::UpdateTitle( SfxMedium* pMed, sal_uInt16 nDocViewNumber )
2041 {
2042     // Titel des Fensters
2043     String aTitle;
2044     if ( pMed )
2045 	{
2046 		INetURLObject aTmp( pMed->GetName() );
2047         aTitle = aTmp.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET );
2048 	}
2049     else
2050     {
2051 		pMed = GetMedium();
2052         aTitle = GetTitle(SFX_TITLE_CAPTION);
2053         String aName(aTitle);
2054         if ( nDocViewNumber )
2055         {
2056             aName += ':';
2057             aName += String::CreateFromInt32( nDocViewNumber );
2058         }
2059     }
2060 
2061 	if ( pMed )
2062 	{
2063 		SFX_ITEMSET_ARG( pMed->GetItemSet(), pRepairedDocItem, SfxBoolItem, SID_REPAIRPACKAGE, sal_False );
2064 		if ( pRepairedDocItem && pRepairedDocItem->GetValue() )
2065         	aTitle += String( SfxResId(STR_REPAIREDDOCUMENT) );
2066 	}
2067 
2068 	if ( IsReadOnlyUI() || (pMed && pMed->IsReadOnly()) )
2069         aTitle += String( SfxResId(STR_READONLY) );
2070     else if ( IsDocShared() )
2071         aTitle += String( SfxResId(STR_SHARED) );
2072 
2073     return aTitle;
2074 }
2075 
2076 void SfxObjectShell::SetCreateMode_Impl( SfxObjectCreateMode nMode )
2077 {
2078 	eCreateMode = nMode;
2079 }
2080 
2081 sal_Bool SfxObjectShell::IsInPlaceActive()
2082 {
2083 	if ( eCreateMode != SFX_CREATE_MODE_EMBEDDED )
2084 		return sal_False;
2085 
2086     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
2087     return pFrame && pFrame->GetFrame().IsInPlace();
2088 }
2089 
2090 sal_Bool SfxObjectShell::IsUIActive()
2091 {
2092 	if ( eCreateMode != SFX_CREATE_MODE_EMBEDDED )
2093 		return sal_False;
2094 
2095     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
2096     return pFrame && pFrame->GetFrame().IsInPlace() && pFrame->GetFrame().GetWorkWindow_Impl()->IsVisible_Impl();
2097 }
2098 
2099 void SfxObjectShell::UIActivate( sal_Bool )
2100 {
2101 }
2102 
2103 void SfxObjectShell::InPlaceActivate( sal_Bool )
2104 {
2105 }
2106 
2107 sal_Bool SfxObjectShell::UseInteractionToHandleError(
2108                     const uno::Reference< task::XInteractionHandler >& xHandler,
2109                     sal_uInt32 nError )
2110 {
2111     sal_Bool bResult = sal_False;
2112 
2113     if ( xHandler.is() )
2114     {
2115         try
2116         {
2117             uno::Any aInteraction;
2118             uno::Sequence< uno::Reference< task::XInteractionContinuation > > lContinuations(2);
2119             ::comphelper::OInteractionAbort* pAbort = new ::comphelper::OInteractionAbort();
2120             ::comphelper::OInteractionApprove* pApprove = new ::comphelper::OInteractionApprove();
2121             lContinuations[0] = uno::Reference< task::XInteractionContinuation >(
2122                                  static_cast< task::XInteractionContinuation* >( pAbort ), uno::UNO_QUERY );
2123             lContinuations[1] = uno::Reference< task::XInteractionContinuation >(
2124                                  static_cast< task::XInteractionContinuation* >( pApprove ), uno::UNO_QUERY );
2125 
2126             task::ErrorCodeRequest aErrorCode;
2127             aErrorCode.ErrCode = nError;
2128             aInteraction <<= aErrorCode;
2129             xHandler->handle(::framework::InteractionRequest::CreateRequest (aInteraction,lContinuations));
2130             bResult = pAbort->wasSelected();
2131         }
2132         catch( uno::Exception& )
2133         {}
2134     }
2135 
2136     return bResult;
2137 }
2138 
2139 sal_Bool SfxObjectShell_Impl::NeedsOfficeUpdateDialog()
2140 {
2141     // if the configuration is not available for any reason, the default behavior is to show the message
2142     sal_Bool bResult = sal_True;
2143 
2144     try
2145     {
2146     	uno::Reference< lang::XMultiServiceFactory > xServiceManager( ::comphelper::getProcessServiceFactory(), uno::UNO_SET_THROW );
2147 		uno::Reference< uno::XInterface > xCommonConfig(
2148                         ::comphelper::ConfigurationHelper::openConfig(
2149 							xServiceManager,
2150 							::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common" ) ),
2151 							::comphelper::ConfigurationHelper::E_STANDARD ),
2152                         uno::UNO_SET_THROW );
2153 
2154         ::comphelper::ConfigurationHelper::readRelativeKey(
2155                         xCommonConfig,
2156                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Load/" ) ),
2157                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ShowOfficeUpdateDialog" ) ) ) >>= bResult;
2158     }
2159     catch( uno::Exception& )
2160     {
2161     }
2162 
2163 	return bResult;
2164 }
2165 
2166 sal_Int16 SfxObjectShell_Impl::getCurrentMacroExecMode() const
2167 {
2168     sal_Int16 nImposedExecMode( MacroExecMode::NEVER_EXECUTE );
2169 
2170     const SfxMedium* pMedium( rDocShell.GetMedium() );
2171     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getCurrentMacroExecMode: no medium!" );
2172     if ( pMedium )
2173     {
2174         SFX_ITEMSET_ARG( pMedium->GetItemSet(), pMacroModeItem, SfxUInt16Item, SID_MACROEXECMODE, sal_False);
2175         if ( pMacroModeItem )
2176             nImposedExecMode = pMacroModeItem->GetValue();
2177     }
2178     return nImposedExecMode;
2179 }
2180 
2181 sal_Bool SfxObjectShell_Impl::setCurrentMacroExecMode( sal_uInt16 nMacroMode )
2182 {
2183     const SfxMedium* pMedium( rDocShell.GetMedium() );
2184     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getCurrentMacroExecMode: no medium!" );
2185     if ( pMedium )
2186     {
2187 		pMedium->GetItemSet()->Put( SfxUInt16Item( SID_MACROEXECMODE, nMacroMode ) );
2188         return sal_True;
2189     }
2190 
2191     return sal_False;
2192 }
2193 
2194 ::rtl::OUString SfxObjectShell_Impl::getDocumentLocation() const
2195 {
2196     ::rtl::OUString sLocation;
2197 
2198     const SfxMedium* pMedium( rDocShell.GetMedium() );
2199     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getDocumentLocation: no medium!" );
2200     if ( pMedium )
2201     {
2202         sLocation = pMedium->GetName();
2203         if ( !sLocation.getLength() )
2204         {
2205             // for documents made from a template: get the name of the template
2206             sLocation = rDocShell.getDocProperties()->getTemplateURL();
2207         }
2208     }
2209     return sLocation;
2210 }
2211 
2212 uno::Reference< embed::XStorage > SfxObjectShell_Impl::getZipStorageToSign()
2213 {
2214     Reference < embed::XStorage > xStore;
2215 
2216     SfxMedium* pMedium( rDocShell.GetMedium() );
2217     OSL_PRECOND( pMedium, "SfxObjectShell_Impl::getLastCommitDocumentStorage: no medium!" );
2218     if ( pMedium )
2219         xStore = pMedium->GetZipStorageToSign_Impl();
2220 
2221     return xStore;
2222 }
2223 
2224 sal_Bool SfxObjectShell_Impl::documentStorageHasMacros() const
2225 {
2226     return ::sfx2::DocumentMacroMode::storageHasMacros( m_xDocStorage );
2227 }
2228 
2229 Reference< XEmbeddedScripts > SfxObjectShell_Impl::getEmbeddedDocumentScripts() const
2230 {
2231     return Reference< XEmbeddedScripts >( rDocShell.GetModel(), UNO_QUERY );
2232 }
2233 
2234 sal_Int16 SfxObjectShell_Impl::getScriptingSignatureState()
2235 {
2236     sal_Int16 nSignatureState( rDocShell.GetScriptingSignatureState() );
2237 
2238     if ( nSignatureState != SIGNATURESTATE_NOSIGNATURES && m_bMacroSignBroken )
2239     {
2240         // if there is a macro signature it must be handled as broken
2241         nSignatureState = SIGNATURESTATE_SIGNATURES_BROKEN;
2242     }
2243 
2244     return nSignatureState;
2245 }
2246 
2247 sal_Bool SfxObjectShell_Impl::hasTrustedScriptingSignature( sal_Bool bAllowUIToAddAuthor )
2248 {
2249     sal_Bool bResult = sal_False;
2250 
2251     try
2252     {
2253         ::rtl::OUString aVersion;
2254         try
2255         {
2256             uno::Reference < beans::XPropertySet > xPropSet( rDocShell.GetStorage(), uno::UNO_QUERY_THROW );
2257             xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) >>= aVersion;
2258         }
2259         catch( uno::Exception& )
2260         {
2261         }
2262         uno::Sequence< uno::Any > aArgs( 1 );
2263         aArgs[0] <<= aVersion;
2264 
2265         uno::Reference< security::XDocumentDigitalSignatures > xSigner( comphelper::getProcessServiceFactory()->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.security.DocumentDigitalSignatures" ) ), aArgs ), uno::UNO_QUERY_THROW );
2266 
2267         if ( nScriptingSignatureState == SIGNATURESTATE_UNKNOWN
2268           || nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_OK
2269           || nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_NOTVALIDATED )
2270         {
2271             uno::Sequence< security::DocumentSignatureInformation > aInfo = rDocShell.ImplAnalyzeSignature( sal_True, xSigner );
2272 
2273             if ( aInfo.getLength() )
2274             {
2275                 if ( nScriptingSignatureState == SIGNATURESTATE_UNKNOWN )
2276                     nScriptingSignatureState = rDocShell.ImplCheckSignaturesInformation( aInfo );
2277 
2278                 if ( nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_OK
2279                   || nScriptingSignatureState == SIGNATURESTATE_SIGNATURES_NOTVALIDATED )
2280                 {
2281                     for ( sal_Int32 nInd = 0; !bResult && nInd < aInfo.getLength(); nInd++ )
2282                     {
2283                         bResult = xSigner->isAuthorTrusted( aInfo[nInd].Signer );
2284                     }
2285 
2286                     if ( !bResult && bAllowUIToAddAuthor )
2287                     {
2288                         uno::Reference< task::XInteractionHandler > xInteraction;
2289                         if ( rDocShell.GetMedium() )
2290                             xInteraction = rDocShell.GetMedium()->GetInteractionHandler();
2291 
2292                         if ( xInteraction.is() )
2293                         {
2294                             task::DocumentMacroConfirmationRequest aRequest;
2295                             aRequest.DocumentURL = getDocumentLocation();
2296                             aRequest.DocumentStorage = rDocShell.GetMedium()->GetZipStorageToSign_Impl();
2297                             aRequest.DocumentSignatureInformation = aInfo;
2298                             aRequest.DocumentVersion = aVersion;
2299                             aRequest.Classification = task::InteractionClassification_QUERY;
2300                             bResult = SfxMedium::CallApproveHandler( xInteraction, uno::makeAny( aRequest ), sal_True );
2301                         }
2302                     }
2303                 }
2304             }
2305         }
2306     }
2307     catch( uno::Exception& )
2308     {}
2309 
2310     return bResult;
2311 }
2312 
2313 void SfxObjectShell_Impl::showBrokenSignatureWarning( const uno::Reference< task::XInteractionHandler >& _rxInteraction ) const
2314 {
2315     if  ( !bSignatureErrorIsShown )
2316     {
2317         SfxObjectShell::UseInteractionToHandleError( _rxInteraction, ERRCODE_SFX_BROKENSIGNATURE );
2318 	    const_cast< SfxObjectShell_Impl* >( this )->bSignatureErrorIsShown = sal_True;
2319     }
2320 }
2321 
2322 void SfxObjectShell::AddLog( const ::rtl::OUString& aMessage )
2323 {
2324     if ( !pImp->m_xLogRing.is() )
2325     {
2326         try
2327         {
2328             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
2329             if ( aContext.is() )
2330                 pImp->m_xLogRing.set( aContext.getSingleton( "com.sun.star.logging.DocumentIOLogRing" ), UNO_QUERY_THROW );
2331         }
2332         catch( uno::Exception& )
2333         {}
2334     }
2335 
2336     if ( pImp->m_xLogRing.is() )
2337         pImp->m_xLogRing->logString( aMessage );
2338 }
2339 
2340 namespace {
2341 
2342 void WriteStringInStream( const uno::Reference< io::XOutputStream >& xOutStream, const ::rtl::OUString& aString )
2343 {
2344     if ( xOutStream.is() )
2345     {
2346         ::rtl::OString aStrLog = ::rtl::OUStringToOString( aString, RTL_TEXTENCODING_UTF8 );
2347         uno::Sequence< sal_Int8 > aLogData( (const sal_Int8*)aStrLog.getStr(), aStrLog.getLength() );
2348         xOutStream->writeBytes( aLogData );
2349 
2350         aLogData.realloc( 1 );
2351         aLogData[0] = '\n';
2352         xOutStream->writeBytes( aLogData );
2353     }
2354 }
2355 
2356 }
2357 
2358 void SfxObjectShell::StoreLog()
2359 {
2360     if ( !pImp->m_xLogRing.is() )
2361     {
2362         try
2363         {
2364             ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
2365             if ( aContext.is() )
2366                 pImp->m_xLogRing.set( aContext.getSingleton( "com.sun.star.logging.DocumentIOLogRing" ), UNO_QUERY_THROW );
2367         }
2368         catch( uno::Exception& )
2369         {}
2370     }
2371 
2372     if ( pImp->m_xLogRing.is() )
2373     {
2374         ::rtl::OUString aFileURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}" ) );
2375 //#ifdef WNT
2376 //        ::rtl::OUString aFileURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}" ) );
2377 //#else
2378 //        ::rtl::OUString aFileURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/bootstraprc:UserInstallation}" ) );
2379 //#endif
2380         ::rtl::Bootstrap::expandMacros( aFileURL );
2381 
2382 //#ifdef WNT
2383 //        ::rtl::OUString aBuildID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/setup.ini:buildid}" ) );
2384 //#else
2385 //        ::rtl::OUString aBuildID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/setuprc:buildid}" ) );
2386 //#endif
2387         ::rtl::OUString aBuildID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("setup") ":buildid}" ) );
2388         ::rtl::Bootstrap::expandMacros( aBuildID );
2389 
2390         if ( aFileURL.getLength() )
2391         {
2392             aFileURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/user/temp/document_io_logring.txt" ) );
2393             try
2394             {
2395                 uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory(), uno::UNO_SET_THROW );
2396                 uno::Reference< ucb::XSimpleFileAccess > xSimpleFileAccess( xFactory->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.ucb.SimpleFileAccess" ) ), uno::UNO_QUERY_THROW );
2397                 uno::Reference< io::XStream > xStream( xSimpleFileAccess->openFileReadWrite( aFileURL ), uno::UNO_SET_THROW );
2398                 uno::Reference< io::XOutputStream > xOutStream( xStream->getOutputStream(), uno::UNO_SET_THROW );
2399                 uno::Reference< io::XTruncate > xTruncate( xOutStream, uno::UNO_QUERY_THROW );
2400                 xTruncate->truncate();
2401 
2402                 if ( aBuildID.getLength() )
2403                     WriteStringInStream( xOutStream, aBuildID );
2404 
2405                 uno::Sequence< ::rtl::OUString > aLogSeq = pImp->m_xLogRing->getCollectedLog();
2406                 for ( sal_Int32 nInd = 0; nInd < aLogSeq.getLength(); nInd++ )
2407                     WriteStringInStream( xOutStream, aLogSeq[nInd] );
2408             }
2409             catch( uno::Exception& )
2410             {}
2411         }
2412     }
2413 }
2414 
2415