/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: setofficelang.cxx,v $ * $Revision: 1.6 $ * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_configmgr.hxx" #include #include "unomain.hxx" #include #include //============================================================================= const int OPERATION_SUCCEEDED = 0; const int ERROR_LANGUAGE_NOT_SUPPORTED = 1; const int ERROR_INVALID_ARGS = 2; const int ERROR_RUNTIME_FAILURE = 3; //============================================================================= rtl::OUString const k_BaseSettingsPath( RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup")); rtl::OUString const k_AppSettingsPath( RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Office.Linguistic/General")); rtl::OUString const k_LocaleListSetting( RTL_CONSTASCII_USTRINGPARAM("Office/InstalledLocales") ); rtl::OUString const k_LocaleSetting( RTL_CONSTASCII_USTRINGPARAM("L10N/ooLocale") ); rtl::OUString const k_UILocaleSetting( RTL_CONSTASCII_USTRINGPARAM("UILocale") ); //============================================================================= static inline rtl::OString narrow(rtl::OUString const & aString) { return rtl::OUStringToOString( aString, osl_getThreadTextEncoding() ); } //============================================================================= static void usage() { rtl::OString sApp = narrow( unoapp::getAppCommandPath() ); fprintf(stderr, "%s - set the user interface language " "of a OpenOffice.org/StarOffice/StarSuite " "installation\n", sApp.getStr()); fprintf(stderr, "\nusage : %s [-afcpl] ..\n", sApp.getStr()); fprintf(stderr, "\n Options:" "\n -a Change the default language of the installation. " "\n This may require administrative rights. " "\n -f Force selection of language. " "\n Skips the check if this language is installed. " "\n -c Display current active language. " "\n -p Display current preferred language. " "\n -l List all installed languages. "); fprintf(stderr, "\n - A language specified by its ISO code (e.g. 'en-US','de') or '-' for default. " "\n This language must be supported by the office installation\n" "\n If multiple languages are listed, the first one that is installed is used.\n"); fprintf(stderr, "\nResult codes: 0 - Setting language successfull" "\n 1 - The language is not supported by this office installation" "\n 2 - Invalid arguments" "\n 3 - An internal error occurred\n"); fflush(stdout); } //--------------------------------------------------------------------------- #include #include #include #include #include #include namespace uno = ::com::sun::star::uno; namespace lang = ::com::sun::star::lang; namespace util = ::com::sun::star::util; namespace beans = ::com::sun::star::beans; namespace container = ::com::sun::star::container; using rtl::OUString; //--------------------------------------------------------------------------- static uno::Reference< lang::XMultiServiceFactory > createProvider(uno::Reference< uno::XComponentContext > const & xContext, bool bAdmin=false); static uno::Reference< uno::XInterface > createView(uno::Reference< lang::XMultiServiceFactory > const & xProvider, OUString const & aNodepath, bool bUpdate = false); static uno::Reference< util::XChangesBatch > createUpdateView(uno::Reference< lang::XMultiServiceFactory > const & xProvider, OUString const & aNodepath); static void disposeComponent(uno::BaseReference const & xComp); // -------------------------------------------------------------------------- int SAL_CALL unoapp::uno_main(uno::Reference< uno::XComponentContext > const & xContext) SAL_THROW( (uno::Exception) ) { // get args uno::Sequence< OUString > const aArgs( getAppCommandArgs() ); sal_Int32 const nArgC = aArgs.getLength(); sal_Int32 ix = 0; // get options bool bAdminMode = false; bool bForce = false; bool bShowCurrentLang = false; bool bShowSelectedLang = false; bool bListInstalledLangs = false; bool bInfoRequest = false; while (ix < nArgC && aArgs[ix].matchAsciiL("-",1)) { sal_Int32 const nOptCount = aArgs[ix].getLength() -1; if (nOptCount <= 0) { // a lone "-" means set-to-default-locale break; } sal_Unicode const * const pOpts = aArgs[ix].getStr() + 1; for (sal_Int32 opt = 0; opt < nOptCount; ++opt) { switch (pOpts[opt]) { case 'a': bAdminMode = true; break; case 'f': bForce = true; break; case 'c': bShowCurrentLang = true; bInfoRequest = true; break; case 'p': bShowSelectedLang = true; bInfoRequest = true; break; case 'l': bListInstalledLangs = true; bInfoRequest = true; break; default: usage(); return ERROR_INVALID_ARGS; } } ++ix; } if ((nArgC <= ix) && !bInfoRequest) { // no more remaining args and no info request usage(); return ERROR_INVALID_ARGS; } try { uno::Reference< lang::XMultiServiceFactory > xProvider = createProvider(xContext); uno::Reference< lang::XMultiServiceFactory > xAppProvider = createProvider(xContext,bAdminMode); OSL_ASSERT( xProvider.is()); OSL_ASSERT( xAppProvider.is()); uno::Reference< container::XHierarchicalNameAccess > xBaseSettings( createView(xProvider,k_BaseSettingsPath), uno::UNO_QUERY_THROW ); if (bShowCurrentLang) { rtl::OUString aCurrentLocaleU; if (!(xBaseSettings->getByHierarchicalName(k_LocaleSetting) >>= aCurrentLocaleU) ) return ERROR_RUNTIME_FAILURE; rtl::OString aCurrentLocale = ::rtl::OUStringToOString(aCurrentLocaleU, RTL_TEXTENCODING_ASCII_US); printf("%s\n", aCurrentLocale.getStr()); } if (bShowSelectedLang) { uno::Reference< container::XNameAccess > xAppSettings( createView(xAppProvider,k_AppSettingsPath), uno::UNO_QUERY_THROW ); rtl::OUString aSelectedLocaleU; if (!(xAppSettings->getByName(k_UILocaleSetting) >>= aSelectedLocaleU) ) return ERROR_RUNTIME_FAILURE; rtl::OString aSelectedLocale = ::rtl::OUStringToOString(aSelectedLocaleU, RTL_TEXTENCODING_ASCII_US); if (aSelectedLocale.getLength() == 0) aSelectedLocale="-"; printf("%s\n", aSelectedLocale.getStr()); disposeComponent(xAppSettings); } uno::Reference< container::XNameAccess > xSupportedLocales; xBaseSettings->getByHierarchicalName(k_LocaleListSetting) >>= xSupportedLocales; if (bListInstalledLangs) { if (!xSupportedLocales.is()) return ERROR_RUNTIME_FAILURE; uno::Sequence< OUString > aSupportedLocales = xSupportedLocales->getElementNames(); for (sal_Int32 i=0; i ix) { bool bLocaleFound = false; uno::Reference< util::XChangesBatch > xAppView = createUpdateView(xAppProvider,k_AppSettingsPath); uno::Reference< container::XNameReplace > xSettings(xAppView, uno::UNO_QUERY_THROW); if (!xSupportedLocales.is()) return ERROR_RUNTIME_FAILURE; for ( ; ix < nArgC; ++ix) { OUString const aTargetLocale = aArgs[ix]; if (aTargetLocale.equalsAscii("-")) { uno::Reference< beans::XPropertyState > xSettingsState(xSettings, uno::UNO_QUERY); // if we can't reset, we treat this as unsupported language if (!xSettingsState.is()) continue; bLocaleFound = true; xSettingsState->setPropertyToDefault(k_UILocaleSetting); xAppView->commitChanges(); break; } else if (bForce || xSupportedLocales->hasByName(aTargetLocale)) { bLocaleFound = true; xSettings->replaceByName(k_UILocaleSetting, uno::makeAny(aTargetLocale)); xAppView->commitChanges(); break; } } disposeComponent(xAppView); if (!bLocaleFound) return ERROR_LANGUAGE_NOT_SUPPORTED; } disposeComponent(xBaseSettings); if (xAppProvider != xProvider) disposeComponent(xAppProvider); disposeComponent(xProvider); } catch (uno::Exception & e) { fprintf(stderr, "\nERROR: - An exception occurred: '%s'\n", narrow(e.Message).getStr()); return ERROR_RUNTIME_FAILURE; } return OPERATION_SUCCEEDED; } // -------------------------------------------------------------------------- #include #include #include #include namespace lang = com::sun::star::lang; namespace beans = com::sun::star::beans; // -------------------------------------------------------------------------- static uno::Reference< uno::XInterface > createService(uno::Reference< uno::XComponentContext > const & xContext, OUString aService) { uno::Reference< lang::XMultiComponentFactory > xFactory = xContext->getServiceManager(); if (!xFactory.is()) { rtl::OUStringBuffer sMsg; sMsg.appendAscii("Missing object ! "); sMsg.appendAscii("UNO context has no service manager."); throw uno::RuntimeException(sMsg.makeStringAndClear(),NULL); } uno::Reference< uno::XInterface > xInstance = xFactory->createInstanceWithContext(aService,xContext); if (!xInstance.is()) { rtl::OUStringBuffer sMsg; sMsg.appendAscii("Missing service ! "); sMsg.appendAscii("Service manager can't instantiate service "); sMsg.append(aService).appendAscii(". "); throw lang::ServiceNotRegisteredException(sMsg.makeStringAndClear(),NULL); } return xInstance; } // -------------------------------------------------------------------------- static uno::Reference< lang::XMultiServiceFactory > createProvider(uno::Reference< uno::XComponentContext > const & xContext, bool bAdmin) { static const rtl::OUString kProvider( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationProvider")) ; static const rtl::OUString kAdminProvider( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.AdministrationProvider")) ; const rtl::OUString & selectedProvider = bAdmin ? kAdminProvider : kProvider; uno::Reference< lang::XMultiServiceFactory > xRet( createService(xContext,selectedProvider), uno::UNO_QUERY_THROW ); return xRet; } // -------------------------------------------------------------------------- static uno::Reference< uno::XInterface > createView(uno::Reference< lang::XMultiServiceFactory > const & xProvider, OUString const & aNodepath, bool bUpdate) { static const OUString kInfoViewService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationAccess")) ; static const OUString kUpdateViewService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.configuration.ConfigurationUpdateAccess")) ; static const OUString kNodepath(RTL_CONSTASCII_USTRINGPARAM("nodepath")) ; static const OUString kAsync(RTL_CONSTASCII_USTRINGPARAM("EnableAsync")) ; const OUString & kViewService = bUpdate ? kUpdateViewService : kInfoViewService; uno::Sequence< uno::Any > aViewArgs(2); aViewArgs[0] <<= beans::NamedValue( kNodepath, uno::makeAny(aNodepath) ); aViewArgs[1] <<= beans::NamedValue( kAsync, uno::makeAny(sal_False) ); uno::Reference< uno::XInterface > xView( xProvider->createInstanceWithArguments(kViewService,aViewArgs) ); return xView; } // -------------------------------------------------------------------------- //#if OSL_DEBUG_LEVEL > 0 #if 0 // currently not used in debug builds! static uno::Reference< container::XHierarchicalNameAccess > createInfoView(uno::Reference< lang::XMultiServiceFactory > const & xProvider, OUString const & aNodepath) { uno::Reference< container::XHierarchicalNameAccess > xView( createView(xProvider,aNodepath, false), uno::UNO_QUERY_THROW ); return xView; } #endif // -------------------------------------------------------------------------- static uno::Reference< util::XChangesBatch > createUpdateView(uno::Reference< lang::XMultiServiceFactory > const & xProvider, OUString const & aNodepath) { uno::Reference< util::XChangesBatch > xView( createView(xProvider,aNodepath,true), uno::UNO_QUERY_THROW ); return xView; } // -------------------------------------------------------------------------- static void disposeComponent(uno::BaseReference const & xComp) { uno::Reference< lang::XComponent > xComponent(xComp,uno::UNO_QUERY); if (xComponent.is()) xComponent->dispose(); } // --------------------------------------------------------------------------