diff options
Diffstat (limited to 'desktop/source/migration/migration.cxx')
-rw-r--r-- | desktop/source/migration/migration.cxx | 217 |
1 files changed, 157 insertions, 60 deletions
diff --git a/desktop/source/migration/migration.cxx b/desktop/source/migration/migration.cxx index 6396ef1091..6e6ae303ee 100644 --- a/desktop/source/migration/migration.cxx +++ b/desktop/source/migration/migration.cxx @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -34,7 +35,6 @@ #include "migration.hxx" #include "migration_impl.hxx" -#include "cfgfilter.hxx" #include <unotools/textsearch.hxx> #include <comphelper/processfactory.hxx> @@ -193,25 +193,41 @@ static const ::rtl::OUString MENU_SUBMENU = ::rtl::OUString::createFromAscii(".. return sIdentifier; } -static MigrationImpl *pImpl = 0; -static Mutex aMutex; -static MigrationImpl *getImpl() -{ - MutexGuard aGuard(aMutex); - if (pImpl == 0) - pImpl = new MigrationImpl(comphelper::getProcessServiceFactory()); - return pImpl; -} +static const ::rtl::OUString MENU_SEPERATOR(RTL_CONSTASCII_USTRINGPARAM(" | ")); +static const ::rtl::OUString MENU_SUBMENU(RTL_CONSTASCII_USTRINGPARAM("...")); +static const ::rtl::OUString MIGRATION_STAMP_NAME(RTL_CONSTASCII_USTRINGPARAM("/MIGRATED")); -static void releaseImpl() +::rtl::OUString retrieveLabelFromCommand(const ::rtl::OUString& sCommand, const ::rtl::OUString& sModuleIdentifier) { - MutexGuard aGuard(aMutex); - if (pImpl != 0) + ::rtl::OUString sLabel; + + uno::Reference< container::XNameAccess > xUICommands; + uno::Reference< container::XNameAccess > xNameAccess( ::comphelper::getProcessServiceFactory()->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.UICommandDescription")) ), uno::UNO_QUERY ); + if ( xNameAccess.is() ) { - delete pImpl; - pImpl = 0; + uno::Any a = xNameAccess->getByName( sModuleIdentifier ); + a >>= xUICommands; } -} + if (xUICommands.is()) + { + if ( sCommand.getLength() > 0 ) + { + rtl::OUString aStr; + ::uno::Sequence< beans::PropertyValue > aPropSeq; + try + { + uno::Any a( xUICommands->getByName( sCommand )); + if ( a >>= aPropSeq ) + { + for ( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ ) + { + if ( aPropSeq[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Label" ) )) + { + aPropSeq[i].Value >>= aStr; + break; + } + } + } // static main entry point for the migration process void Migration::doMigration() @@ -225,37 +241,108 @@ void Migration::doMigration() aMsg += OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US); OSL_ENSURE(sal_False, aMsg.getStr()); } - OSL_ENSURE(bResult, "Migration has not been successfull"); - // shut down migration framework - releaseImpl(); -} -void Migration::cancelMigration() -{ - releaseImpl(); + return sLabel; } -sal_Bool Migration::checkMigration() +::rtl::OUString mapModuleShortNameToIdentifier(const ::rtl::OUString& sShortName) { - return getImpl()->checkMigration(); + ::rtl::OUString sIdentifier; + + if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("StartModule")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.StartModule")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("swriter")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("scalc")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdraw")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.DrawingDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("simpress")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.PresentationDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("smath")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.formula.FormulaProperties")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("schart")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2.ChartDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("BasicIDE")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.BasicIDE")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("dbapp")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.OfficeDatabaseDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sglobal")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.GlobalDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sweb")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.WebDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("swxform")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xforms.XMLFormDocument")); + + else if (sShortName.equals(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sbibliography")))) + sIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Bibliography")); + + return sIdentifier; } -OUString Migration::getOldVersionName() +bool MigrationImpl::alreadyMigrated() { - return getImpl()->getOldVersionName(); + rtl::OUString aStr = m_aInfo.userdata + MIGRATION_STAMP_NAME; + File aFile(aStr); + // create migration stamp, and/or check its existence + bool bRet = aFile.open (osl_File_OpenFlag_Write | osl_File_OpenFlag_Create | osl_File_OpenFlag_NoLock) == FileBase::E_EXIST; + OSL_TRACE( "File '%s' exists? %d\n", + rtl::OUStringToOString(aStr, RTL_TEXTENCODING_ASCII_US).getStr(), + bRet ); + return bRet; } -OUString MigrationImpl::getOldVersionName() +bool MigrationImpl::initializeMigration() { - return m_aInfo.productname; + bool bRet = false; + + if (!checkMigrationCompleted()) { + readAvailableMigrations(m_vMigrationsAvailable); + sal_Int32 nIndex = findPreferedMigrationProcess(m_vMigrationsAvailable); + // m_aInfo is now set to the preferred migration source + if ( nIndex >= 0 ) { + if (alreadyMigrated()) + return false; + m_vrMigrations = readMigrationSteps(m_vMigrationsAvailable[nIndex].name); + } + + bRet = m_aInfo.userdata.getLength() > 0; + } + + OSL_TRACE( "Migration %s\n", bRet ? "needed" : "not required" ); + + return bRet; } -sal_Bool MigrationImpl::checkMigration() +void Migration::migrateSettingsIfNecessary() { - if (m_aInfo.userdata.getLength() > 0 && ! checkMigrationCompleted()) - return sal_True; - else - return sal_False; + MigrationImpl aImpl( comphelper::getProcessServiceFactory() ); + + if (! aImpl.initializeMigration() ) + return; + + sal_Bool bResult = sal_False; + try { + bResult = aImpl.doMigration(); + } catch (Exception& e) + { + OString aMsg("doMigration() exception: "); + aMsg += OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US); + OSL_ENSURE(sal_False, aMsg.getStr()); + } + OSL_ENSURE(bResult, "Migration has not been successfull"); + (void)bResult; } MigrationImpl::MigrationImpl(const uno::Reference< XMultiServiceFactory >& xFactory) @@ -270,9 +357,9 @@ MigrationImpl::MigrationImpl(const uno::Reference< XMultiServiceFactory >& xFact MigrationImpl::~MigrationImpl() { - } +// The main entry point for migrating settings sal_Bool MigrationImpl::doMigration() { // compile file list for migration @@ -370,7 +457,7 @@ sal_Bool MigrationImpl::doMigration() void MigrationImpl::refresh() { uno::Reference< XRefreshable > xRefresh(m_xFactory->createInstance( - OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), uno::UNO_QUERY); + OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationProvider"))), uno::UNO_QUERY); if (xRefresh.is()) xRefresh->refresh(); else @@ -382,24 +469,33 @@ void MigrationImpl::setMigrationCompleted() { try { uno::Reference< XPropertySet > aPropertySet(getConfigAccess("org.openoffice.Setup/Office", true), uno::UNO_QUERY_THROW); - aPropertySet->setPropertyValue(OUString::createFromAscii("MigrationCompleted"), uno::makeAny(sal_True)); + aPropertySet->setPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM("MigrationCompleted")), uno::makeAny(sal_True)); uno::Reference< XChangesBatch >(aPropertySet, uno::UNO_QUERY_THROW)->commitChanges(); } catch (...) { // fail silently } } -sal_Bool MigrationImpl::checkMigrationCompleted() +bool MigrationImpl::checkMigrationCompleted() { sal_Bool bMigrationCompleted = sal_False; try { uno::Reference< XPropertySet > aPropertySet( getConfigAccess("org.openoffice.Setup/Office"), uno::UNO_QUERY_THROW); aPropertySet->getPropertyValue( - OUString::createFromAscii("MigrationCompleted")) >>= bMigrationCompleted; + OUString(RTL_CONSTASCII_USTRINGPARAM("MigrationCompleted"))) >>= bMigrationCompleted; + + if( !bMigrationCompleted && getenv("SAL_DISABLE_USERMIGRATION" ) ) + { + // migration prevented - fake it's success + setMigrationCompleted(); + bMigrationCompleted = sal_True; + } } catch (Exception&) { // just return false... } + OSL_TRACE( "Migration %s", bMigrationCompleted ? "already completed" : "not done" ); + return bMigrationCompleted; } @@ -484,21 +580,21 @@ migrations_vr MigrationImpl::readMigrationSteps(const ::rtl::OUString& rMigratio } // exluded files... - if (tmpAccess->getByName(OUString::createFromAscii("ExcludedFiles")) >>= tmpSeq) + if (tmpAccess->getByName(OUString(RTL_CONSTASCII_USTRINGPARAM("ExcludedFiles"))) >>= tmpSeq) { for (sal_Int32 j=0; j<tmpSeq.getLength(); j++) tmpStep.excludeFiles.push_back(tmpSeq[j]); } // included nodes... - if (tmpAccess->getByName(OUString::createFromAscii("IncludedNodes")) >>= tmpSeq) + if (tmpAccess->getByName(OUString(RTL_CONSTASCII_USTRINGPARAM("IncludedNodes"))) >>= tmpSeq) { for (sal_Int32 j=0; j<tmpSeq.getLength(); j++) tmpStep.includeConfig.push_back(tmpSeq[j]); } // excluded nodes... - if (tmpAccess->getByName(OUString::createFromAscii("ExcludedNodes")) >>= tmpSeq) + if (tmpAccess->getByName(OUString(RTL_CONSTASCII_USTRINGPARAM("ExcludedNodes"))) >>= tmpSeq) { for (sal_Int32 j=0; j<tmpSeq.getLength(); j++) tmpStep.excludeConfig.push_back(tmpSeq[j]); @@ -522,7 +618,7 @@ migrations_vr MigrationImpl::readMigrationSteps(const ::rtl::OUString& rMigratio } // generic service - tmpAccess->getByName(OUString::createFromAscii("MigrationService")) >>= tmpStep.service; + tmpAccess->getByName(OUString(RTL_CONSTASCII_USTRINGPARAM("MigrationService"))) >>= tmpStep.service; vrMigrations->push_back(tmpStep); } @@ -572,7 +668,7 @@ install_info MigrationImpl::findInstallation(const strings_v& rVersions) aUserInst += ::rtl::OUString::createFromAscii("/"); #if defined UNX && ! defined MACOSX // tribute to whoever had the "great" idea to use different names on Windows and Unix - aUserInst += ::rtl::OUString::createFromAscii("."); + aUserInst += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".")); #endif aUserInst += aProfileName; try @@ -633,9 +729,9 @@ strings_vr MigrationImpl::applyPatterns(const strings_v& vSet, const strings_v& end = (xub_StrLen)(i_set->getLength()); if (ts.SearchFrwrd(*i_set, &start, &end)) vrResult->push_back(*i_set); - i_set++; + ++i_set; } - i_pat++; + ++i_pat; } return vrResult; } @@ -672,7 +768,7 @@ strings_vr MigrationImpl::getAllFiles(const OUString& baseURL) const { vrSubResult = getAllFiles(*i); vrResult->insert(vrResult->end(), vrSubResult->begin(), vrSubResult->end()); - i++; + ++i; } } return vrResult; @@ -700,9 +796,9 @@ strings_vr MigrationImpl::compileFileList() { vrInclude = applyPatterns(*vrFiles, i_migr->includeFiles); vrExclude = applyPatterns(*vrFiles, i_migr->excludeFiles); - substract(*vrInclude, *vrExclude); + subtract(*vrInclude, *vrExclude); vrResult->insert(vrResult->end(), vrInclude->begin(), vrInclude->end()); - i_migr++; + ++i_migr; } return vrResult; } @@ -809,7 +905,7 @@ void MigrationImpl::copyConfig() { } // removes elements of vector 2 in vector 1 -void MigrationImpl::substract(strings_v& va, const strings_v& vb_c) const +void MigrationImpl::subtract(strings_v& va, const strings_v& vb_c) const { strings_v vb(vb_c); // ensure uniqueness of entries @@ -836,9 +932,9 @@ void MigrationImpl::substract(strings_v& va, const strings_v& vb_c) const break; } else - i_in++; + ++i_in; } - i_ex++; + ++i_ex; } } @@ -846,12 +942,12 @@ uno::Reference< XNameAccess > MigrationImpl::getConfigAccess(const sal_Char* pPa { uno::Reference< XNameAccess > xNameAccess; try{ - OUString sConfigSrvc = OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider"); + OUString sConfigSrvc(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationProvider")); OUString sAccessSrvc; if (bUpdate) - sAccessSrvc = OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"); + sAccessSrvc = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationUpdateAccess")); else - sAccessSrvc = OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"); + sAccessSrvc = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationAccess")); OUString sConfigURL = OUString::createFromAscii(pPath); @@ -886,7 +982,6 @@ void MigrationImpl::copyFiles() { while (i_file != m_vrFileList->end()) { - // remove installation prefix from file localName = i_file->copy(m_aInfo.userdata.getLength()); destName = userInstall + localName; @@ -902,7 +997,7 @@ void MigrationImpl::copyFiles() + OUStringToOString(destName, RTL_TEXTENCODING_UTF8); OSL_ENSURE(sal_False, msg.getStr()); } - i_file++; + ++i_file; } } else @@ -916,10 +1011,10 @@ void MigrationImpl::runServices() // Build argument array uno::Sequence< uno::Any > seqArguments(3); seqArguments[0] = uno::makeAny(NamedValue( - OUString::createFromAscii("Productname"), + OUString(RTL_CONSTASCII_USTRINGPARAM("Productname")), uno::makeAny(m_aInfo.productname))); seqArguments[1] = uno::makeAny(NamedValue( - OUString::createFromAscii("UserData"), + OUString(RTL_CONSTASCII_USTRINGPARAM("UserData")), uno::makeAny(m_aInfo.userdata))); @@ -966,7 +1061,7 @@ void MigrationImpl::runServices() } } - i_mig++; + ++i_mig; } } @@ -1363,3 +1458,5 @@ void NewVersionUIInfo::init(const ::std::vector< MigrationModuleInfo >& vModules } } // namespace desktop + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |