1*2722ceddSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*2722ceddSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*2722ceddSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*2722ceddSAndrew Rist * distributed with this work for additional information 6*2722ceddSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*2722ceddSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*2722ceddSAndrew Rist * "License"); you may not use this file except in compliance 9*2722ceddSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*2722ceddSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*2722ceddSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*2722ceddSAndrew Rist * software distributed under the License is distributed on an 15*2722ceddSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2722ceddSAndrew Rist * KIND, either express or implied. See the License for the 17*2722ceddSAndrew Rist * specific language governing permissions and limitations 18*2722ceddSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*2722ceddSAndrew Rist *************************************************************/ 21*2722ceddSAndrew Rist 22*2722ceddSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_desktop.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "dp_gui_updatedata.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include "sal/config.h" 30cdf0e10cSrcweir #include "osl/file.hxx" 31cdf0e10cSrcweir #include "osl/conditn.hxx" 32cdf0e10cSrcweir #include "cppuhelper/exc_hlp.hxx" 33cdf0e10cSrcweir #include "tools/resid.hxx" 34cdf0e10cSrcweir #include "tools/resmgr.hxx" 35cdf0e10cSrcweir #include "tools/solar.h" 36cdf0e10cSrcweir #include "tools/string.hxx" 37cdf0e10cSrcweir #include "vcl/dialog.hxx" 38cdf0e10cSrcweir #include "vcl/msgbox.hxx" 39cdf0e10cSrcweir #include "vcl/svapp.hxx" 40cdf0e10cSrcweir #include "vos/mutex.hxx" 41cdf0e10cSrcweir #include "vcl/dialog.hxx" 42cdf0e10cSrcweir #include "cppuhelper/implbase3.hxx" 43cdf0e10cSrcweir 44cdf0e10cSrcweir #include "com/sun/star/beans/PropertyValue.hpp" 45cdf0e10cSrcweir #include "com/sun/star/beans/NamedValue.hpp" 46cdf0e10cSrcweir #include "com/sun/star/xml/dom/XElement.hpp" 47cdf0e10cSrcweir #include "com/sun/star/xml/dom/XNode.hpp" 48cdf0e10cSrcweir #include "com/sun/star/xml/dom/XNodeList.hpp" 49cdf0e10cSrcweir #include "com/sun/star/ucb/NameClash.hpp" 50cdf0e10cSrcweir #include "com/sun/star/ucb/InteractiveAugmentedIOException.hpp" 51cdf0e10cSrcweir #include "com/sun/star/ucb/XCommandEnvironment.hpp" 52cdf0e10cSrcweir #include "com/sun/star/ucb/XProgressHandler.hpp" 53cdf0e10cSrcweir #include "com/sun/star/deployment/XExtensionManager.hpp" 54cdf0e10cSrcweir #include "com/sun/star/deployment/ExtensionManager.hpp" 55cdf0e10cSrcweir #include "com/sun/star/deployment/XUpdateInformationProvider.hpp" 56cdf0e10cSrcweir #include "com/sun/star/deployment/DependencyException.hpp" 57cdf0e10cSrcweir #include "com/sun/star/deployment/LicenseException.hpp" 58cdf0e10cSrcweir #include "com/sun/star/deployment/VersionException.hpp" 59cdf0e10cSrcweir #include "com/sun/star/deployment/ui/LicenseDialog.hpp" 60cdf0e10cSrcweir #include "com/sun/star/task/XInteractionHandler.hpp" 61cdf0e10cSrcweir #include "com/sun/star/ui/dialogs/XExecutableDialog.hpp" 62cdf0e10cSrcweir #include "com/sun/star/ui/dialogs/ExecutableDialogResults.hpp" 63cdf0e10cSrcweir #include "com/sun/star/task/XInteractionAbort.hpp" 64cdf0e10cSrcweir #include "com/sun/star/task/XInteractionApprove.hpp" 65cdf0e10cSrcweir 66cdf0e10cSrcweir #include "dp_descriptioninfoset.hxx" 67cdf0e10cSrcweir #include "dp_gui.hrc" 68cdf0e10cSrcweir #include "dp_gui_updateinstalldialog.hxx" 69cdf0e10cSrcweir #include "dp_gui_shared.hxx" 70cdf0e10cSrcweir #include "dp_gui_updatedata.hxx" 71cdf0e10cSrcweir #include "dp_ucb.h" 72cdf0e10cSrcweir #include "dp_misc.h" 73cdf0e10cSrcweir #include "dp_version.hxx" 74cdf0e10cSrcweir #include "dp_gui_thread.hxx" 75cdf0e10cSrcweir #include "dp_gui_extensioncmdqueue.hxx" 76cdf0e10cSrcweir #include "ucbhelper/content.hxx" 77cdf0e10cSrcweir #include "osl/mutex.hxx" 78cdf0e10cSrcweir #include "vos/mutex.hxx" 79cdf0e10cSrcweir #include "rtl/ref.hxx" 80cdf0e10cSrcweir #include "com/sun/star/uno/Sequence.h" 81cdf0e10cSrcweir #include "comphelper/anytostring.hxx" 82cdf0e10cSrcweir #include "toolkit/helper/vclunohelper.hxx" 83cdf0e10cSrcweir 84cdf0e10cSrcweir #include <vector> 85cdf0e10cSrcweir 86cdf0e10cSrcweir class Window; 87cdf0e10cSrcweir 88cdf0e10cSrcweir namespace cssu = ::com::sun::star::uno; 89cdf0e10cSrcweir namespace css = ::com::sun::star; 90cdf0e10cSrcweir 91cdf0e10cSrcweir using ::rtl::OUString; 92cdf0e10cSrcweir 93cdf0e10cSrcweir 94cdf0e10cSrcweir namespace dp_gui { 95cdf0e10cSrcweir 96cdf0e10cSrcweir class UpdateInstallDialog::Thread: public dp_gui::Thread { 97cdf0e10cSrcweir friend class UpdateCommandEnv; 98cdf0e10cSrcweir public: 99cdf0e10cSrcweir Thread(cssu::Reference< cssu::XComponentContext > ctx, 100cdf0e10cSrcweir UpdateInstallDialog & dialog, std::vector< dp_gui::UpdateData > & aVecUpdateData); 101cdf0e10cSrcweir 102cdf0e10cSrcweir void stop(); 103cdf0e10cSrcweir 104cdf0e10cSrcweir 105cdf0e10cSrcweir 106cdf0e10cSrcweir private: 107cdf0e10cSrcweir Thread(Thread &); // not defined 108cdf0e10cSrcweir void operator =(Thread &); // not defined 109cdf0e10cSrcweir 110cdf0e10cSrcweir virtual ~Thread(); 111cdf0e10cSrcweir 112cdf0e10cSrcweir virtual void execute(); 113cdf0e10cSrcweir void downloadExtensions(); 114cdf0e10cSrcweir void download(::rtl::OUString const & aUrls, UpdateData & aUpdatData); 115cdf0e10cSrcweir void installExtensions(); 116cdf0e10cSrcweir void removeTempDownloads(); 117cdf0e10cSrcweir 118cdf0e10cSrcweir UpdateInstallDialog & m_dialog; 119cdf0e10cSrcweir cssu::Reference< css::deployment::XUpdateInformationProvider > 120cdf0e10cSrcweir m_updateInformation; 121cdf0e10cSrcweir 122cdf0e10cSrcweir // guarded by Application::GetSolarMutex(): 123cdf0e10cSrcweir cssu::Reference< css::task::XAbortChannel > m_abort; 124cdf0e10cSrcweir cssu::Reference< cssu::XComponentContext > m_xComponentContext; 125cdf0e10cSrcweir std::vector< dp_gui::UpdateData > & m_aVecUpdateData; 126cdf0e10cSrcweir ::rtl::Reference<UpdateCommandEnv> m_updateCmdEnv; 127cdf0e10cSrcweir 128cdf0e10cSrcweir //A folder which is created in the temp directory in which then the updates are downloaded 129cdf0e10cSrcweir ::rtl::OUString m_sDownloadFolder; 130cdf0e10cSrcweir 131cdf0e10cSrcweir bool m_stop; 132cdf0e10cSrcweir 133cdf0e10cSrcweir }; 134cdf0e10cSrcweir 135cdf0e10cSrcweir class UpdateCommandEnv 136cdf0e10cSrcweir : public ::cppu::WeakImplHelper3< css::ucb::XCommandEnvironment, 137cdf0e10cSrcweir css::task::XInteractionHandler, 138cdf0e10cSrcweir css::ucb::XProgressHandler > 139cdf0e10cSrcweir { 140cdf0e10cSrcweir friend class UpdateInstallDialog::Thread; 141cdf0e10cSrcweir 142cdf0e10cSrcweir UpdateInstallDialog & m_updateDialog; 143cdf0e10cSrcweir ::rtl::Reference<UpdateInstallDialog::Thread> m_installThread; 144cdf0e10cSrcweir cssu::Reference< cssu::XComponentContext > m_xContext; 145cdf0e10cSrcweir 146cdf0e10cSrcweir public: 147cdf0e10cSrcweir virtual ~UpdateCommandEnv(); 148cdf0e10cSrcweir UpdateCommandEnv( cssu::Reference< cssu::XComponentContext > const & xCtx, 149cdf0e10cSrcweir UpdateInstallDialog & updateDialog, 150cdf0e10cSrcweir ::rtl::Reference<UpdateInstallDialog::Thread>const & thread); 151cdf0e10cSrcweir 152cdf0e10cSrcweir // XCommandEnvironment 153cdf0e10cSrcweir virtual cssu::Reference<css::task::XInteractionHandler > SAL_CALL 154cdf0e10cSrcweir getInteractionHandler() throw (cssu::RuntimeException); 155cdf0e10cSrcweir virtual cssu::Reference<css::ucb::XProgressHandler > 156cdf0e10cSrcweir SAL_CALL getProgressHandler() throw (cssu::RuntimeException); 157cdf0e10cSrcweir 158cdf0e10cSrcweir // XInteractionHandler 159cdf0e10cSrcweir virtual void SAL_CALL handle( 160cdf0e10cSrcweir cssu::Reference<css::task::XInteractionRequest > const & xRequest ) 161cdf0e10cSrcweir throw (cssu::RuntimeException); 162cdf0e10cSrcweir 163cdf0e10cSrcweir // XProgressHandler 164cdf0e10cSrcweir virtual void SAL_CALL push( cssu::Any const & Status ) 165cdf0e10cSrcweir throw (cssu::RuntimeException); 166cdf0e10cSrcweir virtual void SAL_CALL update( cssu::Any const & Status ) 167cdf0e10cSrcweir throw (cssu::RuntimeException); 168cdf0e10cSrcweir virtual void SAL_CALL pop() throw (cssu::RuntimeException); 169cdf0e10cSrcweir }; 170cdf0e10cSrcweir 171cdf0e10cSrcweir 172cdf0e10cSrcweir UpdateInstallDialog::Thread::Thread( 173cdf0e10cSrcweir cssu::Reference< cssu::XComponentContext> xCtx, 174cdf0e10cSrcweir UpdateInstallDialog & dialog, 175cdf0e10cSrcweir std::vector< dp_gui::UpdateData > & aVecUpdateData): 176cdf0e10cSrcweir m_dialog(dialog), 177cdf0e10cSrcweir m_xComponentContext(xCtx), 178cdf0e10cSrcweir m_aVecUpdateData(aVecUpdateData), 179cdf0e10cSrcweir m_updateCmdEnv(new UpdateCommandEnv(xCtx, m_dialog, this)), 180cdf0e10cSrcweir m_stop(false) 181cdf0e10cSrcweir {} 182cdf0e10cSrcweir 183cdf0e10cSrcweir void UpdateInstallDialog::Thread::stop() { 184cdf0e10cSrcweir cssu::Reference< css::task::XAbortChannel > abort; 185cdf0e10cSrcweir { 186cdf0e10cSrcweir vos::OGuard g(Application::GetSolarMutex()); 187cdf0e10cSrcweir abort = m_abort; 188cdf0e10cSrcweir m_stop = true; 189cdf0e10cSrcweir } 190cdf0e10cSrcweir if (abort.is()) { 191cdf0e10cSrcweir abort->sendAbort(); 192cdf0e10cSrcweir } 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir UpdateInstallDialog::Thread::~Thread() {} 196cdf0e10cSrcweir 197cdf0e10cSrcweir void UpdateInstallDialog::Thread::execute() 198cdf0e10cSrcweir { 199cdf0e10cSrcweir try { 200cdf0e10cSrcweir downloadExtensions(); 201cdf0e10cSrcweir installExtensions(); 202cdf0e10cSrcweir } 203cdf0e10cSrcweir catch (...) 204cdf0e10cSrcweir { 205cdf0e10cSrcweir } 206cdf0e10cSrcweir 207cdf0e10cSrcweir //clean up the temp directories 208cdf0e10cSrcweir try { 209cdf0e10cSrcweir removeTempDownloads(); 210cdf0e10cSrcweir } catch( ... ) { 211cdf0e10cSrcweir } 212cdf0e10cSrcweir 213cdf0e10cSrcweir { 214cdf0e10cSrcweir //make sure m_dialog is still alive 215cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 216cdf0e10cSrcweir if (! m_stop) 217cdf0e10cSrcweir m_dialog.updateDone(); 218cdf0e10cSrcweir } 219cdf0e10cSrcweir //UpdateCommandEnv keeps a reference to Thread and prevents destruction. Therefore remove it. 220cdf0e10cSrcweir m_updateCmdEnv->m_installThread.clear(); 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir 224cdf0e10cSrcweir UpdateInstallDialog::UpdateInstallDialog( 225cdf0e10cSrcweir Window * parent, 226cdf0e10cSrcweir std::vector<dp_gui::UpdateData> & aVecUpdateData, 227cdf0e10cSrcweir cssu::Reference< cssu::XComponentContext > const & xCtx): 228cdf0e10cSrcweir ModalDialog( 229cdf0e10cSrcweir parent, 230cdf0e10cSrcweir DpGuiResId(RID_DLG_UPDATEINSTALL)), 231cdf0e10cSrcweir 232cdf0e10cSrcweir m_thread(new Thread(xCtx, *this, aVecUpdateData)), 233cdf0e10cSrcweir m_xComponentContext(xCtx), 234cdf0e10cSrcweir m_bError(false), 235cdf0e10cSrcweir m_bNoEntry(true), 236cdf0e10cSrcweir m_bActivated(false), 237cdf0e10cSrcweir m_sInstalling(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_INSTALLING))), 238cdf0e10cSrcweir m_sFinished(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_FINISHED))), 239cdf0e10cSrcweir m_sNoErrors(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_NO_ERRORS))), 240cdf0e10cSrcweir m_sErrorDownload(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_ERROR_DOWNLOAD))), 241cdf0e10cSrcweir m_sErrorInstallation(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_ERROR_INSTALLATION))), 242cdf0e10cSrcweir m_sErrorLicenseDeclined(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_ERROR_LIC_DECLINED))), 243cdf0e10cSrcweir m_sNoInstall(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_EXTENSION_NOINSTALL))), 244cdf0e10cSrcweir m_sThisErrorOccurred(String(DpGuiResId(RID_DLG_UPDATE_INSTALL_THIS_ERROR_OCCURRED))), 245cdf0e10cSrcweir m_ft_action(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_DOWNLOADING)), 246cdf0e10cSrcweir m_statusbar(this,DpGuiResId(RID_DLG_UPDATE_INSTALL_STATUSBAR)), 247cdf0e10cSrcweir m_ft_extension_name(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_EXTENSION_NAME)), 248cdf0e10cSrcweir m_ft_results(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_RESULTS)), 249cdf0e10cSrcweir m_mle_info(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_INFO)), 250cdf0e10cSrcweir m_line(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_LINE)), 251cdf0e10cSrcweir m_help(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_HELP)), 252cdf0e10cSrcweir m_ok(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_OK)), 253cdf0e10cSrcweir m_cancel(this, DpGuiResId(RID_DLG_UPDATE_INSTALL_ABORT)) 254cdf0e10cSrcweir { 255cdf0e10cSrcweir FreeResource(); 256cdf0e10cSrcweir 257cdf0e10cSrcweir m_xExtensionManager = css::deployment::ExtensionManager::get( xCtx ); 258cdf0e10cSrcweir 259cdf0e10cSrcweir m_cancel.SetClickHdl(LINK(this, UpdateInstallDialog, cancelHandler)); 260cdf0e10cSrcweir m_mle_info.EnableCursor(sal_False); 261cdf0e10cSrcweir if ( ! dp_misc::office_is_running()) 262cdf0e10cSrcweir m_help.Disable(); 263cdf0e10cSrcweir } 264cdf0e10cSrcweir 265cdf0e10cSrcweir UpdateInstallDialog::~UpdateInstallDialog() {} 266cdf0e10cSrcweir 267cdf0e10cSrcweir sal_Bool UpdateInstallDialog::Close() 268cdf0e10cSrcweir { 269cdf0e10cSrcweir m_thread->stop(); 270cdf0e10cSrcweir return ModalDialog::Close(); 271cdf0e10cSrcweir } 272cdf0e10cSrcweir 273cdf0e10cSrcweir short UpdateInstallDialog::Execute() 274cdf0e10cSrcweir { 275cdf0e10cSrcweir m_thread->launch(); 276cdf0e10cSrcweir return ModalDialog::Execute(); 277cdf0e10cSrcweir } 278cdf0e10cSrcweir 279cdf0e10cSrcweir 280cdf0e10cSrcweir // make sure the solar mutex is locked before calling 281cdf0e10cSrcweir void UpdateInstallDialog::updateDone() 282cdf0e10cSrcweir { 283cdf0e10cSrcweir if (!m_bError) 284cdf0e10cSrcweir m_mle_info.InsertText(m_sNoErrors); 285cdf0e10cSrcweir m_ok.Enable(); 286cdf0e10cSrcweir m_ok.GrabFocus(); 287cdf0e10cSrcweir m_cancel.Disable(); 288cdf0e10cSrcweir } 289cdf0e10cSrcweir // make sure the solar mutex is locked before calling 290cdf0e10cSrcweir //sets an error message in the text area 291cdf0e10cSrcweir void UpdateInstallDialog::setError(INSTALL_ERROR err, ::rtl::OUString const & sExtension, 292cdf0e10cSrcweir OUString const & exceptionMessage) 293cdf0e10cSrcweir { 294cdf0e10cSrcweir String sError; 295cdf0e10cSrcweir m_bError = true; 296cdf0e10cSrcweir 297cdf0e10cSrcweir switch (err) 298cdf0e10cSrcweir { 299cdf0e10cSrcweir case ERROR_DOWNLOAD: 300cdf0e10cSrcweir sError = m_sErrorDownload; 301cdf0e10cSrcweir break; 302cdf0e10cSrcweir case ERROR_INSTALLATION: 303cdf0e10cSrcweir sError = m_sErrorInstallation; 304cdf0e10cSrcweir break; 305cdf0e10cSrcweir case ERROR_LICENSE_DECLINED: 306cdf0e10cSrcweir sError = m_sErrorLicenseDeclined; 307cdf0e10cSrcweir break; 308cdf0e10cSrcweir 309cdf0e10cSrcweir default: 310cdf0e10cSrcweir OSL_ASSERT(0); 311cdf0e10cSrcweir } 312cdf0e10cSrcweir 313cdf0e10cSrcweir sError.SearchAndReplace(String(OUSTR("%NAME")), String(sExtension), 0); 314cdf0e10cSrcweir //We want to have an empty line between the error messages. However, 315cdf0e10cSrcweir //there shall be no empty line after the last entry. 316cdf0e10cSrcweir if (m_bNoEntry) 317cdf0e10cSrcweir m_bNoEntry = false; 318cdf0e10cSrcweir else 319cdf0e10cSrcweir m_mle_info.InsertText(OUSTR("\n")); 320cdf0e10cSrcweir m_mle_info.InsertText(sError); 321cdf0e10cSrcweir //Insert more information about the error 322cdf0e10cSrcweir if (exceptionMessage.getLength()) 323cdf0e10cSrcweir m_mle_info.InsertText(m_sThisErrorOccurred + exceptionMessage + OUSTR("\n")); 324cdf0e10cSrcweir 325cdf0e10cSrcweir m_mle_info.InsertText(m_sNoInstall); 326cdf0e10cSrcweir m_mle_info.InsertText(OUSTR("\n")); 327cdf0e10cSrcweir } 328cdf0e10cSrcweir 329cdf0e10cSrcweir void UpdateInstallDialog::setError(OUString const & exceptionMessage) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir m_bError = true; 332cdf0e10cSrcweir m_mle_info.InsertText(exceptionMessage + OUSTR("\n")); 333cdf0e10cSrcweir } 334cdf0e10cSrcweir 335cdf0e10cSrcweir IMPL_LINK(UpdateInstallDialog, cancelHandler, void *, EMPTYARG) 336cdf0e10cSrcweir { 337cdf0e10cSrcweir m_thread->stop(); 338cdf0e10cSrcweir EndDialog(RET_CANCEL); 339cdf0e10cSrcweir return 0; 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 342cdf0e10cSrcweir //------------------------------------------------------------------------------------------------ 343cdf0e10cSrcweir 344cdf0e10cSrcweir void UpdateInstallDialog::Thread::downloadExtensions() 345cdf0e10cSrcweir { 346cdf0e10cSrcweir try 347cdf0e10cSrcweir { 348cdf0e10cSrcweir //create the download directory in the temp folder 349cdf0e10cSrcweir OUString sTempDir; 350cdf0e10cSrcweir if (::osl::FileBase::getTempDirURL(sTempDir) != ::osl::FileBase::E_None) 351cdf0e10cSrcweir throw cssu::Exception(OUSTR("Could not get URL for the temp directory. No extensions will be installed."), 0); 352cdf0e10cSrcweir 353cdf0e10cSrcweir //create a unique name for the directory 354cdf0e10cSrcweir OUString tempEntry, destFolder; 355cdf0e10cSrcweir if (::osl::File::createTempFile(&sTempDir, 0, &tempEntry ) != ::osl::File::E_None) 356cdf0e10cSrcweir throw cssu::Exception(OUSTR("Could not create a temporary file in ") + sTempDir + 357cdf0e10cSrcweir OUSTR(". No extensions will be installed"), 0 ); 358cdf0e10cSrcweir 359cdf0e10cSrcweir tempEntry = tempEntry.copy( tempEntry.lastIndexOf( '/' ) + 1 ); 360cdf0e10cSrcweir 361cdf0e10cSrcweir destFolder = dp_misc::makeURL( sTempDir, tempEntry ); 362cdf0e10cSrcweir destFolder += OUSTR("_"); 363cdf0e10cSrcweir m_sDownloadFolder = destFolder; 364cdf0e10cSrcweir try 365cdf0e10cSrcweir { 366cdf0e10cSrcweir dp_misc::create_folder(0, destFolder, m_updateCmdEnv.get(), true ); 367cdf0e10cSrcweir } catch (cssu::Exception & e) 368cdf0e10cSrcweir { 369cdf0e10cSrcweir throw cssu::Exception(e.Message + OUSTR(" No extensions will be installed."), 0); 370cdf0e10cSrcweir } 371cdf0e10cSrcweir 372cdf0e10cSrcweir 373cdf0e10cSrcweir sal_uInt16 count = 0; 374cdf0e10cSrcweir typedef std::vector<UpdateData>::iterator It; 375cdf0e10cSrcweir for (It i = m_aVecUpdateData.begin(); i != m_aVecUpdateData.end(); i++) 376cdf0e10cSrcweir { 377cdf0e10cSrcweir UpdateData & curData = *i; 378cdf0e10cSrcweir 379cdf0e10cSrcweir if (!curData.aUpdateInfo.is() || curData.aUpdateSource.is()) 380cdf0e10cSrcweir continue; 381cdf0e10cSrcweir //We assume that m_aVecUpdateData contains only information about extensions which 382cdf0e10cSrcweir //can be downloaded directly. 383cdf0e10cSrcweir OSL_ASSERT(curData.sWebsiteURL.getLength() == 0); 384cdf0e10cSrcweir 385cdf0e10cSrcweir //update the name of the extension which is to be downloaded 386cdf0e10cSrcweir { 387cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 388cdf0e10cSrcweir if (m_stop) { 389cdf0e10cSrcweir return; 390cdf0e10cSrcweir } 391cdf0e10cSrcweir m_dialog.m_ft_extension_name.SetText(curData.aInstalledPackage->getDisplayName()); 392cdf0e10cSrcweir sal_uInt16 prog = (sal::static_int_cast<sal_uInt16>(100) * ++count) / 393cdf0e10cSrcweir sal::static_int_cast<sal_uInt16>(m_aVecUpdateData.size()); 394cdf0e10cSrcweir m_dialog.m_statusbar.SetValue(prog); 395cdf0e10cSrcweir } 396cdf0e10cSrcweir dp_misc::DescriptionInfoset info(m_xComponentContext, curData.aUpdateInfo); 397cdf0e10cSrcweir //remember occurring exceptions in case we need to print out error information 398cdf0e10cSrcweir ::std::vector< ::std::pair<OUString, cssu::Exception> > vecExceptions; 399cdf0e10cSrcweir cssu::Sequence<OUString> seqDownloadURLs = info.getUpdateDownloadUrls(); 400cdf0e10cSrcweir OSL_ENSURE(seqDownloadURLs.getLength() > 0, "No download URL provided!"); 401cdf0e10cSrcweir for (sal_Int32 j = 0; j < seqDownloadURLs.getLength(); j++) 402cdf0e10cSrcweir { 403cdf0e10cSrcweir try 404cdf0e10cSrcweir { 405cdf0e10cSrcweir OSL_ENSURE(seqDownloadURLs[j].getLength() > 0, "Download URL is empty!"); 406cdf0e10cSrcweir download(seqDownloadURLs[j], curData); 407cdf0e10cSrcweir if (curData.sLocalURL.getLength() > 0) 408cdf0e10cSrcweir break; 409cdf0e10cSrcweir } 410cdf0e10cSrcweir catch ( cssu::Exception & e ) 411cdf0e10cSrcweir { 412cdf0e10cSrcweir vecExceptions.push_back( ::std::make_pair(seqDownloadURLs[j], e)); 413cdf0e10cSrcweir //There can be several different errors, for example, the URL is wrong, webserver cannot be reached, 414cdf0e10cSrcweir //name cannot be resolved. The UCB helper API does not specify different special exceptions for these 415cdf0e10cSrcweir //cases. Therefore ignore and continue. 416cdf0e10cSrcweir continue; 417cdf0e10cSrcweir } 418cdf0e10cSrcweir } 419cdf0e10cSrcweir //update the progress and display download error 420cdf0e10cSrcweir { 421cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 422cdf0e10cSrcweir if (m_stop) { 423cdf0e10cSrcweir return; 424cdf0e10cSrcweir } 425cdf0e10cSrcweir if (curData.sLocalURL.getLength() == 0) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir //Construct a string of all messages contained in the exceptions plus the respective download URLs 428cdf0e10cSrcweir ::rtl::OUStringBuffer buf(256); 429cdf0e10cSrcweir typedef ::std::vector< ::std::pair<OUString, cssu::Exception > >::const_iterator CIT; 430cdf0e10cSrcweir for (CIT j = vecExceptions.begin(); j != vecExceptions.end(); j++) 431cdf0e10cSrcweir { 432cdf0e10cSrcweir if (j != vecExceptions.begin()) 433cdf0e10cSrcweir buf.appendAscii("\n"); 434cdf0e10cSrcweir buf.append(OUSTR("Could not download ")); 435cdf0e10cSrcweir buf.append(j->first); 436cdf0e10cSrcweir buf.appendAscii(". "); 437cdf0e10cSrcweir buf.append(j->second.Message); 438cdf0e10cSrcweir } 439cdf0e10cSrcweir m_dialog.setError(UpdateInstallDialog::ERROR_DOWNLOAD, curData.aInstalledPackage->getDisplayName(), 440cdf0e10cSrcweir buf.makeStringAndClear()); 441cdf0e10cSrcweir } 442cdf0e10cSrcweir } 443cdf0e10cSrcweir 444cdf0e10cSrcweir } 445cdf0e10cSrcweir } 446cdf0e10cSrcweir catch (cssu::Exception & e) 447cdf0e10cSrcweir { 448cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 449cdf0e10cSrcweir if (m_stop) { 450cdf0e10cSrcweir return; 451cdf0e10cSrcweir } 452cdf0e10cSrcweir m_dialog.setError(e.Message); 453cdf0e10cSrcweir } 454cdf0e10cSrcweir } 455cdf0e10cSrcweir void UpdateInstallDialog::Thread::installExtensions() 456cdf0e10cSrcweir { 457cdf0e10cSrcweir //Update the fix text in the dialog to "Installing extensions..." 458cdf0e10cSrcweir { 459cdf0e10cSrcweir vos::OGuard g(Application::GetSolarMutex()); 460cdf0e10cSrcweir if (m_stop) { 461cdf0e10cSrcweir return; 462cdf0e10cSrcweir } 463cdf0e10cSrcweir m_dialog.m_ft_action.SetText(m_dialog.m_sInstalling); 464cdf0e10cSrcweir m_dialog.m_statusbar.SetValue(0); 465cdf0e10cSrcweir } 466cdf0e10cSrcweir 467cdf0e10cSrcweir sal_uInt16 count = 0; 468cdf0e10cSrcweir typedef std::vector<UpdateData>::iterator It; 469cdf0e10cSrcweir for (It i = m_aVecUpdateData.begin(); i != m_aVecUpdateData.end(); i++, count++) 470cdf0e10cSrcweir { 471cdf0e10cSrcweir //update the name of the extension which is to be installed 472cdf0e10cSrcweir { 473cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 474cdf0e10cSrcweir if (m_stop) { 475cdf0e10cSrcweir return; 476cdf0e10cSrcweir } 477cdf0e10cSrcweir //we only show progress after an extension has been installed. 478cdf0e10cSrcweir if (count > 0) { 479cdf0e10cSrcweir m_dialog.m_statusbar.SetValue( 480cdf0e10cSrcweir (sal::static_int_cast<sal_uInt16>(100) * count) / 481cdf0e10cSrcweir sal::static_int_cast<sal_uInt16>(m_aVecUpdateData.size())); 482cdf0e10cSrcweir } 483cdf0e10cSrcweir m_dialog.m_ft_extension_name.SetText(i->aInstalledPackage->getDisplayName()); 484cdf0e10cSrcweir } 485cdf0e10cSrcweir // TimeValue v = {1, 0}; 486cdf0e10cSrcweir // osl::Thread::wait(v); 487cdf0e10cSrcweir bool bError = false; 488cdf0e10cSrcweir bool bLicenseDeclined = false; 489cdf0e10cSrcweir cssu::Reference<css::deployment::XPackage> xExtension; 490cdf0e10cSrcweir UpdateData & curData = *i; 491cdf0e10cSrcweir cssu::Exception exc; 492cdf0e10cSrcweir try 493cdf0e10cSrcweir { 494cdf0e10cSrcweir cssu::Reference< css::task::XAbortChannel > xAbortChannel( 495cdf0e10cSrcweir curData.aInstalledPackage->createAbortChannel() ); 496cdf0e10cSrcweir { 497cdf0e10cSrcweir vos::OGuard g(Application::GetSolarMutex()); 498cdf0e10cSrcweir if (m_stop) { 499cdf0e10cSrcweir return; 500cdf0e10cSrcweir } 501cdf0e10cSrcweir m_abort = xAbortChannel; 502cdf0e10cSrcweir } 503cdf0e10cSrcweir if (!curData.aUpdateSource.is() && curData.sLocalURL.getLength()) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir css::beans::NamedValue prop(OUSTR("EXTENSION_UPDATE"), css::uno::makeAny(OUSTR("1"))); 506cdf0e10cSrcweir if (!curData.bIsShared) 507cdf0e10cSrcweir xExtension = m_dialog.getExtensionManager()->addExtension( 508cdf0e10cSrcweir curData.sLocalURL, css::uno::Sequence<css::beans::NamedValue>(&prop, 1), 509cdf0e10cSrcweir OUSTR("user"), xAbortChannel, m_updateCmdEnv.get()); 510cdf0e10cSrcweir else 511cdf0e10cSrcweir xExtension = m_dialog.getExtensionManager()->addExtension( 512cdf0e10cSrcweir curData.sLocalURL, css::uno::Sequence<css::beans::NamedValue>(&prop, 1), 513cdf0e10cSrcweir OUSTR("shared"), xAbortChannel, m_updateCmdEnv.get()); 514cdf0e10cSrcweir } 515cdf0e10cSrcweir else if (curData.aUpdateSource.is()) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir OSL_ASSERT(curData.aUpdateSource.is()); 518cdf0e10cSrcweir //I am not sure if we should obtain the install properties and pass them into 519cdf0e10cSrcweir //add extension. Currently it contains only "SUPPRESS_LICENSE". So it it could happen 520cdf0e10cSrcweir //that a license is displayed when updating from the shared repository, although the 521cdf0e10cSrcweir //shared extension was installed using "SUPPRESS_LICENSE". 522cdf0e10cSrcweir css::beans::NamedValue prop(OUSTR("EXTENSION_UPDATE"), css::uno::makeAny(OUSTR("1"))); 523cdf0e10cSrcweir if (!curData.bIsShared) 524cdf0e10cSrcweir xExtension = m_dialog.getExtensionManager()->addExtension( 525cdf0e10cSrcweir curData.aUpdateSource->getURL(), css::uno::Sequence<css::beans::NamedValue>(&prop, 1), 526cdf0e10cSrcweir OUSTR("user"), xAbortChannel, m_updateCmdEnv.get()); 527cdf0e10cSrcweir else 528cdf0e10cSrcweir xExtension = m_dialog.getExtensionManager()->addExtension( 529cdf0e10cSrcweir curData.aUpdateSource->getURL(), css::uno::Sequence<css::beans::NamedValue>(&prop, 1), 530cdf0e10cSrcweir OUSTR("shared"), xAbortChannel, m_updateCmdEnv.get()); 531cdf0e10cSrcweir } 532cdf0e10cSrcweir } 533cdf0e10cSrcweir catch (css::deployment::DeploymentException & de) 534cdf0e10cSrcweir { 535cdf0e10cSrcweir if (de.Cause.has<css::deployment::LicenseException>()) 536cdf0e10cSrcweir { 537cdf0e10cSrcweir bLicenseDeclined = true; 538cdf0e10cSrcweir } 539cdf0e10cSrcweir else 540cdf0e10cSrcweir { 541cdf0e10cSrcweir exc = de.Cause.get<cssu::Exception>(); 542cdf0e10cSrcweir bError = true; 543cdf0e10cSrcweir } 544cdf0e10cSrcweir } 545cdf0e10cSrcweir catch (cssu::Exception& e) 546cdf0e10cSrcweir { 547cdf0e10cSrcweir exc = e; 548cdf0e10cSrcweir bError = true; 549cdf0e10cSrcweir } 550cdf0e10cSrcweir 551cdf0e10cSrcweir if (bLicenseDeclined) 552cdf0e10cSrcweir { 553cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 554cdf0e10cSrcweir if (m_stop) { 555cdf0e10cSrcweir return; 556cdf0e10cSrcweir } 557cdf0e10cSrcweir m_dialog.setError(UpdateInstallDialog::ERROR_LICENSE_DECLINED, 558cdf0e10cSrcweir curData.aInstalledPackage->getDisplayName(), OUString()); 559cdf0e10cSrcweir } 560cdf0e10cSrcweir else if (!xExtension.is() || bError) 561cdf0e10cSrcweir { 562cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 563cdf0e10cSrcweir if (m_stop) { 564cdf0e10cSrcweir return; 565cdf0e10cSrcweir } 566cdf0e10cSrcweir m_dialog.setError(UpdateInstallDialog::ERROR_INSTALLATION, 567cdf0e10cSrcweir curData.aInstalledPackage->getDisplayName(), exc.Message); 568cdf0e10cSrcweir } 569cdf0e10cSrcweir } 570cdf0e10cSrcweir { 571cdf0e10cSrcweir vos::OGuard g(Application::GetSolarMutex()); 572cdf0e10cSrcweir if (m_stop) { 573cdf0e10cSrcweir return; 574cdf0e10cSrcweir } 575cdf0e10cSrcweir m_dialog.m_statusbar.SetValue(100); 576cdf0e10cSrcweir m_dialog.m_ft_extension_name.SetText(OUString()); 577cdf0e10cSrcweir m_dialog.m_ft_action.SetText(m_dialog.m_sFinished); 578cdf0e10cSrcweir } 579cdf0e10cSrcweir } 580cdf0e10cSrcweir 581cdf0e10cSrcweir void UpdateInstallDialog::Thread::removeTempDownloads() 582cdf0e10cSrcweir { 583cdf0e10cSrcweir if (m_sDownloadFolder.getLength()) 584cdf0e10cSrcweir { 585cdf0e10cSrcweir dp_misc::erase_path(m_sDownloadFolder, 586cdf0e10cSrcweir cssu::Reference<css::ucb::XCommandEnvironment>(),false /* no throw: ignore errors */ ); 587cdf0e10cSrcweir //remove also the temp file which we have used to create the unique name 588cdf0e10cSrcweir OUString tempFile = m_sDownloadFolder.copy(0, m_sDownloadFolder.getLength() - 1); 589cdf0e10cSrcweir dp_misc::erase_path(tempFile, cssu::Reference<css::ucb::XCommandEnvironment>(),false); 590cdf0e10cSrcweir m_sDownloadFolder = OUString(); 591cdf0e10cSrcweir } 592cdf0e10cSrcweir } 593cdf0e10cSrcweir 594cdf0e10cSrcweir 595cdf0e10cSrcweir void UpdateInstallDialog::Thread::download(OUString const & sDownloadURL, UpdateData & aUpdateData) 596cdf0e10cSrcweir { 597cdf0e10cSrcweir { 598cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 599cdf0e10cSrcweir if (m_stop) { 600cdf0e10cSrcweir return; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir } 603cdf0e10cSrcweir 604cdf0e10cSrcweir OSL_ASSERT(m_sDownloadFolder.getLength()); 605cdf0e10cSrcweir OUString destFolder, tempEntry; 606cdf0e10cSrcweir if (::osl::File::createTempFile( 607cdf0e10cSrcweir &m_sDownloadFolder, 608cdf0e10cSrcweir 0, &tempEntry ) != ::osl::File::E_None) 609cdf0e10cSrcweir { 610cdf0e10cSrcweir //ToDo feedback in window that download of this component failed 611cdf0e10cSrcweir throw cssu::Exception(OUSTR("Could not create temporary file in folder ") + destFolder + OUSTR("."), 0); 612cdf0e10cSrcweir } 613cdf0e10cSrcweir tempEntry = tempEntry.copy( tempEntry.lastIndexOf( '/' ) + 1 ); 614cdf0e10cSrcweir 615cdf0e10cSrcweir destFolder = dp_misc::makeURL( m_sDownloadFolder, tempEntry ); 616cdf0e10cSrcweir destFolder += OUSTR("_"); 617cdf0e10cSrcweir 618cdf0e10cSrcweir ::ucbhelper::Content destFolderContent; 619cdf0e10cSrcweir dp_misc::create_folder( &destFolderContent, destFolder, m_updateCmdEnv.get() ); 620cdf0e10cSrcweir 621cdf0e10cSrcweir ::ucbhelper::Content sourceContent; 622cdf0e10cSrcweir dp_misc::create_ucb_content( &sourceContent, sDownloadURL, m_updateCmdEnv.get() ); 623cdf0e10cSrcweir 624cdf0e10cSrcweir const OUString sTitle(sourceContent.getPropertyValue( 625cdf0e10cSrcweir dp_misc::StrTitle::get() ).get<OUString>() ); 626cdf0e10cSrcweir 627cdf0e10cSrcweir if (destFolderContent.transferContent( 628cdf0e10cSrcweir sourceContent, ::ucbhelper::InsertOperation_COPY, 629cdf0e10cSrcweir sTitle, css::ucb::NameClash::OVERWRITE )) 630cdf0e10cSrcweir { 631cdf0e10cSrcweir //the user may have cancelled the dialog because downloading took to long 632cdf0e10cSrcweir { 633cdf0e10cSrcweir ::vos::OGuard g(Application::GetSolarMutex()); 634cdf0e10cSrcweir if (m_stop) { 635cdf0e10cSrcweir return; 636cdf0e10cSrcweir } 637cdf0e10cSrcweir //all errors should be handeld by the command environment. 638cdf0e10cSrcweir aUpdateData.sLocalURL = destFolder + OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) ) + sTitle; 639cdf0e10cSrcweir } 640cdf0e10cSrcweir } 641cdf0e10cSrcweir } 642cdf0e10cSrcweir 643cdf0e10cSrcweir 644cdf0e10cSrcweir // ------------------------------------------------------------------------------------------------------- 645cdf0e10cSrcweir 646cdf0e10cSrcweir UpdateCommandEnv::UpdateCommandEnv( cssu::Reference< cssu::XComponentContext > const & xCtx, 647cdf0e10cSrcweir UpdateInstallDialog & updateDialog, 648cdf0e10cSrcweir ::rtl::Reference<UpdateInstallDialog::Thread>const & thread) 649cdf0e10cSrcweir : m_updateDialog( updateDialog ), 650cdf0e10cSrcweir m_installThread(thread), 651cdf0e10cSrcweir m_xContext(xCtx) 652cdf0e10cSrcweir { 653cdf0e10cSrcweir } 654cdf0e10cSrcweir 655cdf0e10cSrcweir UpdateCommandEnv::~UpdateCommandEnv() 656cdf0e10cSrcweir { 657cdf0e10cSrcweir } 658cdf0e10cSrcweir 659cdf0e10cSrcweir 660cdf0e10cSrcweir // XCommandEnvironment 661cdf0e10cSrcweir //______________________________________________________________________________ 662cdf0e10cSrcweir cssu::Reference<css::task::XInteractionHandler> UpdateCommandEnv::getInteractionHandler() 663cdf0e10cSrcweir throw (cssu::RuntimeException) 664cdf0e10cSrcweir { 665cdf0e10cSrcweir return this; 666cdf0e10cSrcweir } 667cdf0e10cSrcweir 668cdf0e10cSrcweir //______________________________________________________________________________ 669cdf0e10cSrcweir cssu::Reference<css::ucb::XProgressHandler> UpdateCommandEnv::getProgressHandler() 670cdf0e10cSrcweir throw (cssu::RuntimeException) 671cdf0e10cSrcweir { 672cdf0e10cSrcweir return this; 673cdf0e10cSrcweir } 674cdf0e10cSrcweir 675cdf0e10cSrcweir // XInteractionHandler 676cdf0e10cSrcweir void UpdateCommandEnv::handle( 677cdf0e10cSrcweir cssu::Reference< css::task::XInteractionRequest> const & xRequest ) 678cdf0e10cSrcweir throw (cssu::RuntimeException) 679cdf0e10cSrcweir { 680cdf0e10cSrcweir cssu::Any request( xRequest->getRequest() ); 681cdf0e10cSrcweir OSL_ASSERT( request.getValueTypeClass() == cssu::TypeClass_EXCEPTION ); 682cdf0e10cSrcweir dp_misc::TRACE(OUSTR("[dp_gui_cmdenv.cxx] incoming request:\n") 683cdf0e10cSrcweir + ::comphelper::anyToString(request) + OUSTR("\n\n")); 684cdf0e10cSrcweir 685cdf0e10cSrcweir css::deployment::VersionException verExc; 686cdf0e10cSrcweir bool approve = false; 687cdf0e10cSrcweir bool abort = false; 688cdf0e10cSrcweir 689cdf0e10cSrcweir if (request >>= verExc) 690cdf0e10cSrcweir { //We must catch the version exception during the update, 691cdf0e10cSrcweir //because otherwise the user would be confronted with the dialogs, asking 692cdf0e10cSrcweir //them if they want to replace an already installed version of the same extension. 693cdf0e10cSrcweir //During an update we assume that we always want to replace the old version with the 694cdf0e10cSrcweir //new version. 695cdf0e10cSrcweir approve = true; 696cdf0e10cSrcweir } 697cdf0e10cSrcweir 698cdf0e10cSrcweir if (approve == false && abort == false) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir //forward to interaction handler for main dialog. 701cdf0e10cSrcweir handleInteractionRequest( m_xContext, xRequest ); 702cdf0e10cSrcweir } 703cdf0e10cSrcweir else 704cdf0e10cSrcweir { 705cdf0e10cSrcweir // select: 706cdf0e10cSrcweir cssu::Sequence< cssu::Reference< css::task::XInteractionContinuation > > conts( 707cdf0e10cSrcweir xRequest->getContinuations() ); 708cdf0e10cSrcweir cssu::Reference< css::task::XInteractionContinuation > const * pConts = 709cdf0e10cSrcweir conts.getConstArray(); 710cdf0e10cSrcweir sal_Int32 len = conts.getLength(); 711cdf0e10cSrcweir for ( sal_Int32 pos = 0; pos < len; ++pos ) 712cdf0e10cSrcweir { 713cdf0e10cSrcweir if (approve) { 714cdf0e10cSrcweir cssu::Reference< css::task::XInteractionApprove > xInteractionApprove( 715cdf0e10cSrcweir pConts[ pos ], cssu::UNO_QUERY ); 716cdf0e10cSrcweir if (xInteractionApprove.is()) { 717cdf0e10cSrcweir xInteractionApprove->select(); 718cdf0e10cSrcweir // don't query again for ongoing continuations: 719cdf0e10cSrcweir approve = false; 720cdf0e10cSrcweir } 721cdf0e10cSrcweir } 722cdf0e10cSrcweir else if (abort) { 723cdf0e10cSrcweir cssu::Reference< css::task::XInteractionAbort > xInteractionAbort( 724cdf0e10cSrcweir pConts[ pos ], cssu::UNO_QUERY ); 725cdf0e10cSrcweir if (xInteractionAbort.is()) { 726cdf0e10cSrcweir xInteractionAbort->select(); 727cdf0e10cSrcweir // don't query again for ongoing continuations: 728cdf0e10cSrcweir abort = false; 729cdf0e10cSrcweir } 730cdf0e10cSrcweir } 731cdf0e10cSrcweir } 732cdf0e10cSrcweir } 733cdf0e10cSrcweir } 734cdf0e10cSrcweir 735cdf0e10cSrcweir // XProgressHandler 736cdf0e10cSrcweir void UpdateCommandEnv::push( cssu::Any const & /*Status*/ ) 737cdf0e10cSrcweir throw (cssu::RuntimeException) 738cdf0e10cSrcweir { 739cdf0e10cSrcweir } 740cdf0e10cSrcweir 741cdf0e10cSrcweir 742cdf0e10cSrcweir void UpdateCommandEnv::update( cssu::Any const & /*Status */) 743cdf0e10cSrcweir throw (cssu::RuntimeException) 744cdf0e10cSrcweir { 745cdf0e10cSrcweir } 746cdf0e10cSrcweir 747cdf0e10cSrcweir void UpdateCommandEnv::pop() throw (cssu::RuntimeException) 748cdf0e10cSrcweir { 749cdf0e10cSrcweir } 750cdf0e10cSrcweir 751cdf0e10cSrcweir 752cdf0e10cSrcweir } //end namespace dp_gui 753