xref: /trunk/main/sfx2/source/doc/objserv.cxx (revision 61dff127b6698e0bae836c8aedd6ec62111483d1)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sfx2.hxx"
30 
31 #include <sot/storage.hxx>
32 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
33 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
34 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
35 #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
36 #include <com/sun/star/ui/dialogs/XControlAccess.hpp>
37 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 #include <com/sun/star/beans/XPropertyAccess.hpp>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40 #include <com/sun/star/beans/PropertyValue.hpp>
41 #include <com/sun/star/container/XNameAccess.hpp>
42 #include <com/sun/star/document/XExporter.hpp>
43 #include <com/sun/star/task/XInteractionHandler.hpp>
44 #include <com/sun/star/task/XStatusIndicator.hpp>
45 #include <com/sun/star/task/XStatusIndicatorFactory.hpp>
46 #include <com/sun/star/frame/XDocumentTemplates.hpp>
47 #include <com/sun/star/frame/XStorable.hpp>
48 #include <comphelper/processfactory.hxx>
49 #include <com/sun/star/security/CertificateValidity.hpp>
50 
51 #include <com/sun/star/security/DocumentSignatureInformation.hpp>
52 #include <com/sun/star/security/XDocumentDigitalSignatures.hpp>
53 #include <tools/urlobj.hxx>
54 #include <svl/whiter.hxx>
55 #include <vcl/msgbox.hxx>
56 #include <svl/intitem.hxx>
57 #include <svl/eitem.hxx>
58 #include <vcl/wrkwin.hxx>
59 #include <svtools/sfxecode.hxx>
60 #include <svtools/ehdl.hxx>
61 
62 #include <comphelper/string.hxx>
63 #include <basic/sbx.hxx>
64 #include <unotools/pathoptions.hxx>
65 #include <unotools/useroptions.hxx>
66 #include <svtools/asynclink.hxx>
67 #include <unotools/saveopt.hxx>
68 #include <comphelper/documentconstants.hxx>
69 
70 #include <sfx2/app.hxx>
71 #include <sfx2/signaturestate.hxx>
72 #include "sfx2/sfxresid.hxx"
73 #include <sfx2/event.hxx>
74 #include <sfx2/request.hxx>
75 #include <sfx2/printer.hxx>
76 #include <sfx2/viewsh.hxx>
77 #include <sfx2/doctdlg.hxx>
78 #include <sfx2/docfilt.hxx>
79 #include <sfx2/docfile.hxx>
80 #include <sfx2/dispatch.hxx>
81 #include <sfx2/dinfdlg.hxx>
82 #include <sfx2/objitem.hxx>
83 #include <sfx2/objsh.hxx>
84 #include "objshimp.hxx"
85 #include "sfxtypes.hxx"
86 //#include "interno.hxx"
87 #include <sfx2/module.hxx>
88 #include <sfx2/viewfrm.hxx>
89 #include "versdlg.hxx"
90 #include "doc.hrc"
91 #include <sfx2/docfac.hxx>
92 #include <sfx2/fcontnr.hxx>
93 #include <sfx2/filedlghelper.hxx>
94 #include "sfx2/sfxhelp.hxx"
95 #include <sfx2/msgpool.hxx>
96 #include <sfx2/objface.hxx>
97 
98 #include "../appl/app.hrc"
99 #include <com/sun/star/document/XDocumentSubStorageSupplier.hpp>
100 #include <com/sun/star/embed/XTransactedObject.hpp>
101 #include <com/sun/star/util/XCloneable.hpp>
102 #include <com/sun/star/document/XDocumentProperties.hpp>
103 
104 #include "helpid.hrc"
105 
106 #include "guisaveas.hxx"
107 
108 using namespace ::com::sun::star;
109 using namespace ::com::sun::star::lang;
110 using namespace ::com::sun::star::uno;
111 using namespace ::com::sun::star::ui::dialogs;
112 using namespace ::com::sun::star::awt;
113 using namespace ::com::sun::star::container;
114 using namespace ::com::sun::star::beans;
115 using namespace ::com::sun::star::document;
116 using namespace ::com::sun::star::task;
117 
118 //====================================================================
119 
120 class SfxSaveAsContext_Impl
121 {
122     String&     _rNewNameVar;
123     String      _aNewName;
124 
125 public:
126                 SfxSaveAsContext_Impl( String &rNewNameVar,
127                                        const String &rNewName )
128                 :   _rNewNameVar( rNewNameVar ),
129                     _aNewName( rNewName )
130                 { rNewNameVar = rNewName; }
131                 ~SfxSaveAsContext_Impl()
132                 { _rNewNameVar.Erase(); }
133 };
134 
135 //====================================================================
136 
137 #define SfxObjectShell
138 #include "sfxslots.hxx"
139 
140 //=========================================================================
141 
142 
143 
144 SFX_IMPL_INTERFACE(SfxObjectShell,SfxShell,SfxResId(0))
145 {
146 }
147 
148 //=========================================================================
149 
150 class SfxClosePreventer_Impl : public ::cppu::WeakImplHelper1< ::com::sun::star::util::XCloseListener >
151 {
152     sal_Bool m_bGotOwnership;
153     sal_Bool m_bPreventClose;
154 
155 public:
156     SfxClosePreventer_Impl();
157 
158     sal_Bool HasOwnership() { return m_bGotOwnership; }
159 
160     void SetPreventClose( sal_Bool bPrevent ) { m_bPreventClose = bPrevent; }
161 
162     virtual void SAL_CALL queryClosing( const lang::EventObject& aEvent, sal_Bool bDeliverOwnership )
163         throw ( uno::RuntimeException, util::CloseVetoException );
164 
165     virtual void SAL_CALL notifyClosing( const lang::EventObject& aEvent ) throw ( uno::RuntimeException ) ;
166 
167     virtual void SAL_CALL disposing( const lang::EventObject& aEvent ) throw ( uno::RuntimeException ) ;
168 
169 } ;
170 
171 SfxClosePreventer_Impl::SfxClosePreventer_Impl()
172 : m_bGotOwnership( sal_False )
173 , m_bPreventClose( sal_True )
174 {
175 }
176 
177 void SAL_CALL SfxClosePreventer_Impl::queryClosing( const lang::EventObject&, sal_Bool bDeliverOwnership )
178         throw ( uno::RuntimeException, util::CloseVetoException )
179 {
180     if ( m_bPreventClose )
181     {
182         if ( !m_bGotOwnership )
183             m_bGotOwnership = bDeliverOwnership;
184 
185         throw util::CloseVetoException();
186     }
187 }
188 
189 void SAL_CALL SfxClosePreventer_Impl::notifyClosing( const lang::EventObject& ) throw ( uno::RuntimeException )
190 {}
191 
192 void SAL_CALL SfxClosePreventer_Impl::disposing( const lang::EventObject& ) throw ( uno::RuntimeException )
193 {}
194 
195 //=========================================================================
196 class SfxInstanceCloseGuard_Impl
197 {
198     SfxClosePreventer_Impl* m_pPreventer;
199     uno::Reference< util::XCloseListener > m_xPreventer;
200     uno::Reference< util::XCloseable > m_xCloseable;
201 
202 public:
203     SfxInstanceCloseGuard_Impl()
204     : m_pPreventer( NULL )
205     {}
206 
207     ~SfxInstanceCloseGuard_Impl();
208 
209     sal_Bool Init_Impl( const uno::Reference< util::XCloseable >& xCloseable );
210 };
211 
212 sal_Bool SfxInstanceCloseGuard_Impl::Init_Impl( const uno::Reference< util::XCloseable >& xCloseable )
213 {
214     sal_Bool bResult = sal_False;
215 
216     // do not allow reinit after the successful init
217     if ( xCloseable.is() && !m_xCloseable.is() )
218     {
219         try
220         {
221             m_pPreventer = new SfxClosePreventer_Impl();
222             m_xPreventer = uno::Reference< util::XCloseListener >( m_pPreventer );
223             xCloseable->addCloseListener( m_xPreventer );
224             m_xCloseable = xCloseable;
225             bResult = sal_True;
226         }
227         catch( uno::Exception& )
228         {
229             OSL_ENSURE( sal_False, "Could not register close listener!\n" );
230         }
231     }
232 
233     return bResult;
234 }
235 
236 SfxInstanceCloseGuard_Impl::~SfxInstanceCloseGuard_Impl()
237 {
238     if ( m_xCloseable.is() && m_xPreventer.is() )
239     {
240         try
241         {
242             m_xCloseable->removeCloseListener( m_xPreventer );
243         }
244         catch( uno::Exception& )
245         {
246         }
247 
248         try
249         {
250             if ( m_pPreventer )
251             {
252                 m_pPreventer->SetPreventClose( sal_False );
253 
254                 if ( m_pPreventer->HasOwnership() )
255                     m_xCloseable->close( sal_True ); // TODO: do it asynchronously
256             }
257         }
258         catch( uno::Exception& )
259         {
260         }
261     }
262 }
263 
264 //=========================================================================
265 
266 void SfxObjectShell::PrintExec_Impl(SfxRequest &rReq)
267 {
268     SfxViewFrame *pFrame = SfxViewFrame::GetFirst(this);
269     if ( pFrame )
270     {
271         rReq.SetSlot( SID_PRINTDOC );
272         pFrame->GetViewShell()->ExecuteSlot(rReq);
273     }
274 }
275 
276 //--------------------------------------------------------------------
277 
278 void SfxObjectShell::PrintState_Impl(SfxItemSet &rSet)
279 {
280     bool bPrinting = false;
281     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
282     if ( pFrame )
283     {
284         SfxPrinter *pPrinter = pFrame->GetViewShell()->GetPrinter();
285         bPrinting = pPrinter && pPrinter->IsPrinting();
286     }
287     rSet.Put( SfxBoolItem( SID_PRINTOUT, bPrinting ) );
288 }
289 
290 //--------------------------------------------------------------------
291 
292 sal_Bool SfxObjectShell::APISaveAs_Impl
293 (
294     const String& aFileName,
295     SfxItemSet*   aParams
296 )
297 {
298     sal_Bool bOk = sal_False;
299 
300     {DBG_CHKTHIS(SfxObjectShell, 0);}
301 
302     if ( GetMedium() )
303     {
304         String aFilterName;
305         SFX_ITEMSET_ARG( aParams, pFilterNameItem, SfxStringItem, SID_FILTER_NAME, sal_False );
306         if( pFilterNameItem )
307         {
308             aFilterName = pFilterNameItem->GetValue();
309         }
310         else
311         {
312             SFX_ITEMSET_ARG( aParams, pContentTypeItem, SfxStringItem, SID_CONTENTTYPE, sal_False );
313             if ( pContentTypeItem )
314             {
315                 const SfxFilter* pFilter = SfxFilterMatcher( String::CreateFromAscii(GetFactory().GetShortName()) ).GetFilter4Mime( pContentTypeItem->GetValue(), SFX_FILTER_EXPORT );
316                 if ( pFilter )
317                     aFilterName = pFilter->GetName();
318             }
319         }
320 
321         // in case no filter defined use default one
322         if( !aFilterName.Len() )
323         {
324             const SfxFilter* pFilt = SfxFilter::GetDefaultFilterFromFactory(GetFactory().GetFactoryName());
325 
326             DBG_ASSERT( pFilt, "No default filter!\n" );
327             if( pFilt )
328                 aFilterName = pFilt->GetFilterName();
329 
330             aParams->Put(SfxStringItem( SID_FILTER_NAME, aFilterName));
331         }
332 
333 
334         {
335             SfxObjectShellRef xLock( this ); // ???
336 
337             // use the title that is provided in the media descriptor
338             SFX_ITEMSET_ARG( aParams, pDocTitleItem, SfxStringItem, SID_DOCINFO_TITLE, sal_False );
339             if ( pDocTitleItem )
340                 getDocProperties()->setTitle( pDocTitleItem->GetValue() );
341 
342             bOk = CommonSaveAs_Impl( INetURLObject(aFileName), aFilterName,
343                 aParams );
344 
345         }
346 
347         // prevent picklist-entry
348         GetMedium()->SetUpdatePickList( sal_False );
349     }
350 
351     return bOk;
352 }
353 
354 //--------------------------------------------------------------------
355 
356 void SfxObjectShell::ExecFile_Impl(SfxRequest &rReq)
357 {
358     {DBG_CHKTHIS(SfxObjectShell, 0);}
359 
360     sal_uInt16 nId = rReq.GetSlot();
361 
362     if( SID_SIGNATURE == nId || SID_MACRO_SIGNATURE == nId )
363     {
364         if ( QueryHiddenInformation( WhenSigning, NULL ) == RET_YES )
365             ( SID_SIGNATURE == nId ) ? SignDocumentContent() : SignScriptingContent();
366         return;
367     }
368 
369     if ( !GetMedium() && nId != SID_CLOSEDOC )
370     {
371         rReq.Ignore();
372         return;
373     }
374 
375     // this guard is created here to have it destruction at the end of the method
376     SfxInstanceCloseGuard_Impl aModelGuard;
377 
378     sal_Bool bIsPDFExport = sal_False;
379     switch(nId)
380     {
381         case SID_VERSION:
382         {
383             SfxViewFrame* pFrame = GetFrame();
384             if ( !pFrame )
385                 pFrame = SfxViewFrame::GetFirst( this );
386             if ( !pFrame )
387                 return;
388 
389             if ( pFrame->GetFrame().GetParentFrame() )
390             {
391                 pFrame->GetTopViewFrame()->GetObjectShell()->ExecuteSlot( rReq );
392                 return;
393             }
394 
395             if ( !IsOwnStorageFormat_Impl( *GetMedium() ) )
396                 return;
397 
398             SfxVersionDialog *pDlg = new SfxVersionDialog( pFrame, IsSaveVersionOnClose() );
399             pDlg->Execute();
400             SetSaveVersionOnClose( pDlg->IsSaveVersionOnClose() );
401             delete pDlg;
402             rReq.Done();
403             return;
404         }
405 
406         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
407         case SID_DOCINFO:
408         {
409             SFX_REQUEST_ARG(rReq, pDocInfItem, SfxDocumentInfoItem, SID_DOCINFO, sal_False);
410             if ( pDocInfItem )
411             {
412                 // parameter, e.g. from replayed macro
413                 pDocInfItem->UpdateDocumentInfo(getDocProperties(), true);
414                 SetUseUserData( pDocInfItem->IsUseUserData() );
415             }
416             else
417             {
418                 // no argument containing DocInfo; check optional arguments
419                 sal_Bool bReadOnly = IsReadOnly();
420                 SFX_REQUEST_ARG(rReq, pROItem, SfxBoolItem, SID_DOC_READONLY, sal_False);
421                 if ( pROItem )
422                     // override readonly attribute of document
423                     // e.g. if a readonly document is saved elsewhere and user asks for editing DocInfo before
424                     bReadOnly = pROItem->GetValue();
425 
426                 // collect data for dialog
427                 String aURL, aTitle;
428                 if ( HasName() )
429                 {
430                     aURL = GetMedium()->GetName();
431                     aTitle = GetTitle();
432                 }
433                 else
434                 {
435                     aURL = DEFINE_CONST_UNICODE( "private:factory/" );
436                     aURL += String::CreateFromAscii( GetFactory().GetShortName() );
437 
438                     aTitle = GetTitle();
439                 }
440 
441                 SfxDocumentInfoItem aDocInfoItem( aURL, getDocProperties(),
442                     IsUseUserData() );
443                 if ( !GetSlotState( SID_DOCTEMPLATE ) )
444                     // templates not supported
445                     aDocInfoItem.SetTemplate(sal_False);
446 
447                 SfxItemSet aSet(GetPool(), SID_DOCINFO, SID_DOCINFO, SID_DOC_READONLY, SID_DOC_READONLY,
448                                 SID_EXPLORER_PROPS_START, SID_EXPLORER_PROPS_START, SID_BASEURL, SID_BASEURL,
449                                 0L );
450                 aSet.Put( aDocInfoItem );
451                 aSet.Put( SfxBoolItem( SID_DOC_READONLY, bReadOnly ) );
452                 aSet.Put( SfxStringItem( SID_EXPLORER_PROPS_START, aTitle ) );
453                 aSet.Put( SfxStringItem( SID_BASEURL, GetMedium()->GetBaseURL() ) );
454 
455                 // creating dialog is done via virtual method; application will add its own statistics page
456                 SfxDocumentInfoDialog *pDlg = CreateDocumentInfoDialog(0, aSet);
457                 if ( RET_OK == pDlg->Execute() )
458                 {
459                     SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pDocInfoItem, SfxDocumentInfoItem, SID_DOCINFO, sal_False);
460                     if ( pDocInfoItem )
461                     {
462                         // user has done some changes to DocumentInfo
463                         pDocInfoItem->UpdateDocumentInfo(getDocProperties());
464                         SetUseUserData( ((const SfxDocumentInfoItem *)pDocInfoItem)->IsUseUserData() );
465 
466                         // add data from dialog for possible recording purposes
467                         rReq.AppendItem( SfxDocumentInfoItem( GetTitle(),
468                             getDocProperties(), IsUseUserData() ) );
469                     }
470 
471                     rReq.Done();
472                 }
473                 else
474                     // nothing done; no recording
475                     rReq.Ignore();
476 
477                 delete pDlg;
478             }
479 
480             return;
481         }
482 
483         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
484 
485         case SID_EXPORTDOCASPDF:
486         case SID_DIRECTEXPORTDOCASPDF:
487             bIsPDFExport = sal_True;
488         case SID_EXPORTDOC:
489         case SID_SAVEASDOC:
490         case SID_SAVEDOC:
491         {
492             // derived class may decide to abort this
493             if( !QuerySlotExecutable( nId ) )
494             {
495                 rReq.SetReturnValue( SfxBoolItem( 0, sal_False ) );
496                 return;
497             }
498 
499             //!! detaillierte Auswertung eines Fehlercodes
500             SfxObjectShellRef xLock( this );
501 
502             // the model can not be closed till the end of this method
503             // if somebody tries to close it during this time the model will be closed
504             // at the end of the method
505             aModelGuard.Init_Impl( uno::Reference< util::XCloseable >( GetModel(), uno::UNO_QUERY ) );
506 
507             sal_Bool bDialogUsed = sal_False;
508             sal_uInt32 nErrorCode = ERRCODE_NONE;
509 
510             // by default versions should be preserved always except in case of an explicit
511             // SaveAs via GUI, so the flag must be set accordingly
512             pImp->bPreserveVersions = (nId == SID_SAVEDOC);
513             try
514             {
515                 SfxErrorContext aEc( ERRCTX_SFX_SAVEASDOC, GetTitle() ); // ???
516 
517                 if ( nId == SID_SAVEASDOC )
518                 {
519                     // in case of plugin mode the SaveAs operation means SaveTo
520                     SFX_ITEMSET_ARG( GetMedium()->GetItemSet(), pViewOnlyItem, SfxBoolItem, SID_VIEWONLY, sal_False );
521                     if ( pViewOnlyItem && pViewOnlyItem->GetValue() )
522                         rReq.AppendItem( SfxBoolItem( SID_SAVETO, sal_True ) );
523                 }
524 
525                 // TODO/LATER: do the following GUI related actions in standalown method
526                 // ========================================================================================================
527                 // Introduce a status indicator for GUI operation
528                 SFX_REQUEST_ARG( rReq, pStatusIndicatorItem, SfxUnoAnyItem, SID_PROGRESS_STATUSBAR_CONTROL, sal_False );
529                 if ( !pStatusIndicatorItem )
530                 {
531                     // get statusindicator
532                     uno::Reference< task::XStatusIndicator > xStatusIndicator;
533                     uno::Reference < frame::XController > xCtrl( GetModel()->getCurrentController() );
534                     if ( xCtrl.is() )
535                     {
536                         uno::Reference< task::XStatusIndicatorFactory > xStatFactory( xCtrl->getFrame(), uno::UNO_QUERY );
537                         if( xStatFactory.is() )
538                             xStatusIndicator = xStatFactory->createStatusIndicator();
539                     }
540 
541                     OSL_ENSURE( xStatusIndicator.is(), "Can not retrieve default status indicator!\n" );
542 
543                     if ( xStatusIndicator.is() )
544                     {
545                         SfxUnoAnyItem aStatIndItem( SID_PROGRESS_STATUSBAR_CONTROL, uno::makeAny( xStatusIndicator ) );
546 
547                         if ( nId == SID_SAVEDOC )
548                         {
549                             // in case of saving it is not possible to transport the parameters from here
550                             // but it is not clear here whether the saving will be done or saveAs operation
551                             GetMedium()->GetItemSet()->Put( aStatIndItem );
552                         }
553 
554                         rReq.AppendItem( aStatIndItem );
555                     }
556                 }
557                 else if ( nId == SID_SAVEDOC )
558                 {
559                     // in case of saving it is not possible to transport the parameters from here
560                     // but it is not clear here whether the saving will be done or saveAs operation
561                     GetMedium()->GetItemSet()->Put( *pStatusIndicatorItem );
562                 }
563 
564                 // Introduce an interaction handler for GUI operation
565                 SFX_REQUEST_ARG( rReq, pInteractionHandlerItem, SfxUnoAnyItem, SID_INTERACTIONHANDLER, sal_False );
566                 if ( !pInteractionHandlerItem )
567                 {
568                     uno::Reference< task::XInteractionHandler > xInteract;
569                     uno::Reference< lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
570                     if( xServiceManager.is() )
571                     {
572                         xInteract = Reference< XInteractionHandler >(
573                             xServiceManager->createInstance( DEFINE_CONST_UNICODE("com.sun.star.task.InteractionHandler") ),
574                             UNO_QUERY );
575                     }
576 
577                     OSL_ENSURE( xInteract.is(), "Can not retrieve default status indicator!\n" );
578                     if ( xInteract.is() )
579                     {
580                         SfxUnoAnyItem aInteractionItem( SID_INTERACTIONHANDLER, uno::makeAny( xInteract ) );
581                         if ( nId == SID_SAVEDOC )
582                         {
583                             // in case of saving it is not possible to transport the parameters from here
584                             // but it is not clear here whether the saving will be done or saveAs operation
585                             GetMedium()->GetItemSet()->Put( aInteractionItem );
586                         }
587 
588                         rReq.AppendItem( aInteractionItem );
589                     }
590                 }
591                 else if ( nId == SID_SAVEDOC )
592                 {
593                     // in case of saving it is not possible to transport the parameters from here
594                     // but it is not clear here whether the saving will be done or saveAs operation
595                     GetMedium()->GetItemSet()->Put( *pInteractionHandlerItem );
596                 }
597                 // ========================================================================================================
598 
599                 sal_Bool bPreselectPassword = sal_False;
600                 SFX_ITEMSET_ARG( GetMedium()->GetItemSet(), pOldEncryptionDataItem, SfxUnoAnyItem, SID_ENCRYPTIONDATA, sal_False );
601                 SFX_ITEMSET_ARG( GetMedium()->GetItemSet(), pOldPasswordItem, SfxStringItem, SID_PASSWORD, sal_False );
602                 if ( pOldEncryptionDataItem || pOldPasswordItem )
603                     bPreselectPassword = sal_True;
604 
605                 uno::Sequence< beans::PropertyValue > aDispatchArgs;
606                 if ( rReq.GetArgs() )
607                     TransformItems( nId,
608                                     *rReq.GetArgs(),
609                                     aDispatchArgs,
610                                     NULL );
611 
612                 const SfxSlot* pSlot = GetModule()->GetSlotPool()->GetSlot( nId );
613                 if ( !pSlot )
614                     throw uno::Exception();
615 
616                 uno::Reference< lang::XMultiServiceFactory > xEmptyFactory;
617                 SfxStoringHelper aHelper( xEmptyFactory );
618 
619                 if ( QueryHiddenInformation( bIsPDFExport ? WhenCreatingPDF : WhenSaving, NULL ) == RET_YES )
620                 {
621                     bDialogUsed = aHelper.GUIStoreModel( GetModel(),
622                                                          ::rtl::OUString::createFromAscii( pSlot->GetUnoName() ),
623                                                          aDispatchArgs,
624                                                          bPreselectPassword,
625                                                          GetSharedFileURL(),
626                                                          GetDocumentSignatureState() );
627                 }
628                 else
629                 {
630                     // the user has decided not to store the document
631                     throw task::ErrorCodeIOException( ::rtl::OUString(),
632                                                       uno::Reference< uno::XInterface >(),
633                                                       ERRCODE_IO_ABORT );
634                 }
635 
636                 // merge aDispatchArgs to the request
637                 SfxAllItemSet aResultParams( GetPool() );
638                 TransformParameters( nId,
639                                     aDispatchArgs,
640                                     aResultParams,
641                                     NULL );
642                 rReq.SetArgs( aResultParams );
643 
644                 SFX_REQUEST_ARG( rReq, pFilterNameItem, SfxStringItem, SID_FILTER_NAME, sal_False );
645                 ::rtl::OUString aFilterName = pFilterNameItem ? ::rtl::OUString( pFilterNameItem->GetValue() )
646                                                               : ::rtl::OUString();
647                 const SfxFilter* pFilt = GetFactory().GetFilterContainer()->GetFilter4FilterName( aFilterName );
648 
649                 OSL_ENSURE( nId == SID_SAVEDOC || pFilt, "The filter can not be zero since it was used for storing!\n" );
650                 if  (   bDialogUsed && pFilt
651                     &&  pFilt->IsOwnFormat()
652                     &&  pFilt->UsesStorage()
653                     &&  pFilt->GetVersion() >= SOFFICE_FILEFORMAT_60 )
654                 {
655                     SfxViewFrame* pDocViewFrame = SfxViewFrame::GetFirst( this );
656                     if ( pDocViewFrame )
657                         SfxHelp::OpenHelpAgent( &pDocViewFrame->GetFrame(), HID_DID_SAVE_PACKED_XML );
658                 }
659 
660                 // the StoreAsURL/StoreToURL method have called this method with false
661                 // so it has to be restored to true here since it is a call from GUI
662                 GetMedium()->SetUpdatePickList( sal_True );
663 
664                 // TODO: in future it must be done in followind way
665                 // if document is opened from GUI it is immediatelly appeares in the picklist
666                 // if the document is a new one then it appeares in the picklist immediatelly
667                 // after SaveAs operation triggered from GUI
668             }
669             catch( task::ErrorCodeIOException& aErrorEx )
670             {
671                 nErrorCode = (sal_uInt32)aErrorEx.ErrCode;
672             }
673             catch( Exception& )
674             {
675                 nErrorCode = ERRCODE_IO_GENERAL;
676             }
677 
678             // by default versions should be preserved always except in case of an explicit
679             // SaveAs via GUI, so the flag must be reset to guarantee this
680             pImp->bPreserveVersions = sal_True;
681             sal_uIntPtr lErr=GetErrorCode();
682 
683             if ( !lErr && nErrorCode )
684                 lErr = nErrorCode;
685 
686             if ( lErr && nErrorCode == ERRCODE_NONE )
687             {
688                 SFX_REQUEST_ARG( rReq, pWarnItem, SfxBoolItem, SID_FAIL_ON_WARNING, sal_False );
689                 if ( pWarnItem && pWarnItem->GetValue() )
690                     nErrorCode = lErr;
691             }
692 
693             // may be nErrorCode should be shown in future
694             if ( lErr != ERRCODE_IO_ABORT )
695             {
696                 SfxErrorContext aEc(ERRCTX_SFX_SAVEASDOC,GetTitle());
697                 ErrorHandler::HandleError( lErr );
698             }
699 
700             if ( nId == SID_EXPORTDOCASPDF )
701             {
702                 // This function is used by the SendMail function that needs information if a export
703                 // file was written or not. This could be due to cancellation of the export
704                 // or due to an error. So IO abort must be handled like an error!
705                 nErrorCode = ( lErr != ERRCODE_IO_ABORT ) && ( nErrorCode == ERRCODE_NONE ) ? nErrorCode : lErr;
706             }
707 
708             rReq.SetReturnValue( SfxBoolItem(0, nErrorCode == ERRCODE_NONE ) );
709 
710             ResetError();
711 
712             Invalidate();
713             break;
714         }
715 
716         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
717 
718         case SID_CLOSEDOC:
719         {
720             SfxViewFrame *pFrame = GetFrame();
721             if ( pFrame && pFrame->GetFrame().GetParentFrame() )
722             {
723                 // Wenn SID_CLOSEDOC "uber Menue etc. ausgef"uhrt wird, das
724                 // aktuelle Dokument aber in einem Frame liegt, soll eigentlich
725                 // das FrameSetDocument geclosed werden
726                 pFrame->GetTopViewFrame()->GetObjectShell()->ExecuteSlot( rReq );
727                 rReq.Done();
728                 return;
729             }
730 
731             sal_Bool bInFrameSet = sal_False;
732             sal_uInt16 nFrames=0;
733             pFrame = SfxViewFrame::GetFirst( this );
734             while ( pFrame )
735             {
736                 if ( pFrame->GetFrame().GetParentFrame() )
737                 {
738                     // Auf dieses Dokument existiert noch eine Sicht, die
739                     // in einem FrameSet liegt; diese darf nat"urlich nicht
740                     // geclosed werden
741                     bInFrameSet = sal_True;
742                 }
743                 else
744                     nFrames++;
745 
746                 pFrame = SfxViewFrame::GetNext( *pFrame, this );
747             }
748 
749             if ( bInFrameSet )
750             {
751                 // Alle Sichten, die nicht in einem FrameSet liegen, closen
752                 pFrame = SfxViewFrame::GetFirst( this );
753                 while ( pFrame )
754                 {
755                     if ( !pFrame->GetFrame().GetParentFrame() )
756                         pFrame->GetFrame().DoClose();
757                     pFrame = SfxViewFrame::GetNext( *pFrame, this );
758                 }
759             }
760 
761             // Parameter auswerten
762             SFX_REQUEST_ARG(rReq, pSaveItem, SfxBoolItem, SID_CLOSEDOC_SAVE, sal_False);
763             SFX_REQUEST_ARG(rReq, pNameItem, SfxStringItem, SID_CLOSEDOC_FILENAME, sal_False);
764             if ( pSaveItem )
765             {
766                 if ( pSaveItem->GetValue() )
767                 {
768                     if ( !pNameItem )
769                     {
770                         SbxBase::SetError( SbxERR_WRONG_ARGS );
771                         rReq.Ignore();
772                         return;
773                     }
774                     SfxAllItemSet aArgs( GetPool() );
775                     SfxStringItem aTmpItem( SID_FILE_NAME, pNameItem->GetValue() );
776                     aArgs.Put( aTmpItem, aTmpItem.Which() );
777                     SfxRequest aSaveAsReq( SID_SAVEASDOC, SFX_CALLMODE_API, aArgs );
778                     ExecFile_Impl( aSaveAsReq );
779                     if ( !aSaveAsReq.IsDone() )
780                     {
781                         rReq.Ignore();
782                         return;
783                     }
784                 }
785                 else
786                     SetModified(sal_False);
787             }
788 
789             // Benutzer bricht ab?
790             if ( !PrepareClose( 2 ) )
791             {
792                 rReq.SetReturnValue( SfxBoolItem(0, sal_False) );
793                 rReq.Done();
794                 return;
795             }
796 
797             SetModified( sal_False );
798             sal_uIntPtr lErr = GetErrorCode();
799             ErrorHandler::HandleError(lErr);
800 
801             rReq.SetReturnValue( SfxBoolItem(0, sal_True) );
802             rReq.Done();
803             rReq.ReleaseArgs(); // da der Pool in Close zerst"ort wird
804             DoClose();
805             return;
806         }
807 
808         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
809         case SID_DOCTEMPLATE:
810         {
811             // speichern als Dokumentvorlagen
812             SfxDocumentTemplateDlg *pDlg = 0;
813             SfxErrorContext aEc(ERRCTX_SFX_DOCTEMPLATE,GetTitle());
814             SfxDocumentTemplates *pTemplates =  new SfxDocumentTemplates;
815 
816             if ( !rReq.GetArgs() )
817             {
818                 pDlg = new SfxDocumentTemplateDlg(0, pTemplates);
819                 if ( RET_OK == pDlg->Execute() && pDlg->GetTemplateName().Len())
820                 {
821                     rReq.AppendItem(SfxStringItem(
822                         SID_TEMPLATE_NAME, pDlg->GetTemplateName()));
823                     rReq.AppendItem(SfxStringItem(
824                         SID_TEMPLATE_REGIONNAME, pDlg->GetRegionName()));
825                 }
826                 else
827                 {
828                     delete pDlg;
829                     rReq.Ignore();
830                     return;
831                 }
832             }
833 
834             SFX_REQUEST_ARG(rReq, pRegionItem, SfxStringItem, SID_TEMPLATE_REGIONNAME, sal_False);
835             SFX_REQUEST_ARG(rReq, pNameItem, SfxStringItem, SID_TEMPLATE_NAME, sal_False);
836             SFX_REQUEST_ARG(rReq, pRegionNrItem, SfxUInt16Item, SID_TEMPLATE_REGION, sal_False);
837             if ( (!pRegionItem && !pRegionNrItem ) || !pNameItem )
838             {
839                 DBG_ASSERT( rReq.IsAPI(), "non-API call without Arguments" );
840                 SbxBase::SetError( SbxERR_WRONG_ARGS );
841                 rReq.Ignore();
842                 return;
843             }
844 
845             ::rtl::OUString aTemplateName = pNameItem->GetValue();
846             ::rtl::OUString aTemplateGroup;
847             if ( pRegionItem )
848                 aTemplateGroup = pRegionItem->GetValue();
849             else
850                 // pRegionNrItem must not be NULL, it was just checked
851                 aTemplateGroup = pTemplates->GetFullRegionName( pRegionNrItem->GetValue() );
852             // check Group and Name
853             delete pTemplates;
854 
855             sal_Bool bOk = sal_False;
856             try
857             {
858                 uno::Reference< frame::XStorable > xStorable( GetModel(), uno::UNO_QUERY_THROW );
859                 ::rtl::OUString aService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.DocumentTemplates" ) );
860                 uno::Reference< frame::XDocumentTemplates > xTemplates(
861                                 comphelper::getProcessServiceFactory()->createInstance( aService ),
862                                 uno::UNO_QUERY_THROW );
863 
864                 bOk = xTemplates->storeTemplate( aTemplateGroup, aTemplateName, xStorable );
865             }
866             catch( uno::Exception& )
867             {
868             }
869 
870             DELETEX(pDlg);
871 
872             rReq.SetReturnValue( SfxBoolItem( 0, bOk ) );
873             if ( bOk )
874             {
875                 // update the Organizer runtime cache from the template component if the cache has already been created
876                 // TODO/LATER: get rid of this cache duplication
877                 SfxDocumentTemplates aTemplates;
878                 aTemplates.ReInitFromComponent();
879             }
880             else
881             {
882                 ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
883                 return;
884             }
885 
886             break;
887         }
888     }
889 
890     // Picklisten-Eintrag verhindern
891     if ( rReq.IsAPI() )
892         GetMedium()->SetUpdatePickList( sal_False );
893     else if ( rReq.GetArgs() )
894     {
895         SFX_ITEMSET_GET( *rReq.GetArgs(), pPicklistItem, SfxBoolItem, SID_PICKLIST, sal_False );
896         if ( pPicklistItem )
897             GetMedium()->SetUpdatePickList( pPicklistItem->GetValue() );
898     }
899 
900     // Ignore()-Zweige haben schon returnt
901     rReq.Done();
902 }
903 
904 //-------------------------------------------------------------------------
905 
906 void SfxObjectShell::GetState_Impl(SfxItemSet &rSet)
907 {
908     DBG_CHKTHIS(SfxObjectShell, 0);
909     SfxWhichIter aIter( rSet );
910 
911     for ( sal_uInt16 nWhich = aIter.FirstWhich(); nWhich; nWhich = aIter.NextWhich() )
912     {
913         switch ( nWhich )
914         {
915             case SID_DOCTEMPLATE :
916             {
917                 if ( !GetFactory().GetTemplateFilter() )
918                     rSet.DisableItem( nWhich );
919                 break;
920             }
921 
922             case SID_VERSION:
923                 {
924                     SfxObjectShell *pDoc = this;
925                     SfxViewFrame* pFrame = GetFrame();
926                     if ( !pFrame )
927                         pFrame = SfxViewFrame::GetFirst( this );
928                     if ( pFrame  )
929                     {
930                         if ( pFrame->GetFrame().GetParentFrame() )
931                         {
932                             pFrame = pFrame->GetTopViewFrame();
933                             pDoc = pFrame->GetObjectShell();
934                         }
935                     }
936 
937                     if ( !pFrame || !pDoc->HasName() ||
938                         !IsOwnStorageFormat_Impl( *pDoc->GetMedium() ) )
939 //REMOVE                            || pDoc->GetMedium()->GetStorage()->GetVersion() < SOFFICE_FILEFORMAT_50 )
940                         rSet.DisableItem( nWhich );
941                     break;
942                 }
943             case SID_SAVEDOC:
944                 {
945                     sal_Bool bMediumRO = IsReadOnlyMedium();
946                     if ( !bMediumRO && GetMedium() && IsModified() )
947                         rSet.Put(SfxStringItem(
948                             nWhich, String(SfxResId(STR_SAVEDOC))));
949                     else
950                         rSet.DisableItem(nWhich);
951                 }
952                 break;
953 
954             case SID_DOCINFO:
955                 if ( 0 != ( pImp->eFlags & SFXOBJECTSHELL_NODOCINFO ) )
956                     rSet.DisableItem( nWhich );
957                 break;
958 
959             case SID_CLOSEDOC:
960             {
961                 SfxObjectShell *pDoc = this;
962                 SfxViewFrame *pFrame = GetFrame();
963                 if ( pFrame && pFrame->GetFrame().GetParentFrame() )
964                 {
965                     // Wenn SID_CLOSEDOC "uber Menue etc. ausgef"uhrt wird, das
966                     // aktuelle Dokument aber in einem Frame liegt, soll eigentlich
967                     // das FrameSetDocument geclosed werden
968                     pDoc = pFrame->GetTopViewFrame()->GetObjectShell();
969                 }
970 
971                 if ( pDoc->GetFlags() & SFXOBJECTSHELL_DONTCLOSE )
972                     rSet.DisableItem(nWhich);
973                 else
974                     rSet.Put(SfxStringItem(nWhich, String(SfxResId(STR_CLOSEDOC))));
975                 break;
976             }
977 
978             case SID_SAVEASDOC:
979             {
980                 if( ( pImp->nLoadedFlags & SFX_LOADED_MAINDOCUMENT ) != SFX_LOADED_MAINDOCUMENT )
981                 {
982                     rSet.DisableItem( nWhich );
983                     break;
984                 }
985 /*
986                 const SfxFilter* pCombinedFilters = NULL;
987                 SfxFilterContainer* pFilterContainer = GetFactory().GetFilterContainer();
988 
989                 if ( pFilterContainer )
990                 {
991                     SfxFilterFlags    nMust    = SFX_FILTER_IMPORT | SFX_FILTER_EXPORT;
992                     SfxFilterFlags    nDont    = SFX_FILTER_NOTINSTALLED | SFX_FILTER_INTERNAL;
993 
994                     pCombinedFilters = pFilterContainer->GetAnyFilter( nMust, nDont );
995                 }
996 */
997                 if ( /*!pCombinedFilters ||*/ !GetMedium() )
998                     rSet.DisableItem( nWhich );
999                 else
1000                     rSet.Put( SfxStringItem( nWhich, String( SfxResId( STR_SAVEASDOC ) ) ) );
1001                 break;
1002             }
1003 
1004             case SID_EXPORTDOCASPDF:
1005             case SID_DIRECTEXPORTDOCASPDF:
1006             {
1007                 /*
1008 
1009                  search for filter cant work correctly ...
1010                  Because it's not clear, which export filter for which office module
1011                  must be searched. On the other side it can be very expensive doing so.
1012                  The best solution would be: on installation time we should know if pdf feature
1013                  was installed or not!!! (e.g. by writing a bool inside cfg)
1014 
1015                 SfxFilterContainer* pFilterContainer = GetFactory().GetFilterContainer();
1016                 if ( pFilterContainer )
1017                 {
1018                     String aPDFExtension = String::CreateFromAscii( "pdf" );
1019                     const SfxFilter* pFilter = pFilterContainer->GetFilter4Extension( aPDFExtension, SFX_FILTER_EXPORT );
1020                     if ( pFilter != NULL )
1021                         break;
1022                 }
1023 
1024                 rSet.DisableItem( nWhich );
1025                 */
1026                 break;
1027             }
1028 
1029             case SID_DOC_MODIFIED:
1030             {
1031                 rSet.Put( SfxStringItem( SID_DOC_MODIFIED, IsModified() ? '*' : ' ' ) );
1032                 break;
1033             }
1034 
1035             case SID_MODIFIED:
1036             {
1037                 rSet.Put( SfxBoolItem( SID_MODIFIED, IsModified() ) );
1038                 break;
1039             }
1040 
1041             case SID_DOCINFO_TITLE:
1042             {
1043                 rSet.Put( SfxStringItem(
1044                     SID_DOCINFO_TITLE, getDocProperties()->getTitle() ) );
1045                 break;
1046             }
1047             case SID_FILE_NAME:
1048             {
1049                 if( GetMedium() && HasName() )
1050                     rSet.Put( SfxStringItem(
1051                         SID_FILE_NAME, GetMedium()->GetName() ) );
1052                 break;
1053             }
1054             case SID_SIGNATURE:
1055             {
1056                 rSet.Put( SfxUInt16Item( SID_SIGNATURE, GetDocumentSignatureState() ) );
1057                 break;
1058             }
1059             case SID_MACRO_SIGNATURE:
1060             {
1061                 // the slot makes sense only if there is a macro in the document
1062                 if ( pImp->documentStorageHasMacros() || pImp->aMacroMode.hasMacroLibrary() )
1063                     rSet.Put( SfxUInt16Item( SID_MACRO_SIGNATURE, GetScriptingSignatureState() ) );
1064                 else
1065                     rSet.DisableItem( nWhich );
1066                 break;
1067             }
1068         }
1069     }
1070 }
1071 
1072 //--------------------------------------------------------------------
1073 
1074 void SfxObjectShell::ExecProps_Impl(SfxRequest &rReq)
1075 {
1076     switch ( rReq.GetSlot() )
1077     {
1078         case SID_MODIFIED:
1079         {
1080             SetModified( ( (SfxBoolItem&) rReq.GetArgs()->Get(SID_MODIFIED)).GetValue() );
1081             rReq.Done();
1082             break;
1083         }
1084 
1085         case SID_DOCTITLE:
1086             SetTitle( ( (SfxStringItem&) rReq.GetArgs()->Get(SID_DOCTITLE)).GetValue() );
1087             rReq.Done();
1088             break;
1089 
1090         case SID_DOCINFO_AUTHOR :
1091         {
1092             ::rtl::OUString aStr = ( (SfxStringItem&)rReq.GetArgs()->Get(rReq.GetSlot())).GetValue();
1093             getDocProperties()->setAuthor( aStr );
1094             break;
1095         }
1096 
1097         case SID_DOCINFO_COMMENTS :
1098         {
1099             ::rtl::OUString aStr = ( (SfxStringItem&)rReq.GetArgs()->Get(rReq.GetSlot())).GetValue();
1100             getDocProperties()->setDescription( aStr );
1101             break;
1102         }
1103 
1104         case SID_DOCINFO_KEYWORDS :
1105         {
1106             ::rtl::OUString aStr = ( (SfxStringItem&)rReq.GetArgs()->Get(rReq.GetSlot())).GetValue();
1107             getDocProperties()->setKeywords(
1108                 ::comphelper::string::convertCommaSeparated(aStr) );
1109             break;
1110         }
1111     }
1112 }
1113 
1114 //--------------------------------------------------------------------
1115 
1116 void SfxObjectShell::StateProps_Impl(SfxItemSet &rSet)
1117 {
1118     SfxWhichIter aIter(rSet);
1119     for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
1120     {
1121         switch ( nSID )
1122         {
1123             case SID_DOCINFO_AUTHOR :
1124             {
1125                 rSet.Put( SfxStringItem( nSID,
1126                             getDocProperties()->getAuthor() ) );
1127                 break;
1128             }
1129 
1130             case SID_DOCINFO_COMMENTS :
1131             {
1132                 rSet.Put( SfxStringItem( nSID,
1133                             getDocProperties()->getDescription()) );
1134                 break;
1135             }
1136 
1137             case SID_DOCINFO_KEYWORDS :
1138             {
1139                 rSet.Put( SfxStringItem( nSID, ::comphelper::string::
1140                     convertCommaSeparated(getDocProperties()->getKeywords())) );
1141                 break;
1142             }
1143 
1144             case SID_DOCPATH:
1145             {
1146                 DBG_ERROR( "Not supported anymore!" );
1147                 break;
1148             }
1149 
1150             case SID_DOCFULLNAME:
1151             {
1152                 rSet.Put( SfxStringItem( SID_DOCFULLNAME, GetTitle(SFX_TITLE_FULLNAME) ) );
1153                 break;
1154             }
1155 
1156             case SID_DOCTITLE:
1157             {
1158                 rSet.Put( SfxStringItem( SID_DOCTITLE, GetTitle() ) );
1159                 break;
1160             }
1161 
1162             case SID_DOC_READONLY:
1163             {
1164                 rSet.Put( SfxBoolItem( SID_DOC_READONLY, IsReadOnly() ) );
1165                 break;
1166             }
1167 
1168             case SID_DOC_SAVED:
1169             {
1170                 rSet.Put( SfxBoolItem( SID_DOC_SAVED, !IsModified() ) );
1171                 break;
1172             }
1173 
1174             case SID_CLOSING:
1175             {
1176                 rSet.Put( SfxBoolItem( SID_CLOSING, false ) );
1177                 break;
1178             }
1179 
1180             case SID_DOC_LOADING:
1181                 rSet.Put( SfxBoolItem( nSID, SFX_LOADED_MAINDOCUMENT !=
1182                             ( pImp->nLoadedFlags & SFX_LOADED_MAINDOCUMENT ) ) );
1183                 break;
1184 
1185             case SID_IMG_LOADING:
1186                 rSet.Put( SfxBoolItem( nSID, SFX_LOADED_IMAGES !=
1187                             ( pImp->nLoadedFlags & SFX_LOADED_IMAGES ) ) );
1188                 break;
1189         }
1190     }
1191 }
1192 
1193 //--------------------------------------------------------------------
1194 
1195 void SfxObjectShell::ExecView_Impl(SfxRequest &rReq)
1196 {
1197     switch ( rReq.GetSlot() )
1198     {
1199         case SID_ACTIVATE:
1200         {
1201             SfxViewFrame *pFrame = SfxViewFrame::GetFirst( this, sal_True );
1202             if ( pFrame )
1203                 pFrame->GetFrame().Appear();
1204             rReq.SetReturnValue( SfxObjectItem( 0, pFrame ) );
1205             rReq.Done();
1206             break;
1207         }
1208         case SID_NEWWINDOWFOREDIT:
1209         {
1210             SfxViewFrame* pFrame = SfxViewFrame::Current();
1211             if( pFrame->GetObjectShell() == this &&
1212                 ( pFrame->GetFrameType() & SFXFRAME_HASTITLE ) )
1213                 pFrame->ExecuteSlot( rReq );
1214             else
1215             {
1216                 String aFileName( GetObjectShell()->GetMedium()->GetName() );
1217                 if ( aFileName.Len() )
1218                 {
1219                     SfxStringItem aName( SID_FILE_NAME, aFileName );
1220                     SfxBoolItem aCreateView( SID_OPEN_NEW_VIEW, sal_True );
1221                     SFX_APP()->GetAppDispatcher_Impl()->Execute(
1222                         SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, &aName,
1223                         &aCreateView, 0L);
1224                 }
1225             }
1226         }
1227     }
1228 }
1229 
1230 //--------------------------------------------------------------------
1231 
1232 void SfxObjectShell::StateView_Impl(SfxItemSet& /*rSet*/)
1233 {
1234 }
1235 
1236 sal_uInt16 SfxObjectShell::ImplCheckSignaturesInformation( const uno::Sequence< security::DocumentSignatureInformation >& aInfos )
1237 {
1238     sal_Bool bCertValid = sal_True;
1239     sal_uInt16 nResult = SIGNATURESTATE_NOSIGNATURES;
1240     int nInfos = aInfos.getLength();
1241     bool bCompleteSignature = true;
1242     if( nInfos )
1243     {
1244         nResult = SIGNATURESTATE_SIGNATURES_OK;
1245         for ( int n = 0; n < nInfos; n++ )
1246         {
1247             if ( bCertValid )
1248             {
1249                 sal_Int32 nCertStat = aInfos[n].CertificateStatus;
1250                 bCertValid = nCertStat == security::CertificateValidity::VALID ? sal_True : sal_False;
1251             }
1252 
1253             if ( !aInfos[n].SignatureIsValid )
1254             {
1255                 nResult = SIGNATURESTATE_SIGNATURES_BROKEN;
1256                 break; // we know enough
1257             }
1258             bCompleteSignature &= !aInfos[n].PartialDocumentSignature;
1259         }
1260     }
1261 
1262     if ( nResult == SIGNATURESTATE_SIGNATURES_OK && !bCertValid )
1263         nResult = SIGNATURESTATE_SIGNATURES_NOTVALIDATED;
1264     else if ( nResult == SIGNATURESTATE_SIGNATURES_OK && bCertValid && !bCompleteSignature)
1265         nResult = SIGNATURESTATE_SIGNATURES_PARTIAL_OK;
1266 
1267     // this code must not check whether the document is modified
1268     // it should only check the provided info
1269 
1270     return nResult;
1271 }
1272 
1273 uno::Sequence< security::DocumentSignatureInformation > SfxObjectShell::ImplAnalyzeSignature( sal_Bool bScriptingContent, const uno::Reference< security::XDocumentDigitalSignatures >& xSigner )
1274 {
1275     uno::Sequence< security::DocumentSignatureInformation > aResult;
1276     uno::Reference< security::XDocumentDigitalSignatures > xLocSigner = xSigner;
1277 
1278     if ( GetMedium() && GetMedium()->GetName().Len() && IsOwnStorageFormat_Impl( *GetMedium())  && GetMedium()->GetStorage().is() )
1279     {
1280         try
1281         {
1282             if ( !xLocSigner.is() )
1283             {
1284                 uno::Sequence< uno::Any > aArgs( 1 );
1285                 aArgs[0] <<= ::rtl::OUString();
1286                 try
1287                 {
1288                     uno::Reference < beans::XPropertySet > xPropSet( GetStorage(), uno::UNO_QUERY_THROW );
1289                     aArgs[0] = xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) );
1290                 }
1291                 catch( uno::Exception& )
1292                 {
1293                 }
1294 
1295                 xLocSigner.set( comphelper::getProcessServiceFactory()->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.security.DocumentDigitalSignatures" ) ), aArgs ), uno::UNO_QUERY_THROW );
1296 
1297             }
1298 
1299             if ( bScriptingContent )
1300                 aResult = xLocSigner->verifyScriptingContentSignatures( GetMedium()->GetZipStorageToSign_Impl(),
1301                                                                 uno::Reference< io::XInputStream >() );
1302             else
1303                 aResult = xLocSigner->verifyDocumentContentSignatures( GetMedium()->GetZipStorageToSign_Impl(),
1304                                                                 uno::Reference< io::XInputStream >() );
1305         }
1306         catch( com::sun::star::uno::Exception& )
1307         {
1308         }
1309     }
1310 
1311     return aResult;
1312 }
1313 
1314 sal_uInt16 SfxObjectShell::ImplGetSignatureState( sal_Bool bScriptingContent )
1315 {
1316     sal_Int16* pState = bScriptingContent ? &pImp->nScriptingSignatureState : &pImp->nDocumentSignatureState;
1317 
1318     if ( *pState == SIGNATURESTATE_UNKNOWN )
1319     {
1320         *pState = SIGNATURESTATE_NOSIGNATURES;
1321 
1322         uno::Sequence< security::DocumentSignatureInformation > aInfos = ImplAnalyzeSignature( bScriptingContent );
1323         *pState = ImplCheckSignaturesInformation( aInfos );
1324     }
1325 
1326     if ( *pState == SIGNATURESTATE_SIGNATURES_OK || *pState == SIGNATURESTATE_SIGNATURES_NOTVALIDATED
1327         || *pState == SIGNATURESTATE_SIGNATURES_PARTIAL_OK)
1328     {
1329         if ( IsModified() )
1330             *pState = SIGNATURESTATE_SIGNATURES_INVALID;
1331     }
1332 
1333     return (sal_uInt16)*pState;
1334 }
1335 
1336 void SfxObjectShell::ImplSign( sal_Bool bScriptingContent )
1337 {
1338     // Check if it is stored in OASIS format...
1339     if  (   GetMedium()
1340         &&  GetMedium()->GetFilter()
1341         &&  GetMedium()->GetName().Len()
1342         &&  (   !GetMedium()->GetFilter()->IsOwnFormat()
1343             ||  !GetMedium()->HasStorage_Impl()
1344             )
1345         )
1346     {
1347         // Only OASIS and OOo6.x formats will be handled further
1348         InfoBox( NULL, SfxResId( RID_XMLSEC_INFO_WRONGDOCFORMAT ) ).Execute();
1349         return;
1350     }
1351 
1352     // check whether the document is signed
1353     ImplGetSignatureState( sal_False ); // document signature
1354     ImplGetSignatureState( sal_True ); // script signature
1355     sal_Bool bHasSign = ( pImp->nScriptingSignatureState != SIGNATURESTATE_NOSIGNATURES || pImp->nDocumentSignatureState != SIGNATURESTATE_NOSIGNATURES );
1356 
1357     // the target ODF version on saving
1358     SvtSaveOptions aSaveOpt;
1359     SvtSaveOptions::ODFDefaultVersion nVersion = aSaveOpt.GetODFDefaultVersion();
1360 
1361     // the document is not new and is not modified
1362     ::rtl::OUString aODFVersion;
1363     try
1364     {
1365         // check the version of the document
1366         uno::Reference < beans::XPropertySet > xPropSet( GetStorage(), uno::UNO_QUERY_THROW );
1367         xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) ) >>= aODFVersion;
1368     }
1369     catch( uno::Exception& )
1370     {}
1371 
1372     bool bNoSig = false;
1373 
1374     if ( IsModified() || !GetMedium() || !GetMedium()->GetName().Len()
1375       || (!aODFVersion.equals( ODFVER_012_TEXT ) && !bHasSign) )
1376     {
1377         // the document might need saving ( new, modified or in ODF1.1 format without signature )
1378 
1379         if ( nVersion >= SvtSaveOptions::ODFVER_012 )
1380         {
1381 
1382             if ( (bHasSign && QueryBox( NULL, SfxResId( MSG_XMLSEC_QUERY_SAVESIGNEDBEFORESIGN ) ).Execute() == RET_YES)
1383               || (!bHasSign && QueryBox( NULL, SfxResId( RID_XMLSEC_QUERY_SAVEBEFORESIGN ) ).Execute() == RET_YES) )
1384             {
1385                 sal_uInt16 nId = SID_SAVEDOC;
1386                 if ( !GetMedium() || !GetMedium()->GetName().Len() )
1387                     nId = SID_SAVEASDOC;
1388                 SfxRequest aSaveRequest( nId, 0, GetPool() );
1389                 //ToDo: Review. We needed to call SetModified, otherwise the document would not be saved.
1390                 SetModified(sal_True);
1391                 ExecFile_Impl( aSaveRequest );
1392 
1393                 // Check if it is stored in OASIS format...
1394                 if ( GetMedium() && GetMedium()->GetFilter()
1395                   && ( !GetMedium()->GetFilter()->IsOwnFormat() || !GetMedium()->HasStorage_Impl()
1396                     || SotStorage::GetVersion( GetMedium()->GetStorage() ) <= SOFFICE_FILEFORMAT_60 ) )
1397                 {
1398                     // Only OASIS format will be handled further
1399                     InfoBox( NULL, SfxResId( RID_XMLSEC_INFO_WRONGDOCFORMAT ) ).Execute();
1400                     return;
1401                 }
1402             }
1403             else
1404             {
1405                 //When the document is modified then we must not show the digital signatures dialog
1406                 //If we have come here then the user denied to save.
1407                 if (!bHasSign)
1408                     bNoSig = true;
1409             }
1410         }
1411         else
1412         {
1413             ErrorBox( NULL, WB_OK, SfxResId( STR_XMLSEC_ODF12_EXPECTED ) ).Execute();
1414             return;
1415         }
1416 
1417         if ( IsModified() || !GetMedium() || !GetMedium()->GetName().Len() )
1418             return;
1419     }
1420 
1421     // the document is not modified currently, so it can not become modified after signing
1422     sal_Bool bAllowModifiedBack = sal_False;
1423     if ( IsEnableSetModified() )
1424     {
1425         EnableSetModified( sal_False );
1426         bAllowModifiedBack = sal_True;
1427     }
1428 
1429     // we have to store to the original document, the original medium should be closed for this time
1430     if ( !bNoSig
1431       && ConnectTmpStorage_Impl( pMedium->GetStorage(), pMedium ) )
1432     {
1433         GetMedium()->CloseAndRelease();
1434 
1435         // We sign only ODF1.2, that means that if this point has been reached,
1436         // the ODF1.2 signing process should be used.
1437         // This code still might be called to show the signature of ODF1.1 document.
1438         sal_Bool bSigned = GetMedium()->SignContents_Impl(
1439             bScriptingContent,
1440             aODFVersion,
1441             pImp->nDocumentSignatureState == SIGNATURESTATE_SIGNATURES_OK
1442             || pImp->nDocumentSignatureState == SIGNATURESTATE_SIGNATURES_NOTVALIDATED
1443             || pImp->nDocumentSignatureState == SIGNATURESTATE_SIGNATURES_PARTIAL_OK);
1444 
1445         DoSaveCompleted( GetMedium() );
1446 
1447         if ( bSigned )
1448         {
1449             if ( bScriptingContent )
1450             {
1451                 pImp->nScriptingSignatureState = SIGNATURESTATE_UNKNOWN;// Re-Check
1452 
1453                 // adding of scripting signature removes existing document signature
1454                 pImp->nDocumentSignatureState = SIGNATURESTATE_UNKNOWN;// Re-Check
1455             }
1456             else
1457                 pImp->nDocumentSignatureState = SIGNATURESTATE_UNKNOWN;// Re-Check
1458 
1459             pImp->bSignatureErrorIsShown = sal_False;
1460 
1461             Invalidate( SID_SIGNATURE );
1462             Invalidate( SID_MACRO_SIGNATURE );
1463             Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
1464         }
1465     }
1466 
1467     if ( bAllowModifiedBack )
1468         EnableSetModified( sal_True );
1469 }
1470 
1471 sal_uInt16 SfxObjectShell::GetDocumentSignatureState()
1472 {
1473     return ImplGetSignatureState( sal_False );
1474 }
1475 
1476 void SfxObjectShell::SignDocumentContent()
1477 {
1478     ImplSign( sal_False );
1479 }
1480 
1481 sal_uInt16 SfxObjectShell::GetScriptingSignatureState()
1482 {
1483     return ImplGetSignatureState( sal_True );
1484 }
1485 
1486 void SfxObjectShell::SignScriptingContent()
1487 {
1488     ImplSign( sal_True );
1489 }
1490 
1491 // static
1492 const uno::Sequence<sal_Int8>& SfxObjectShell::getUnoTunnelId()
1493 {
1494     static uno::Sequence<sal_Int8> * pSeq = 0;
1495     if( !pSeq )
1496     {
1497         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
1498         if( !pSeq )
1499         {
1500             static uno::Sequence< sal_Int8 > aSeq( 16 );
1501             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
1502             pSeq = &aSeq;
1503         }
1504     }
1505     return *pSeq;
1506 }
1507