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