1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_dbaccess.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include "dbmm_global.hrc" 28*b1cdbd2cSJim Jagielski #include "dbmm_module.hxx" 29*b1cdbd2cSJim Jagielski #include "docinteraction.hxx" 30*b1cdbd2cSJim Jagielski #include "macromigration.hrc" 31*b1cdbd2cSJim Jagielski #include "macromigrationdialog.hxx" 32*b1cdbd2cSJim Jagielski #include "macromigrationpages.hxx" 33*b1cdbd2cSJim Jagielski #include "migrationengine.hxx" 34*b1cdbd2cSJim Jagielski #include "migrationerror.hxx" 35*b1cdbd2cSJim Jagielski #include "migrationlog.hxx" 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 38*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/application/XDatabaseDocumentUI.hpp> 39*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel2.hpp> 40*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XStorable.hpp> 41*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloseable.hpp> 42*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XComponentLoader.hpp> 43*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifiable.hpp> 44*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XContent.hpp> 45*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XContentProvider.hpp> 46*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski #include <comphelper/namedvaluecollection.hxx> 49*b1cdbd2cSJim Jagielski #include <cppuhelper/exc_hlp.hxx> 50*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx> 51*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx> 52*b1cdbd2cSJim Jagielski #include <svl/filenotation.hxx> 53*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 54*b1cdbd2cSJim Jagielski #include <ucbhelper/content.hxx> 55*b1cdbd2cSJim Jagielski #include <ucbhelper/contentbroker.hxx> 56*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx> 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski #include <list> 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski //........................................................................ 61*b1cdbd2cSJim Jagielski namespace dbmm 62*b1cdbd2cSJim Jagielski { 63*b1cdbd2cSJim Jagielski //........................................................................ 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski #define STATE_CLOSE_SUB_DOCS 0 66*b1cdbd2cSJim Jagielski #define STATE_BACKUP_DBDOC 1 67*b1cdbd2cSJim Jagielski #define STATE_MIGRATE 2 68*b1cdbd2cSJim Jagielski #define STATE_SUMMARY 3 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski #define PATH_DEFAULT 1 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 73*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 74*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XInterface; 75*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY; 76*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY_THROW; 77*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_SET_THROW; 78*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception; 79*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::RuntimeException; 80*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any; 81*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::makeAny; 82*b1cdbd2cSJim Jagielski using ::com::sun::star::sdb::application::XDatabaseDocumentUI; 83*b1cdbd2cSJim Jagielski using ::com::sun::star::sdb::XOfficeDatabaseDocument; 84*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XModel2; 85*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XController; 86*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XController2; 87*b1cdbd2cSJim Jagielski using ::com::sun::star::container::XEnumeration; 88*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XStorable; 89*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence; 90*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::PropertyValue; 91*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XFrame; 92*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XWindow; 93*b1cdbd2cSJim Jagielski using ::com::sun::star::util::XCloseable; 94*b1cdbd2cSJim Jagielski using ::com::sun::star::util::XCloseListener; 95*b1cdbd2cSJim Jagielski using ::com::sun::star::util::CloseVetoException; 96*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::EventObject; 97*b1cdbd2cSJim Jagielski using ::com::sun::star::frame::XComponentLoader; 98*b1cdbd2cSJim Jagielski using ::com::sun::star::util::XModifiable; 99*b1cdbd2cSJim Jagielski using ::com::sun::star::ucb::XCommandEnvironment; 100*b1cdbd2cSJim Jagielski using ::com::sun::star::ucb::XContent; 101*b1cdbd2cSJim Jagielski using ::com::sun::star::ucb::XContentIdentifier; 102*b1cdbd2cSJim Jagielski using ::com::sun::star::ucb::XContentProvider; 103*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski //==================================================================== 106*b1cdbd2cSJim Jagielski //= helper 107*b1cdbd2cSJim Jagielski //==================================================================== 108*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- lcl_getControllers_throw(const Reference<XModel2> & _rxDocument,::std::list<Reference<XController2>> & _out_rControllers)109*b1cdbd2cSJim Jagielski static void lcl_getControllers_throw( const Reference< XModel2 >& _rxDocument, 110*b1cdbd2cSJim Jagielski ::std::list< Reference< XController2 > >& _out_rControllers ) 111*b1cdbd2cSJim Jagielski { 112*b1cdbd2cSJim Jagielski _out_rControllers.clear(); 113*b1cdbd2cSJim Jagielski Reference< XEnumeration > xControllerEnum( _rxDocument->getControllers(), UNO_SET_THROW ); 114*b1cdbd2cSJim Jagielski while ( xControllerEnum->hasMoreElements() ) 115*b1cdbd2cSJim Jagielski _out_rControllers.push_back( Reference< XController2 >( xControllerEnum->nextElement(), UNO_QUERY_THROW ) ); 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski //==================================================================== 119*b1cdbd2cSJim Jagielski //= MacroMigrationDialog_Data 120*b1cdbd2cSJim Jagielski //==================================================================== 121*b1cdbd2cSJim Jagielski struct MacroMigrationDialog_Data 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski ::comphelper::ComponentContext aContext; 124*b1cdbd2cSJim Jagielski MigrationLog aLogger; 125*b1cdbd2cSJim Jagielski Reference< XOfficeDatabaseDocument > xDocument; 126*b1cdbd2cSJim Jagielski Reference< XModel2 > xDocumentModel; 127*b1cdbd2cSJim Jagielski ::rtl::OUString sSuccessfulBackupLocation; 128*b1cdbd2cSJim Jagielski bool bMigrationIsRunning; 129*b1cdbd2cSJim Jagielski bool bMigrationFailure; 130*b1cdbd2cSJim Jagielski bool bMigrationSuccess; 131*b1cdbd2cSJim Jagielski MacroMigrationDialog_Datadbmm::MacroMigrationDialog_Data132*b1cdbd2cSJim Jagielski MacroMigrationDialog_Data( 133*b1cdbd2cSJim Jagielski const ::comphelper::ComponentContext& _rContext, 134*b1cdbd2cSJim Jagielski const Reference< XOfficeDatabaseDocument >& _rxDocument ) 135*b1cdbd2cSJim Jagielski :aContext( _rContext ) 136*b1cdbd2cSJim Jagielski ,aLogger() 137*b1cdbd2cSJim Jagielski ,xDocument( _rxDocument ) 138*b1cdbd2cSJim Jagielski ,xDocumentModel( _rxDocument, UNO_QUERY ) 139*b1cdbd2cSJim Jagielski ,bMigrationIsRunning( false ) 140*b1cdbd2cSJim Jagielski ,bMigrationFailure( false ) 141*b1cdbd2cSJim Jagielski ,bMigrationSuccess( false ) 142*b1cdbd2cSJim Jagielski { 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski }; 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski //==================================================================== 147*b1cdbd2cSJim Jagielski //= MacroMigrationDialog 148*b1cdbd2cSJim Jagielski //==================================================================== 149*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- MacroMigrationDialog(Window * _pParent,const::comphelper::ComponentContext & _rContext,const Reference<XOfficeDatabaseDocument> & _rxDocument)150*b1cdbd2cSJim Jagielski MacroMigrationDialog::MacroMigrationDialog( Window* _pParent, const ::comphelper::ComponentContext& _rContext, 151*b1cdbd2cSJim Jagielski const Reference< XOfficeDatabaseDocument >& _rxDocument ) 152*b1cdbd2cSJim Jagielski :MacroMigrationDialog_Base( _pParent, MacroMigrationResId( DLG_MACRO_MIGRATION ) ) 153*b1cdbd2cSJim Jagielski ,m_pData( new MacroMigrationDialog_Data( _rContext, _rxDocument ) ) 154*b1cdbd2cSJim Jagielski { 155*b1cdbd2cSJim Jagielski String sTitlePrepare( MacroMigrationResId( STR_STATE_CLOSE_SUB_DOCS ) ); 156*b1cdbd2cSJim Jagielski String sTitleStoreAs( MacroMigrationResId( STR_STATE_BACKUP_DBDOC ) ); 157*b1cdbd2cSJim Jagielski String sTitleMigrate( MacroMigrationResId( STR_STATE_MIGRATE ) ); 158*b1cdbd2cSJim Jagielski String sTitleSummary( MacroMigrationResId( STR_STATE_SUMMARY ) ); 159*b1cdbd2cSJim Jagielski FreeResource(); 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski describeState( STATE_CLOSE_SUB_DOCS, sTitlePrepare, &PreparationPage::Create ); 162*b1cdbd2cSJim Jagielski describeState( STATE_BACKUP_DBDOC, sTitleStoreAs, &SaveDBDocPage::Create ); 163*b1cdbd2cSJim Jagielski describeState( STATE_MIGRATE, sTitleMigrate, &ProgressPage::Create ); 164*b1cdbd2cSJim Jagielski describeState( STATE_SUMMARY, sTitleSummary, &ResultPage::Create ); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski declarePath( PATH_DEFAULT, STATE_CLOSE_SUB_DOCS, STATE_BACKUP_DBDOC, STATE_MIGRATE, STATE_SUMMARY, WZS_INVALID_STATE ); 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski SetPageSizePixel( LogicToPixel( ::Size( TAB_PAGE_WIDTH, TAB_PAGE_HEIGHT ), MAP_APPFONT ) ); 169*b1cdbd2cSJim Jagielski ShowButtonFixedLine( true ); 170*b1cdbd2cSJim Jagielski SetRoadmapInteractive( true ); 171*b1cdbd2cSJim Jagielski enableAutomaticNextButtonState(); 172*b1cdbd2cSJim Jagielski defaultButton( WZB_NEXT ); 173*b1cdbd2cSJim Jagielski enableButtons( WZB_FINISH, true ); 174*b1cdbd2cSJim Jagielski ActivatePage(); 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski OSL_PRECOND( m_pData->xDocumentModel.is(), "MacroMigrationDialog::MacroMigrationDialog: illegal document!" ); 177*b1cdbd2cSJim Jagielski } 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ~MacroMigrationDialog()180*b1cdbd2cSJim Jagielski MacroMigrationDialog::~MacroMigrationDialog() 181*b1cdbd2cSJim Jagielski { 182*b1cdbd2cSJim Jagielski } 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getComponentContext() const185*b1cdbd2cSJim Jagielski const ::comphelper::ComponentContext& MacroMigrationDialog::getComponentContext() const 186*b1cdbd2cSJim Jagielski { 187*b1cdbd2cSJim Jagielski return m_pData->aContext; 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getDocument() const191*b1cdbd2cSJim Jagielski const Reference< XOfficeDatabaseDocument >& MacroMigrationDialog::getDocument() const 192*b1cdbd2cSJim Jagielski { 193*b1cdbd2cSJim Jagielski return m_pData->xDocument; 194*b1cdbd2cSJim Jagielski } 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- Execute()197*b1cdbd2cSJim Jagielski short MacroMigrationDialog::Execute() 198*b1cdbd2cSJim Jagielski { 199*b1cdbd2cSJim Jagielski short nResult = MacroMigrationDialog_Base::Execute(); 200*b1cdbd2cSJim Jagielski if ( !m_pData->bMigrationFailure && !m_pData->bMigrationSuccess ) 201*b1cdbd2cSJim Jagielski // migration did not even start 202*b1cdbd2cSJim Jagielski return nResult; 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski OSL_ENSURE( !m_pData->bMigrationFailure || !m_pData->bMigrationSuccess, 205*b1cdbd2cSJim Jagielski "MacroMigrationDialog::Execute: success *and* failure at the same time?!" ); 206*b1cdbd2cSJim Jagielski impl_reloadDocument_nothrow( m_pData->bMigrationSuccess ); 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski return nResult; 209*b1cdbd2cSJim Jagielski } 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- Close()212*b1cdbd2cSJim Jagielski sal_Bool MacroMigrationDialog::Close() 213*b1cdbd2cSJim Jagielski { 214*b1cdbd2cSJim Jagielski if ( m_pData->bMigrationIsRunning ) 215*b1cdbd2cSJim Jagielski return sal_False; 216*b1cdbd2cSJim Jagielski return MacroMigrationDialog_Base::Close(); 217*b1cdbd2cSJim Jagielski } 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- enterState(WizardState _nState)220*b1cdbd2cSJim Jagielski void MacroMigrationDialog::enterState( WizardState _nState ) 221*b1cdbd2cSJim Jagielski { 222*b1cdbd2cSJim Jagielski MacroMigrationDialog_Base::enterState( _nState ); 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski switch ( _nState ) 225*b1cdbd2cSJim Jagielski { 226*b1cdbd2cSJim Jagielski case STATE_CLOSE_SUB_DOCS: 227*b1cdbd2cSJim Jagielski enableButtons( WZB_FINISH, false ); 228*b1cdbd2cSJim Jagielski enableState( STATE_MIGRATE, false ); 229*b1cdbd2cSJim Jagielski enableState( STATE_SUMMARY, false ); 230*b1cdbd2cSJim Jagielski break; 231*b1cdbd2cSJim Jagielski 232*b1cdbd2cSJim Jagielski case STATE_BACKUP_DBDOC: 233*b1cdbd2cSJim Jagielski enableState( STATE_MIGRATE, true ); 234*b1cdbd2cSJim Jagielski // Note that the state is automatically disabled if the current page 235*b1cdbd2cSJim Jagielski // (SaveDBDocPage) returns false in its canAdvance, not caring that 236*b1cdbd2cSJim Jagielski // we enabled it here. 237*b1cdbd2cSJim Jagielski break; 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski case STATE_MIGRATE: 240*b1cdbd2cSJim Jagielski { 241*b1cdbd2cSJim Jagielski // disable everything. The process we will start here cannot be cancelled, the user 242*b1cdbd2cSJim Jagielski // needs to wait 'til it's finished. 243*b1cdbd2cSJim Jagielski enableState( STATE_CLOSE_SUB_DOCS, false ); 244*b1cdbd2cSJim Jagielski enableState( STATE_BACKUP_DBDOC, false ); 245*b1cdbd2cSJim Jagielski enableState( STATE_SUMMARY, false ); 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski enableButtons( WZB_FINISH | WZB_CANCEL | WZB_PREVIOUS | WZB_NEXT, false ); 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski // start the migration asynchronously 250*b1cdbd2cSJim Jagielski PostUserEvent( LINK( this, MacroMigrationDialog, OnStartMigration ) ); 251*b1cdbd2cSJim Jagielski } 252*b1cdbd2cSJim Jagielski break; 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski case STATE_SUMMARY: 255*b1cdbd2cSJim Jagielski // disable the previous step - we can't return to the actual migration, it already happened (or failed) 256*b1cdbd2cSJim Jagielski enableState( STATE_MIGRATE, false ); 257*b1cdbd2cSJim Jagielski updateTravelUI(); 258*b1cdbd2cSJim Jagielski 259*b1cdbd2cSJim Jagielski // display the results 260*b1cdbd2cSJim Jagielski dynamic_cast< ResultPage& >( *GetPage( STATE_SUMMARY ) ).displayMigrationLog( 261*b1cdbd2cSJim Jagielski m_pData->bMigrationSuccess, m_pData->aLogger.getCompleteLog() ); 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski enableButtons( WZB_FINISH, m_pData->bMigrationSuccess ); 264*b1cdbd2cSJim Jagielski enableButtons( WZB_CANCEL, m_pData->bMigrationFailure ); 265*b1cdbd2cSJim Jagielski defaultButton( m_pData->bMigrationSuccess ? WZB_FINISH : WZB_CANCEL ); 266*b1cdbd2cSJim Jagielski break; 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski default: 269*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "MacroMigrationDialog::enterState: unhandled state!" ); 270*b1cdbd2cSJim Jagielski } 271*b1cdbd2cSJim Jagielski } 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- prepareLeaveCurrentState(CommitPageReason _eReason)274*b1cdbd2cSJim Jagielski sal_Bool MacroMigrationDialog::prepareLeaveCurrentState( CommitPageReason _eReason ) 275*b1cdbd2cSJim Jagielski { 276*b1cdbd2cSJim Jagielski if ( !MacroMigrationDialog_Base::prepareLeaveCurrentState( _eReason ) ) 277*b1cdbd2cSJim Jagielski return sal_False; 278*b1cdbd2cSJim Jagielski 279*b1cdbd2cSJim Jagielski switch ( getCurrentState() ) 280*b1cdbd2cSJim Jagielski { 281*b1cdbd2cSJim Jagielski case STATE_CLOSE_SUB_DOCS: 282*b1cdbd2cSJim Jagielski if ( !impl_closeSubDocs_nothrow() ) 283*b1cdbd2cSJim Jagielski return sal_False; 284*b1cdbd2cSJim Jagielski break; 285*b1cdbd2cSJim Jagielski case STATE_BACKUP_DBDOC: 286*b1cdbd2cSJim Jagielski if ( !impl_backupDocument_nothrow() ) 287*b1cdbd2cSJim Jagielski return sal_False; 288*b1cdbd2cSJim Jagielski break; 289*b1cdbd2cSJim Jagielski case STATE_MIGRATE: 290*b1cdbd2cSJim Jagielski break; 291*b1cdbd2cSJim Jagielski case STATE_SUMMARY: 292*b1cdbd2cSJim Jagielski break; 293*b1cdbd2cSJim Jagielski default: 294*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "MacroMigrationDialog::prepareLeaveCurrentState: unhandled state!" ); 295*b1cdbd2cSJim Jagielski } 296*b1cdbd2cSJim Jagielski 297*b1cdbd2cSJim Jagielski return sal_True; 298*b1cdbd2cSJim Jagielski } 299*b1cdbd2cSJim Jagielski 300*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- leaveState(WizardState _nState)301*b1cdbd2cSJim Jagielski sal_Bool MacroMigrationDialog::leaveState( WizardState _nState ) 302*b1cdbd2cSJim Jagielski { 303*b1cdbd2cSJim Jagielski return MacroMigrationDialog_Base::leaveState( _nState ); 304*b1cdbd2cSJim Jagielski } 305*b1cdbd2cSJim Jagielski 306*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- determineNextState(WizardState _nCurrentState) const307*b1cdbd2cSJim Jagielski MacroMigrationDialog::WizardState MacroMigrationDialog::determineNextState( WizardState _nCurrentState ) const 308*b1cdbd2cSJim Jagielski { 309*b1cdbd2cSJim Jagielski return MacroMigrationDialog_Base::determineNextState( _nCurrentState ); 310*b1cdbd2cSJim Jagielski } 311*b1cdbd2cSJim Jagielski 312*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- onFinish()313*b1cdbd2cSJim Jagielski sal_Bool MacroMigrationDialog::onFinish() 314*b1cdbd2cSJim Jagielski { 315*b1cdbd2cSJim Jagielski return MacroMigrationDialog_Base::onFinish(); 316*b1cdbd2cSJim Jagielski } 317*b1cdbd2cSJim Jagielski 318*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- 319*b1cdbd2cSJim Jagielski IMPL_LINK( MacroMigrationDialog, OnStartMigration, void*, /*_pNotInterestedIn*/ ) 320*b1cdbd2cSJim Jagielski { 321*b1cdbd2cSJim Jagielski // prevent closing 322*b1cdbd2cSJim Jagielski m_pData->bMigrationIsRunning = true; 323*b1cdbd2cSJim Jagielski 324*b1cdbd2cSJim Jagielski // initialize migration engine and progress 325*b1cdbd2cSJim Jagielski ProgressPage& rProgressPage( dynamic_cast< ProgressPage& >( *GetPage( STATE_MIGRATE ) ) ); 326*b1cdbd2cSJim Jagielski MigrationEngine aEngine( m_pData->aContext, m_pData->xDocument, rProgressPage, m_pData->aLogger ); 327*b1cdbd2cSJim Jagielski rProgressPage.setDocumentCounts( aEngine.getFormCount(), aEngine.getReportCount() ); 328*b1cdbd2cSJim Jagielski 329*b1cdbd2cSJim Jagielski // do the migration 330*b1cdbd2cSJim Jagielski m_pData->bMigrationSuccess = aEngine.migrateAll(); 331*b1cdbd2cSJim Jagielski m_pData->bMigrationFailure = !m_pData->bMigrationSuccess; 332*b1cdbd2cSJim Jagielski 333*b1cdbd2cSJim Jagielski // re-enable the UI 334*b1cdbd2cSJim Jagielski enableButtons( WZB_FINISH | WZB_NEXT, true ); 335*b1cdbd2cSJim Jagielski enableState( STATE_SUMMARY, true ); 336*b1cdbd2cSJim Jagielski updateTravelUI(); 337*b1cdbd2cSJim Jagielski 338*b1cdbd2cSJim Jagielski m_pData->bMigrationIsRunning = false; 339*b1cdbd2cSJim Jagielski 340*b1cdbd2cSJim Jagielski if ( m_pData->bMigrationSuccess ) 341*b1cdbd2cSJim Jagielski { 342*b1cdbd2cSJim Jagielski rProgressPage.onFinishedSuccessfully(); 343*b1cdbd2cSJim Jagielski } 344*b1cdbd2cSJim Jagielski else 345*b1cdbd2cSJim Jagielski { // if there was an error, show the summary automatically 346*b1cdbd2cSJim Jagielski travelNext(); 347*b1cdbd2cSJim Jagielski } 348*b1cdbd2cSJim Jagielski 349*b1cdbd2cSJim Jagielski // outta here 350*b1cdbd2cSJim Jagielski return 0L; 351*b1cdbd2cSJim Jagielski } 352*b1cdbd2cSJim Jagielski 353*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_showCloseDocsError(bool _bShow)354*b1cdbd2cSJim Jagielski void MacroMigrationDialog::impl_showCloseDocsError( bool _bShow ) 355*b1cdbd2cSJim Jagielski { 356*b1cdbd2cSJim Jagielski PreparationPage* pPreparationPage = dynamic_cast< PreparationPage* >( GetPage( STATE_CLOSE_SUB_DOCS ) ); 357*b1cdbd2cSJim Jagielski OSL_ENSURE( pPreparationPage, "MacroMigrationDialog::impl_showCloseDocsError: did not find the page!" ); 358*b1cdbd2cSJim Jagielski if ( pPreparationPage ) 359*b1cdbd2cSJim Jagielski pPreparationPage->showCloseDocsError( _bShow ); 360*b1cdbd2cSJim Jagielski } 361*b1cdbd2cSJim Jagielski 362*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_closeSubDocs_nothrow()363*b1cdbd2cSJim Jagielski bool MacroMigrationDialog::impl_closeSubDocs_nothrow() 364*b1cdbd2cSJim Jagielski { 365*b1cdbd2cSJim Jagielski OSL_PRECOND( m_pData->xDocument.is(), "MacroMigrationDialog::impl_closeSubDocs_nothrow: no document!" ); 366*b1cdbd2cSJim Jagielski if ( !m_pData->xDocument.is() ) 367*b1cdbd2cSJim Jagielski return false; 368*b1cdbd2cSJim Jagielski 369*b1cdbd2cSJim Jagielski impl_showCloseDocsError( false ); 370*b1cdbd2cSJim Jagielski 371*b1cdbd2cSJim Jagielski bool bSuccess = true; 372*b1cdbd2cSJim Jagielski try 373*b1cdbd2cSJim Jagielski { 374*b1cdbd2cSJim Jagielski // collect all controllers of our document 375*b1cdbd2cSJim Jagielski ::std::list< Reference< XController2 > > aControllers; 376*b1cdbd2cSJim Jagielski lcl_getControllers_throw( m_pData->xDocumentModel, aControllers ); 377*b1cdbd2cSJim Jagielski 378*b1cdbd2cSJim Jagielski // close all sub documents of all controllers 379*b1cdbd2cSJim Jagielski for ( ::std::list< Reference< XController2 > >::const_iterator pos = aControllers.begin(); 380*b1cdbd2cSJim Jagielski pos != aControllers.end() && bSuccess; 381*b1cdbd2cSJim Jagielski ++pos 382*b1cdbd2cSJim Jagielski ) 383*b1cdbd2cSJim Jagielski { 384*b1cdbd2cSJim Jagielski Reference< XDatabaseDocumentUI > xController( *pos, UNO_QUERY ); 385*b1cdbd2cSJim Jagielski OSL_ENSURE( xController.is(), "MacroMigrationDialog::impl_closeSubDocs_nothrow: unexpected: controller is missing an important interface!" ); 386*b1cdbd2cSJim Jagielski // at the moment, only one implementation for a DBDoc's controller exists, which should 387*b1cdbd2cSJim Jagielski // support this interface 388*b1cdbd2cSJim Jagielski if ( !xController.is() ) 389*b1cdbd2cSJim Jagielski continue; 390*b1cdbd2cSJim Jagielski 391*b1cdbd2cSJim Jagielski bSuccess = xController->closeSubComponents(); 392*b1cdbd2cSJim Jagielski } 393*b1cdbd2cSJim Jagielski } 394*b1cdbd2cSJim Jagielski catch( const Exception& ) 395*b1cdbd2cSJim Jagielski { 396*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 397*b1cdbd2cSJim Jagielski bSuccess = false; 398*b1cdbd2cSJim Jagielski } 399*b1cdbd2cSJim Jagielski 400*b1cdbd2cSJim Jagielski impl_showCloseDocsError( !bSuccess ); 401*b1cdbd2cSJim Jagielski return bSuccess; 402*b1cdbd2cSJim Jagielski } 403*b1cdbd2cSJim Jagielski 404*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- 405*b1cdbd2cSJim Jagielski namespace 406*b1cdbd2cSJim Jagielski { lcl_equalURLs_nothrow(const::rtl::OUString & _lhs,const::rtl::OUString _rhs)407*b1cdbd2cSJim Jagielski bool lcl_equalURLs_nothrow( const ::rtl::OUString& _lhs, const ::rtl::OUString _rhs ) 408*b1cdbd2cSJim Jagielski { 409*b1cdbd2cSJim Jagielski // the cheap situation: the URLs are equal 410*b1cdbd2cSJim Jagielski if ( _lhs == _rhs ) 411*b1cdbd2cSJim Jagielski return true; 412*b1cdbd2cSJim Jagielski 413*b1cdbd2cSJim Jagielski bool bEqual = true; 414*b1cdbd2cSJim Jagielski try 415*b1cdbd2cSJim Jagielski { 416*b1cdbd2cSJim Jagielski ::ucbhelper::Content aContentLHS = ::ucbhelper::Content( _lhs, Reference< XCommandEnvironment >() ); 417*b1cdbd2cSJim Jagielski ::ucbhelper::Content aContentRHS = ::ucbhelper::Content( _rhs, Reference< XCommandEnvironment >() ); 418*b1cdbd2cSJim Jagielski Reference< XContent > xContentLHS( aContentLHS.get(), UNO_SET_THROW ); 419*b1cdbd2cSJim Jagielski Reference< XContent > xContentRHS( aContentRHS.get(), UNO_SET_THROW ); 420*b1cdbd2cSJim Jagielski Reference< XContentIdentifier > xID1( xContentLHS->getIdentifier(), UNO_SET_THROW ); 421*b1cdbd2cSJim Jagielski Reference< XContentIdentifier > xID2( xContentRHS->getIdentifier(), UNO_SET_THROW ); 422*b1cdbd2cSJim Jagielski 423*b1cdbd2cSJim Jagielski ::ucbhelper::ContentBroker* pBroker = ::ucbhelper::ContentBroker::get(); 424*b1cdbd2cSJim Jagielski Reference< XContentProvider > xProvider( 425*b1cdbd2cSJim Jagielski pBroker ? pBroker->getContentProviderInterface() : Reference< XContentProvider >(), UNO_SET_THROW ); 426*b1cdbd2cSJim Jagielski 427*b1cdbd2cSJim Jagielski bEqual = ( 0 == xProvider->compareContentIds( xID1, xID2 ) ); 428*b1cdbd2cSJim Jagielski } 429*b1cdbd2cSJim Jagielski catch( const Exception& ) 430*b1cdbd2cSJim Jagielski { 431*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 432*b1cdbd2cSJim Jagielski } 433*b1cdbd2cSJim Jagielski return bEqual; 434*b1cdbd2cSJim Jagielski } 435*b1cdbd2cSJim Jagielski } 436*b1cdbd2cSJim Jagielski 437*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_backupDocument_nothrow() const438*b1cdbd2cSJim Jagielski bool MacroMigrationDialog::impl_backupDocument_nothrow() const 439*b1cdbd2cSJim Jagielski { 440*b1cdbd2cSJim Jagielski if ( !m_pData->xDocumentModel.is() ) 441*b1cdbd2cSJim Jagielski // should never happen, but has been reported as assertion before 442*b1cdbd2cSJim Jagielski return false; 443*b1cdbd2cSJim Jagielski 444*b1cdbd2cSJim Jagielski SaveDBDocPage& rBackupPage = dynamic_cast< SaveDBDocPage& >( *GetPage( STATE_BACKUP_DBDOC ) ); 445*b1cdbd2cSJim Jagielski ::rtl::OUString sBackupLocation( rBackupPage.getBackupLocation() ); 446*b1cdbd2cSJim Jagielski 447*b1cdbd2cSJim Jagielski Any aError; 448*b1cdbd2cSJim Jagielski try 449*b1cdbd2cSJim Jagielski { 450*b1cdbd2cSJim Jagielski // check that the backup location isn't the same as the document itself 451*b1cdbd2cSJim Jagielski if ( lcl_equalURLs_nothrow( sBackupLocation, m_pData->xDocumentModel->getURL() ) ) 452*b1cdbd2cSJim Jagielski { 453*b1cdbd2cSJim Jagielski ErrorBox aErrorBox( const_cast< MacroMigrationDialog* >( this ), MacroMigrationResId( ERR_INVALID_BACKUP_LOCATION ) ); 454*b1cdbd2cSJim Jagielski aErrorBox.Execute(); 455*b1cdbd2cSJim Jagielski rBackupPage.grabLocationFocus(); 456*b1cdbd2cSJim Jagielski return false; 457*b1cdbd2cSJim Jagielski } 458*b1cdbd2cSJim Jagielski 459*b1cdbd2cSJim Jagielski // store to the backup location 460*b1cdbd2cSJim Jagielski const Reference< XStorable > xDocument( getDocument(), UNO_QUERY_THROW ); 461*b1cdbd2cSJim Jagielski xDocument->storeToURL( sBackupLocation, Sequence< PropertyValue >() ); 462*b1cdbd2cSJim Jagielski m_pData->sSuccessfulBackupLocation = sBackupLocation; 463*b1cdbd2cSJim Jagielski } 464*b1cdbd2cSJim Jagielski catch( const Exception& ) 465*b1cdbd2cSJim Jagielski { 466*b1cdbd2cSJim Jagielski aError = ::cppu::getCaughtException(); 467*b1cdbd2cSJim Jagielski } 468*b1cdbd2cSJim Jagielski if ( !aError.hasValue() ) 469*b1cdbd2cSJim Jagielski { 470*b1cdbd2cSJim Jagielski ::svt::OFileNotation aFileNotation( sBackupLocation ); 471*b1cdbd2cSJim Jagielski m_pData->aLogger.backedUpDocument( aFileNotation.get( ::svt::OFileNotation::N_SYSTEM ) ); 472*b1cdbd2cSJim Jagielski return true; 473*b1cdbd2cSJim Jagielski } 474*b1cdbd2cSJim Jagielski 475*b1cdbd2cSJim Jagielski // display the error to the user 476*b1cdbd2cSJim Jagielski InteractionHandler aHandler( m_pData->aContext, m_pData->xDocumentModel.get() ); 477*b1cdbd2cSJim Jagielski aHandler.reportError( aError ); 478*b1cdbd2cSJim Jagielski 479*b1cdbd2cSJim Jagielski m_pData->aLogger.logFailure( MigrationError( 480*b1cdbd2cSJim Jagielski ERR_DOCUMENT_BACKUP_FAILED, 481*b1cdbd2cSJim Jagielski sBackupLocation, 482*b1cdbd2cSJim Jagielski aError 483*b1cdbd2cSJim Jagielski ) ); 484*b1cdbd2cSJim Jagielski 485*b1cdbd2cSJim Jagielski return false; 486*b1cdbd2cSJim Jagielski } 487*b1cdbd2cSJim Jagielski 488*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_reloadDocument_nothrow(bool _bMigrationSuccess)489*b1cdbd2cSJim Jagielski void MacroMigrationDialog::impl_reloadDocument_nothrow( bool _bMigrationSuccess ) 490*b1cdbd2cSJim Jagielski { 491*b1cdbd2cSJim Jagielski typedef ::std::pair< Reference< XFrame >, ::rtl::OUString > ViewDescriptor; 492*b1cdbd2cSJim Jagielski ::std::list< ViewDescriptor > aViews; 493*b1cdbd2cSJim Jagielski 494*b1cdbd2cSJim Jagielski try 495*b1cdbd2cSJim Jagielski { 496*b1cdbd2cSJim Jagielski // the information which is necessary to reload the document 497*b1cdbd2cSJim Jagielski ::rtl::OUString sDocumentURL ( m_pData->xDocumentModel->getURL() ); 498*b1cdbd2cSJim Jagielski ::comphelper::NamedValueCollection aDocumentArgs( m_pData->xDocumentModel->getArgs() ); 499*b1cdbd2cSJim Jagielski if ( !_bMigrationSuccess ) 500*b1cdbd2cSJim Jagielski { 501*b1cdbd2cSJim Jagielski // if the migration was not successful, then reload from the backup 502*b1cdbd2cSJim Jagielski aDocumentArgs.put( "SalvagedFile", m_pData->sSuccessfulBackupLocation ); 503*b1cdbd2cSJim Jagielski // reset the modified flag of the document, so the controller can be suspended later 504*b1cdbd2cSJim Jagielski Reference< XModifiable > xModify( m_pData->xDocument, UNO_QUERY_THROW ); 505*b1cdbd2cSJim Jagielski xModify->setModified( sal_False ); 506*b1cdbd2cSJim Jagielski // after this reload, don't show the migration warning, again 507*b1cdbd2cSJim Jagielski aDocumentArgs.put( "SuppressMigrationWarning", sal_Bool(sal_True) ); 508*b1cdbd2cSJim Jagielski } 509*b1cdbd2cSJim Jagielski 510*b1cdbd2cSJim Jagielski // remove anything from the args which might refer to the old document 511*b1cdbd2cSJim Jagielski aDocumentArgs.remove( "Model" ); 512*b1cdbd2cSJim Jagielski aDocumentArgs.remove( "Stream" ); 513*b1cdbd2cSJim Jagielski aDocumentArgs.remove( "InputStream" ); 514*b1cdbd2cSJim Jagielski aDocumentArgs.remove( "FileName" ); 515*b1cdbd2cSJim Jagielski aDocumentArgs.remove( "URL" ); 516*b1cdbd2cSJim Jagielski 517*b1cdbd2cSJim Jagielski // collect all controllers of our document 518*b1cdbd2cSJim Jagielski ::std::list< Reference< XController2 > > aControllers; 519*b1cdbd2cSJim Jagielski lcl_getControllers_throw( m_pData->xDocumentModel, aControllers ); 520*b1cdbd2cSJim Jagielski 521*b1cdbd2cSJim Jagielski // close all those controllers 522*b1cdbd2cSJim Jagielski while ( !aControllers.empty() ) 523*b1cdbd2cSJim Jagielski { 524*b1cdbd2cSJim Jagielski Reference< XController2 > xController( aControllers.front(), UNO_SET_THROW ); 525*b1cdbd2cSJim Jagielski aControllers.pop_front(); 526*b1cdbd2cSJim Jagielski 527*b1cdbd2cSJim Jagielski Reference< XFrame > xFrame( xController->getFrame(), UNO_SET_THROW ); 528*b1cdbd2cSJim Jagielski ::rtl::OUString sViewName( xController->getViewControllerName() ); 529*b1cdbd2cSJim Jagielski 530*b1cdbd2cSJim Jagielski if ( !xController->suspend( sal_True ) ) 531*b1cdbd2cSJim Jagielski { // ouch. There shouldn't be any modal dialogs and such, so there 532*b1cdbd2cSJim Jagielski // really is no reason why suspending shouldn't work. 533*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "MacroMigrationDialog::impl_reloadDocument_nothrow: could not suspend a controller!" ); 534*b1cdbd2cSJim Jagielski // ignoring this would be at the cost of a crash (potentially) 535*b1cdbd2cSJim Jagielski // so, we cannot continue here. 536*b1cdbd2cSJim Jagielski throw CloseVetoException(); 537*b1cdbd2cSJim Jagielski } 538*b1cdbd2cSJim Jagielski 539*b1cdbd2cSJim Jagielski aViews.push_back( ViewDescriptor( xFrame, sViewName ) ); 540*b1cdbd2cSJim Jagielski xFrame->setComponent( NULL, NULL ); 541*b1cdbd2cSJim Jagielski xController->dispose(); 542*b1cdbd2cSJim Jagielski } 543*b1cdbd2cSJim Jagielski 544*b1cdbd2cSJim Jagielski // Note the document is closed now - disconnecting the last controller 545*b1cdbd2cSJim Jagielski // closes it automatically. 546*b1cdbd2cSJim Jagielski 547*b1cdbd2cSJim Jagielski Reference< XOfficeDatabaseDocument > xNewDocument; 548*b1cdbd2cSJim Jagielski 549*b1cdbd2cSJim Jagielski // re-create the views 550*b1cdbd2cSJim Jagielski while ( !aViews.empty() ) 551*b1cdbd2cSJim Jagielski { 552*b1cdbd2cSJim Jagielski ViewDescriptor aView( aViews.front() ); 553*b1cdbd2cSJim Jagielski aViews.pop_front(); 554*b1cdbd2cSJim Jagielski 555*b1cdbd2cSJim Jagielski // load the document into this frame 556*b1cdbd2cSJim Jagielski Reference< XComponentLoader > xLoader( aView.first, UNO_QUERY_THROW ); 557*b1cdbd2cSJim Jagielski aDocumentArgs.put( "ViewName", aView.second ); 558*b1cdbd2cSJim Jagielski Reference< XInterface > xReloaded( xLoader->loadComponentFromURL( 559*b1cdbd2cSJim Jagielski sDocumentURL, 560*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_self" ) ), 561*b1cdbd2cSJim Jagielski 0, 562*b1cdbd2cSJim Jagielski aDocumentArgs.getPropertyValues() 563*b1cdbd2cSJim Jagielski ) ); 564*b1cdbd2cSJim Jagielski 565*b1cdbd2cSJim Jagielski OSL_ENSURE( xReloaded != m_pData->xDocumentModel, 566*b1cdbd2cSJim Jagielski "MacroMigrationDialog::impl_reloadDocument_nothrow: this should have been a new instance!" ); 567*b1cdbd2cSJim Jagielski // this would be unexpected, but recoverable: The loader should at least have done 568*b1cdbd2cSJim Jagielski // this: really *load* the document, even if it loaded it into the old document instance 569*b1cdbd2cSJim Jagielski if ( !xNewDocument.is() ) 570*b1cdbd2cSJim Jagielski { 571*b1cdbd2cSJim Jagielski xNewDocument.set( xReloaded, UNO_QUERY_THROW ); 572*b1cdbd2cSJim Jagielski // for subsequent loads, into different frames, put the document into the load args 573*b1cdbd2cSJim Jagielski aDocumentArgs.put( "Model", xNewDocument ); 574*b1cdbd2cSJim Jagielski } 575*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 576*b1cdbd2cSJim Jagielski else 577*b1cdbd2cSJim Jagielski { 578*b1cdbd2cSJim Jagielski OSL_ENSURE( xNewDocument == xReloaded, 579*b1cdbd2cSJim Jagielski "MacroMigrationDialog::impl_reloadDocument_nothrow: unexpected: subsequent load attempt returned a wrong document!" ); 580*b1cdbd2cSJim Jagielski } 581*b1cdbd2cSJim Jagielski #endif 582*b1cdbd2cSJim Jagielski } 583*b1cdbd2cSJim Jagielski 584*b1cdbd2cSJim Jagielski m_pData->xDocument = xNewDocument; 585*b1cdbd2cSJim Jagielski m_pData->xDocumentModel.set( xNewDocument, UNO_QUERY ); 586*b1cdbd2cSJim Jagielski 587*b1cdbd2cSJim Jagielski // finally, now that the document has been reloaded - if the migration was not successful, 588*b1cdbd2cSJim Jagielski // then it was reloaded from the backup, but the real document still is broken. So, save 589*b1cdbd2cSJim Jagielski // the document once, which will write the content loaded from the backup to the real docfile. 590*b1cdbd2cSJim Jagielski if ( !_bMigrationSuccess ) 591*b1cdbd2cSJim Jagielski { 592*b1cdbd2cSJim Jagielski Reference< XModifiable > xModify( m_pData->xDocument, UNO_QUERY_THROW ); 593*b1cdbd2cSJim Jagielski xModify->setModified( sal_True ); 594*b1cdbd2cSJim Jagielski // this is just parnoia - in case saving the doc fails, perhaps the user is tempted to do so 595*b1cdbd2cSJim Jagielski Reference< XStorable > xStor( m_pData->xDocument, UNO_QUERY_THROW ); 596*b1cdbd2cSJim Jagielski xStor->store(); 597*b1cdbd2cSJim Jagielski } 598*b1cdbd2cSJim Jagielski } 599*b1cdbd2cSJim Jagielski catch( const Exception& ) 600*b1cdbd2cSJim Jagielski { 601*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 602*b1cdbd2cSJim Jagielski } 603*b1cdbd2cSJim Jagielski 604*b1cdbd2cSJim Jagielski // close all frames from aViews - the respective controllers have been closed, but 605*b1cdbd2cSJim Jagielski // reloading didn't work, so the frames are zombies now. 606*b1cdbd2cSJim Jagielski while ( !aViews.empty() ) 607*b1cdbd2cSJim Jagielski { 608*b1cdbd2cSJim Jagielski ViewDescriptor aView( aViews.front() ); 609*b1cdbd2cSJim Jagielski aViews.pop_front(); 610*b1cdbd2cSJim Jagielski try 611*b1cdbd2cSJim Jagielski { 612*b1cdbd2cSJim Jagielski Reference< XCloseable > xFrameClose( aView.first, UNO_QUERY_THROW ); 613*b1cdbd2cSJim Jagielski xFrameClose->close( sal_True ); 614*b1cdbd2cSJim Jagielski } 615*b1cdbd2cSJim Jagielski catch( const Exception& ) 616*b1cdbd2cSJim Jagielski { 617*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 618*b1cdbd2cSJim Jagielski } 619*b1cdbd2cSJim Jagielski } 620*b1cdbd2cSJim Jagielski } 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski //........................................................................ 623*b1cdbd2cSJim Jagielski } // namespace dbmm 624*b1cdbd2cSJim Jagielski //........................................................................ 625