summaryrefslogtreecommitdiff
path: root/framework/source/accelerators/presethandler.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'framework/source/accelerators/presethandler.cxx')
-rw-r--r--framework/source/accelerators/presethandler.cxx924
1 files changed, 0 insertions, 924 deletions
diff --git a/framework/source/accelerators/presethandler.cxx b/framework/source/accelerators/presethandler.cxx
deleted file mode 100644
index 408833e5e1..0000000000
--- a/framework/source/accelerators/presethandler.cxx
+++ /dev/null
@@ -1,924 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * 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
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_framework.hxx"
-#include <accelerators/presethandler.hxx>
-
-//_______________________________________________
-// own includes
-#include <classes/fwkresid.hxx>
-
-#include "classes/resource.hrc"
-#include <threadhelp/readguard.hxx>
-#include <threadhelp/writeguard.hxx>
-#include <services.h>
-
-//_______________________________________________
-// interface includes
-
-#include <com/sun/star/configuration/CorruptedUIConfigurationException.hpp>
-
-#include <com/sun/star/container/NoSuchElementException.hpp>
-
-#include <com/sun/star/container/XNameAccess.hpp>
-
-#include <com/sun/star/beans/XPropertySet.hpp>
-
-#include <com/sun/star/embed/ElementModes.hpp>
-
-#include <com/sun/star/embed/XTransactedObject.hpp>
-
-#include <com/sun/star/lang/XSingleServiceFactory.hpp>
-
-//_______________________________________________
-// other includes
-#include <vcl/svapp.hxx>
-
-#include <rtl/ustrbuf.hxx>
-
-//_______________________________________________
-// const
-
-#define SUBSTORAGE_GLOBAL DECLARE_ASCII("global" )
-#define SUBSTORAGE_MODULES DECLARE_ASCII("modules")
-
-#define BASEPATH_SHARE_LAYER DECLARE_ASCII("UIConfig" )
-#define BASEPATH_USER_LAYER DECLARE_ASCII("UserConfig")
-
-#define RELPATH_SHARE_LAYER DECLARE_ASCII("soffice.cfg")
-#define RELPATH_USER_LAYER DECLARE_ASCII("soffice.cfg")
-// #define RELPATH_SHARE_LAYER DECLARE_ASCII("soffice.cfg/uiconfig.zip")
-// #define RELPATH_USER_LAYER DECLARE_ASCII("soffice.cfg/uiconfig.zip")
-
-#define FILE_EXTENSION DECLARE_ASCII(".xml")
-
-#define PATH_SEPERATOR DECLARE_ASCII("/")
-
-static const ::sal_Int32 ID_CORRUPT_UICONFIG_SHARE = 1;
-static const ::sal_Int32 ID_CORRUPT_UICONFIG_USER = 2;
-static const ::sal_Int32 ID_CORRUPT_UICONFIG_GENERAL = 3;
-
-//_______________________________________________
-// namespace
-
-namespace framework
-{
-
-//-----------------------------------------------
-::rtl::OUString PresetHandler::PRESET_DEFAULT()
-{
- static ::rtl::OUString RSTYPE = DECLARE_ASCII("default");
- return RSTYPE;
-}
-
-//-----------------------------------------------
-::rtl::OUString PresetHandler::TARGET_CURRENT()
-{
- static ::rtl::OUString RSTYPE = DECLARE_ASCII("current");
- return RSTYPE;
-}
-
-//-----------------------------------------------
-::rtl::OUString PresetHandler::RESOURCETYPE_MENUBAR()
-{
- static ::rtl::OUString RSTYPE = DECLARE_ASCII("menubar");
- return RSTYPE;
-}
-
-//-----------------------------------------------
-::rtl::OUString PresetHandler::RESOURCETYPE_TOOLBAR()
-{
- static ::rtl::OUString RSTYPE = DECLARE_ASCII("toolbar");
- return RSTYPE;
-}
-
-//-----------------------------------------------
-::rtl::OUString PresetHandler::RESOURCETYPE_ACCELERATOR()
-{
- static ::rtl::OUString RSTYPE = DECLARE_ASCII("accelerator");
- return RSTYPE;
-}
-
-//-----------------------------------------------
-::rtl::OUString PresetHandler::RESOURCETYPE_STATUSBAR()
-{
- static ::rtl::OUString RSTYPE = DECLARE_ASCII("statusbar");
- return RSTYPE;
-}
-
-//-----------------------------------------------
-PresetHandler::PresetHandler(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR)
- : ThreadHelpBase (&Application::GetSolarMutex() )
- , m_xSMGR (xSMGR )
- , m_aSharedStorages ( )
- , m_lDocumentStorages(xSMGR )
- , m_aLocale (::comphelper::Locale::X_NOTRANSLATE())
-{
-}
-
-//-----------------------------------------------
-PresetHandler::PresetHandler(const PresetHandler& rCopy)
- : ThreadHelpBase (&Application::GetSolarMutex() )
-{
- m_xSMGR = rCopy.m_xSMGR;
- m_eConfigType = rCopy.m_eConfigType;
- m_sResourceType = rCopy.m_sResourceType;
- m_sModule = rCopy.m_sModule;
- m_aSharedStorages = rCopy.m_aSharedStorages;
- m_xWorkingStorageShare = rCopy.m_xWorkingStorageShare;
- m_xWorkingStorageNoLang = rCopy.m_xWorkingStorageNoLang;
- m_xWorkingStorageUser = rCopy.m_xWorkingStorageUser;
- m_lPresets = rCopy.m_lPresets;
- m_lTargets = rCopy.m_lTargets;
- m_aLocale = rCopy.m_aLocale;
- m_lDocumentStorages = rCopy.m_lDocumentStorages;
- m_sRelPathShare = rCopy.m_sRelPathShare;
- m_sRelPathNoLang = rCopy.m_sRelPathNoLang;
- m_sRelPathUser = rCopy.m_sRelPathUser;
-}
-
-//-----------------------------------------------
-PresetHandler::~PresetHandler()
-{
- m_xWorkingStorageShare.clear();
- m_xWorkingStorageNoLang.clear();
- m_xWorkingStorageUser.clear();
-
- /* #i46497#
- Dont call forgetCachedStorages() here for shared storages.
- Because we opened different sub storages by using openPath().
- And every already open path was reused and referenced (means it's
- ref count was increased!)
- So now we have to release our ref counts to these shared storages
- only ... and not to free all used storages.
- Otherwise we will disconnect all other open configuration access
- objects which base on these storages.
- */
- m_aSharedStorages->m_lStoragesShare.closePath(m_sRelPathShare);
- m_aSharedStorages->m_lStoragesUser.closePath (m_sRelPathUser );
-
- /* On the other side closePath() is not needed for our special handled
- document storage. Because it's not shared with others ... so we can
- free it.
- */
- m_lDocumentStorages.forgetCachedStorages();
-}
-
-//-----------------------------------------------
-void PresetHandler::forgetCachedStorages()
-{
- // SAFE -> ----------------------------------
- WriteGuard aWriteLock(m_aLock);
-
- if (m_eConfigType == E_DOCUMENT)
- {
- m_xWorkingStorageShare.clear();
- m_xWorkingStorageNoLang.clear();
- m_xWorkingStorageUser.clear();
- }
-
- m_lDocumentStorages.forgetCachedStorages();
-
- aWriteLock.unlock();
- // <- SAFE ----------------------------------
-}
-
-//-----------------------------------------------
-::rtl::OUString lcl_getLocalizedMessage(::sal_Int32 nID)
-{
- ::rtl::OUString sMessage(RTL_CONSTASCII_USTRINGPARAM("Unknown error."));
-
- switch(nID)
- {
- case ID_CORRUPT_UICONFIG_SHARE :
- sMessage = ::rtl::OUString( String( FwkResId( STR_CORRUPT_UICFG_SHARE )));
- break;
-
- case ID_CORRUPT_UICONFIG_USER :
- sMessage = ::rtl::OUString( String( FwkResId( STR_CORRUPT_UICFG_USER )));
- break;
-
- case ID_CORRUPT_UICONFIG_GENERAL :
- sMessage = ::rtl::OUString( String( FwkResId( STR_CORRUPT_UICFG_GENERAL )));
- break;
- }
-
- return sMessage;
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::getOrCreateRootStorageShare()
-{
- css::uno::Reference< css::embed::XStorage > xRoot = m_aSharedStorages->m_lStoragesShare.getRootStorage();
- if (xRoot.is())
- return xRoot;
-
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- css::uno::Reference< css::beans::XPropertySet > xPathSettings(
- xSMGR->createInstance(SERVICENAME_PATHSETTINGS),
- css::uno::UNO_QUERY_THROW);
-
- ::rtl::OUString sShareLayer;
- xPathSettings->getPropertyValue(BASEPATH_SHARE_LAYER) >>= sShareLayer;
-
- // "UIConfig" is a "multi path" ... use first part only here!
- sal_Int32 nPos = sShareLayer.indexOf(';');
- if (nPos > 0)
- sShareLayer = sShareLayer.copy(0, nPos);
-
- // Note: May be an user uses URLs without a final slash! Check it ...
- nPos = sShareLayer.lastIndexOf('/');
- if (nPos != sShareLayer.getLength()-1)
- sShareLayer += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
-
- sShareLayer += RELPATH_SHARE_LAYER; // folder
- /*
- // TODO remove me!
- // Attention: This is temp. workaround ... We create a temp. storage file
- // based of a sytem directory. This must be used so, till the storage implementation
- // can work on directories too.
- */
- css::uno::Sequence< css::uno::Any > lArgs(2);
- lArgs[0] <<= sShareLayer;
- lArgs[1] <<= css::embed::ElementModes::READ | css::embed::ElementModes::NOCREATE;
-
- css::uno::Reference< css::lang::XSingleServiceFactory > xStorageFactory(xSMGR->createInstance(SERVICENAME_FILESYSTEMSTORAGEFACTORY) , css::uno::UNO_QUERY_THROW);
- css::uno::Reference< css::embed::XStorage > xStorage;
-
- try
- {
- xStorage = css::uno::Reference< css::embed::XStorage >(xStorageFactory->createInstanceWithArguments(lArgs), css::uno::UNO_QUERY_THROW);
- }
- catch(const css::uno::Exception& ex)
- {
- throw css::configuration::CorruptedUIConfigurationException(
- lcl_getLocalizedMessage(ID_CORRUPT_UICONFIG_SHARE),
- css::uno::Reference< css::uno::XInterface >(),
- ex.Message);
- }
-
- m_aSharedStorages->m_lStoragesShare.setRootStorage(xStorage);
-
- return xStorage;
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::getOrCreateRootStorageUser()
-{
- css::uno::Reference< css::embed::XStorage > xRoot = m_aSharedStorages->m_lStoragesUser.getRootStorage();
- if (xRoot.is())
- return xRoot;
-
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- css::uno::Reference< css::beans::XPropertySet > xPathSettings(
- xSMGR->createInstance(SERVICENAME_PATHSETTINGS),
- css::uno::UNO_QUERY_THROW);
-
- ::rtl::OUString sUserLayer;
- xPathSettings->getPropertyValue(BASEPATH_USER_LAYER) >>= sUserLayer ;
-
- // Note: May be an user uses URLs without a final slash! Check it ...
- sal_Int32 nPos = sUserLayer.lastIndexOf('/');
- if (nPos != sUserLayer.getLength()-1)
- sUserLayer += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
-
- sUserLayer += RELPATH_USER_LAYER; // storage file
-
- css::uno::Sequence< css::uno::Any > lArgs(2);
- lArgs[0] <<= sUserLayer;
- lArgs[1] <<= css::embed::ElementModes::READWRITE;
-
- css::uno::Reference< css::lang::XSingleServiceFactory > xStorageFactory(xSMGR->createInstance(SERVICENAME_FILESYSTEMSTORAGEFACTORY) , css::uno::UNO_QUERY_THROW);
- css::uno::Reference< css::embed::XStorage > xStorage;
-
- try
- {
- xStorage = css::uno::Reference< css::embed::XStorage >(xStorageFactory->createInstanceWithArguments(lArgs), css::uno::UNO_QUERY_THROW);
- }
- catch(const css::uno::Exception& ex)
- {
- throw css::configuration::CorruptedUIConfigurationException(
- lcl_getLocalizedMessage(ID_CORRUPT_UICONFIG_USER),
- css::uno::Reference< css::uno::XInterface >(),
- ex.Message);
- }
-
- m_aSharedStorages->m_lStoragesUser.setRootStorage(xStorage);
-
- return xStorage;
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::getWorkingStorageShare()
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- return m_xWorkingStorageShare;
- // <- SAFE ----------------------------------
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::getWorkingStorageUser()
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- return m_xWorkingStorageUser;
- // <- SAFE ----------------------------------
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::getParentStorageShare(const css::uno::Reference< css::embed::XStorage >& /*xChild*/)
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::embed::XStorage > xWorking = m_xWorkingStorageShare;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- return m_aSharedStorages->m_lStoragesShare.getParentStorage(xWorking);
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::getParentStorageUser(const css::uno::Reference< css::embed::XStorage >& /*xChild*/)
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::embed::XStorage > xWorking = m_xWorkingStorageUser;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- return m_aSharedStorages->m_lStoragesUser.getParentStorage(xWorking);
-}
-
-//-----------------------------------------------
-void PresetHandler::connectToResource( PresetHandler::EConfigType eConfigType ,
- const ::rtl::OUString& sResource ,
- const ::rtl::OUString& sModule ,
- const css::uno::Reference< css::embed::XStorage >& xDocumentRoot,
- const ::comphelper::Locale& aLocale )
-{
- // TODO free all current open storages!
-
- // SAFE -> ----------------------------------
- WriteGuard aWriteLock(m_aLock);
-
- m_eConfigType = eConfigType ;
- m_sResourceType = sResource ;
- m_sModule = sModule ;
- m_aLocale = aLocale ;
-
- aWriteLock.unlock();
- // <- SAFE ----------------------------------
-
- css::uno::Reference< css::embed::XStorage > xShare;
- css::uno::Reference< css::embed::XStorage > xNoLang;
- css::uno::Reference< css::embed::XStorage > xUser;
-
- // special case for documents
- // use outside root storage, if we run in E_DOCUMENT mode!
- if (eConfigType == E_DOCUMENT)
- {
- if (!xDocumentRoot.is())
- throw css::uno::RuntimeException(
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("There is valid root storage, where the UI configuration can work on.")),
- css::uno::Reference< css::uno::XInterface >());
- m_lDocumentStorages.setRootStorage(xDocumentRoot);
- xShare = xDocumentRoot;
- xUser = xDocumentRoot;
- }
- else
- {
- xShare = getOrCreateRootStorageShare();
- xUser = getOrCreateRootStorageUser();
- }
-
- // #...#
- try
- {
-
- // a) inside share layer we should not create any new structures ... We jave to use
- // existing ones only!
- // b) inside user layer we can (SOFT mode!) but sometimes we shouldnt (HARD mode!)
- // create new empty structures. We should preferr using of any existing structure.
- sal_Int32 eShareMode = (css::embed::ElementModes::READ | css::embed::ElementModes::NOCREATE);
- sal_Int32 eUserMode = (css::embed::ElementModes::READWRITE );
-
- ::rtl::OUStringBuffer sRelPathBuf(1024);
- ::rtl::OUString sRelPathShare;
- ::rtl::OUString sRelPathNoLang;
- ::rtl::OUString sRelPathUser;
- switch(eConfigType)
- {
- case E_GLOBAL :
- {
- sRelPathBuf.append(SUBSTORAGE_GLOBAL);
- sRelPathBuf.append(PATH_SEPERATOR );
- sRelPathBuf.append(sResource );
- sRelPathShare = sRelPathBuf.makeStringAndClear();
- sRelPathUser = sRelPathShare;
-
- xShare = impl_openPathIgnoringErrors(sRelPathShare, eShareMode, sal_True );
- xUser = impl_openPathIgnoringErrors(sRelPathUser , eUserMode , sal_False);
- }
- break;
-
- case E_MODULES :
- {
- sRelPathBuf.append(SUBSTORAGE_MODULES);
- sRelPathBuf.append(PATH_SEPERATOR );
- sRelPathBuf.append(sModule );
- sRelPathBuf.append(PATH_SEPERATOR );
- sRelPathBuf.append(sResource );
- sRelPathShare = sRelPathBuf.makeStringAndClear();
- sRelPathUser = sRelPathShare;
-
- xShare = impl_openPathIgnoringErrors(sRelPathShare, eShareMode, sal_True );
- xUser = impl_openPathIgnoringErrors(sRelPathUser , eUserMode , sal_False);
- }
- break;
-
- case E_DOCUMENT :
- {
- // A document does not have a share layer in real.
- // It has one layer only, and this one should be opened READ_WRITE.
- // So we open the user layer here only and set the share layer equals to it .-)
-
- sRelPathBuf.append(sResource);
- sRelPathUser = sRelPathBuf.makeStringAndClear();
- sRelPathShare = sRelPathUser;
-
- try
- {
- xUser = m_lDocumentStorages.openPath(sRelPathUser , eUserMode );
- xShare = xUser;
- }
- catch(const css::uno::RuntimeException& exRun)
- { throw exRun; }
- catch(const css::uno::Exception&)
- { xShare.clear(); xUser.clear(); }
- }
- break;
- }
-
- // Non-localized global share
- xNoLang = xShare;
- sRelPathNoLang = sRelPathShare;
-
- if (
- (aLocale != ::comphelper::Locale::X_NOTRANSLATE()) && // localized level?
- (eConfigType != E_DOCUMENT ) // no localization in document mode!
- )
- {
- // First try to find the right localized set inside share layer.
- // Fallbacks are allowed there.
- ::comphelper::Locale aShareLocale = aLocale ;
- ::rtl::OUString sLocalizedSharePath(sRelPathShare);
- sal_Bool bAllowFallbacks = sal_True ;
- xShare = impl_openLocalizedPathIgnoringErrors(sLocalizedSharePath, eShareMode, sal_True , aShareLocale, bAllowFallbacks);
-
- // The try to locate the right sub dir inside user layer ... without using fallbacks!
- // Normaly the corresponding sub dir should be created matching the specified locale.
- // Because we allow creation of storages inside user layer by default.
- ::comphelper::Locale aUserLocale = aLocale ;
- ::rtl::OUString sLocalizedUserPath(sRelPathUser);
- bAllowFallbacks = sal_False ;
- xUser = impl_openLocalizedPathIgnoringErrors(sLocalizedUserPath, eUserMode , sal_False, aUserLocale, bAllowFallbacks);
-
- sRelPathShare = sLocalizedSharePath;
- sRelPathUser = sLocalizedUserPath ;
- }
-
- // read content of level 3 (presets, targets)
- css::uno::Reference< css::container::XNameAccess > xAccess ;
- css::uno::Sequence< ::rtl::OUString > lNames ;
- const ::rtl::OUString* pNames ;
- sal_Int32 c ;
- sal_Int32 i ;
- OUStringList lPresets;
- OUStringList lTargets;
-
- // read preset names of share layer
- xAccess = css::uno::Reference< css::container::XNameAccess >(xShare, css::uno::UNO_QUERY);
- if (xAccess.is())
- {
- lNames = xAccess->getElementNames();
- pNames = lNames.getConstArray();
- c = lNames.getLength();
-
- for (i=0; i<c; ++i)
- {
- ::rtl::OUString sTemp = pNames[i];
- sal_Int32 nPos = sTemp.indexOf(FILE_EXTENSION);
- if (nPos > -1)
- sTemp = sTemp.copy(0,nPos);
- lPresets.push_back(sTemp);
- }
- }
-
- // read preset names of user layer
- xAccess = css::uno::Reference< css::container::XNameAccess >(xUser, css::uno::UNO_QUERY);
- if (xAccess.is())
- {
- lNames = xAccess->getElementNames();
- pNames = lNames.getConstArray();
- c = lNames.getLength();
-
- for (i=0; i<c; ++i)
- {
- ::rtl::OUString sTemp = pNames[i];
- sal_Int32 nPos = sTemp.indexOf(FILE_EXTENSION);
- if (nPos > -1)
- sTemp = sTemp.copy(0,nPos);
- lTargets.push_back(sTemp);
- }
- }
-
- // SAFE -> ----------------------------------
- aWriteLock.lock();
-
- m_xWorkingStorageShare = xShare ;
- m_xWorkingStorageNoLang= xNoLang;
- m_xWorkingStorageUser = xUser ;
- m_lPresets = lPresets;
- m_lTargets = lTargets;
- m_sRelPathShare = sRelPathShare;
- m_sRelPathNoLang = sRelPathNoLang;
- m_sRelPathUser = sRelPathUser;
-
- aWriteLock.unlock();
- // <- SAFE ----------------------------------
-
- }
- catch(const css::uno::Exception& ex)
- {
- throw css::configuration::CorruptedUIConfigurationException(
- lcl_getLocalizedMessage(ID_CORRUPT_UICONFIG_GENERAL),
- css::uno::Reference< css::uno::XInterface >(),
- ex.Message);
- }
-}
-
-//-----------------------------------------------
-void PresetHandler::copyPresetToTarget(const ::rtl::OUString& sPreset,
- const ::rtl::OUString& sTarget)
-{
- // dont check our preset list, if element exists
- // We try to open it and forward all errors to the user!
-
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::embed::XStorage > xWorkingShare = m_xWorkingStorageShare;
- css::uno::Reference< css::embed::XStorage > xWorkingNoLang= m_xWorkingStorageNoLang;
- css::uno::Reference< css::embed::XStorage > xWorkingUser = m_xWorkingStorageUser ;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- // e.g. module without any config data ?!
- if (
- (!xWorkingShare.is()) ||
- (!xWorkingUser.is() )
- )
- {
- return;
- }
-
- ::rtl::OUString sPresetFile(sPreset);
- sPresetFile += FILE_EXTENSION;
-
- ::rtl::OUString sTargetFile(sTarget);
- sTargetFile += FILE_EXTENSION;
-
- // remove existing elements before you try to copy the preset to that location ...
- // Otherwise w will get an ElementExistException inside copyElementTo()!
- css::uno::Reference< css::container::XNameAccess > xCheckingUser(xWorkingUser, css::uno::UNO_QUERY_THROW);
- if (xCheckingUser->hasByName(sTargetFile))
- xWorkingUser->removeElement(sTargetFile);
-
- xWorkingShare->copyElementTo(sPresetFile, xWorkingUser, sTargetFile);
-
- // If our storages work in transacted mode, we have
- // to commit all changes from bottom to top!
- commitUserChanges();
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::io::XStream > PresetHandler::openPreset(const ::rtl::OUString& sPreset,
- sal_Bool bUseNoLangGlobal)
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::embed::XStorage > xFolder = bUseNoLangGlobal? m_xWorkingStorageNoLang: m_xWorkingStorageShare;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- // e.g. module without any config data ?!
- if (!xFolder.is())
- return css::uno::Reference< css::io::XStream >();
-
- ::rtl::OUString sFile(sPreset);
- sFile += FILE_EXTENSION;
-
- // inform user about errors (use original exceptions!)
- css::uno::Reference< css::io::XStream > xStream = xFolder->openStreamElement(sFile, css::embed::ElementModes::READ);
- return xStream;
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::io::XStream > PresetHandler::openTarget(const ::rtl::OUString& sTarget ,
- sal_Bool bCreateIfMissing)
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::embed::XStorage > xFolder = m_xWorkingStorageUser;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- // e.g. module without any config data ?!
- if (!xFolder.is())
- return css::uno::Reference< css::io::XStream >();
-
- ::rtl::OUString sFile(sTarget);
- sFile += FILE_EXTENSION;
-
- sal_Int32 nOpenMode = css::embed::ElementModes::READWRITE;
- if (!bCreateIfMissing)
- nOpenMode |= css::embed::ElementModes::NOCREATE;
-
- // try it in read/write mode first and ignore errors.
- css::uno::Reference< css::io::XStream > xStream;
- try
- {
- xStream = xFolder->openStreamElement(sFile, nOpenMode);
- return xStream;
- }
- catch(const css::uno::RuntimeException&)
- { throw; }
- catch(const css::uno::Exception&)
- { xStream.clear(); }
-
- // try it readonly if it failed before.
- // inform user about errors (use original exceptions!)
- nOpenMode &= ~css::embed::ElementModes::WRITE;
- xStream = xFolder->openStreamElement(sFile, nOpenMode);
-
- return xStream;
-}
-
-//-----------------------------------------------
-void PresetHandler::commitUserChanges()
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- css::uno::Reference< css::embed::XStorage > xWorking = m_xWorkingStorageUser;
- EConfigType eCfgType = m_eConfigType;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- // e.g. module without any config data ?!
- if (!xWorking.is())
- return;
-
- ::rtl::OUString sPath;
-
- switch(eCfgType)
- {
- case E_GLOBAL :
- case E_MODULES :
- {
- sPath = m_aSharedStorages->m_lStoragesUser.getPathOfStorage(xWorking);
- m_aSharedStorages->m_lStoragesUser.commitPath(sPath);
- m_aSharedStorages->m_lStoragesUser.notifyPath(sPath);
- }
- break;
-
- case E_DOCUMENT :
- {
- sPath = m_lDocumentStorages.getPathOfStorage(xWorking);
- m_lDocumentStorages.commitPath(sPath);
- m_lDocumentStorages.notifyPath(sPath);
- }
- break;
- }
-}
-
-//-----------------------------------------------
-void PresetHandler::addStorageListener(IStorageListener* pListener)
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- ::rtl::OUString sRelPath = m_sRelPathUser; // use user path ... because we dont work directly on the share layer!
- EConfigType eCfgType = m_eConfigType;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- if (!sRelPath.getLength())
- return;
-
- switch(eCfgType)
- {
- case E_GLOBAL :
- case E_MODULES :
- {
- m_aSharedStorages->m_lStoragesUser.addStorageListener(pListener, sRelPath);
- }
- break;
-
- case E_DOCUMENT :
- {
- m_lDocumentStorages.addStorageListener(pListener, sRelPath);
- }
- break;
- }
-}
-
-//-----------------------------------------------
-void PresetHandler::removeStorageListener(IStorageListener* pListener)
-{
- // SAFE -> ----------------------------------
- ReadGuard aReadLock(m_aLock);
- ::rtl::OUString sRelPath = m_sRelPathUser; // use user path ... because we dont work directly on the share layer!
- EConfigType eCfgType = m_eConfigType;
- aReadLock.unlock();
- // <- SAFE ----------------------------------
-
- if (!sRelPath.getLength())
- return;
-
- switch(eCfgType)
- {
- case E_GLOBAL :
- case E_MODULES :
- {
- m_aSharedStorages->m_lStoragesUser.removeStorageListener(pListener, sRelPath);
- }
- break;
-
- case E_DOCUMENT :
- {
- m_lDocumentStorages.removeStorageListener(pListener, sRelPath);
- }
- break;
- }
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::impl_openPathIgnoringErrors(const ::rtl::OUString& sPath ,
- sal_Int32 eMode ,
- sal_Bool bShare)
-{
- css::uno::Reference< css::embed::XStorage > xPath;
- try
- {
- if (bShare)
- xPath = m_aSharedStorages->m_lStoragesShare.openPath(sPath, eMode);
- else
- xPath = m_aSharedStorages->m_lStoragesUser.openPath(sPath, eMode);
- }
- catch(const css::uno::RuntimeException& exRun)
- { throw exRun; }
- catch(const css::uno::Exception&)
- { xPath.clear(); }
- return xPath;
-}
-
-//-----------------------------------------------
-::std::vector< ::rtl::OUString >::const_iterator PresetHandler::impl_findMatchingLocalizedValue(const ::std::vector< ::rtl::OUString >& lLocalizedValues,
- ::comphelper::Locale& aLocale ,
- sal_Bool bAllowFallbacks )
-{
- ::std::vector< ::rtl::OUString >::const_iterator pFound = lLocalizedValues.end();
- if (bAllowFallbacks)
- {
- pFound = ::comphelper::Locale::getFallback(lLocalizedValues, aLocale.toISO());
- }
- else
- {
- for ( pFound = lLocalizedValues.begin();
- pFound != lLocalizedValues.end() ;
- ++pFound )
- {
- const ::rtl::OUString& sCheckISO = *pFound;
- ::comphelper::Locale aCheckLocale(sCheckISO);
- if (aCheckLocale.equals(aLocale))
- break;
- }
- }
-
- // if we found a valid locale ... take it over to our in/out parameter aLocale
- if (pFound != lLocalizedValues.end())
- {
- const ::rtl::OUString& sISOLocale = *pFound;
- aLocale.fromISO(sISOLocale);
- }
-
- return pFound;
-}
-
-//-----------------------------------------------
-css::uno::Reference< css::embed::XStorage > PresetHandler::impl_openLocalizedPathIgnoringErrors(::rtl::OUString& sPath ,
- sal_Int32 eMode ,
- sal_Bool bShare ,
- ::comphelper::Locale& aLocale ,
- sal_Bool bAllowFallback)
-{
- css::uno::Reference< css::embed::XStorage > xPath = impl_openPathIgnoringErrors(sPath, eMode, bShare);
- ::std::vector< ::rtl::OUString > lSubFolders = impl_getSubFolderNames(xPath);
- ::std::vector< ::rtl::OUString >::const_iterator pLocaleFolder = impl_findMatchingLocalizedValue(lSubFolders, aLocale, bAllowFallback);
-
- // no fallback ... creation not allowed => no storage
- if (
- (pLocaleFolder == lSubFolders.end() ) &&
- ((eMode & css::embed::ElementModes::NOCREATE) == css::embed::ElementModes::NOCREATE)
- )
- return css::uno::Reference< css::embed::XStorage >();
-
- // it doesnt matter, if there is a locale fallback or not
- // If creation of storages is allowed, we do it anyway.
- // Otherwhise we have no acc config at all, which can make other trouble.
- ::rtl::OUString sLocalizedPath;
- sLocalizedPath = sPath;
- sLocalizedPath += PATH_SEPERATOR;
- if (pLocaleFolder != lSubFolders.end())
- sLocalizedPath += *pLocaleFolder;
- else
- sLocalizedPath += aLocale.toISO();
-
- css::uno::Reference< css::embed::XStorage > xLocalePath = impl_openPathIgnoringErrors(sLocalizedPath, eMode, bShare);
-
- if (xLocalePath.is())
- sPath = sLocalizedPath;
- else
- sPath = ::rtl::OUString();
-
- return xLocalePath;
-}
-
-//-----------------------------------------------
-::std::vector< ::rtl::OUString > PresetHandler::impl_getSubFolderNames(const css::uno::Reference< css::embed::XStorage >& xFolder)
-{
- css::uno::Reference< css::container::XNameAccess > xAccess(xFolder, css::uno::UNO_QUERY);
- if (!xAccess.is())
- return ::std::vector< ::rtl::OUString >();
-
- ::std::vector< ::rtl::OUString > lSubFolders;
- const css::uno::Sequence< ::rtl::OUString > lNames = xAccess->getElementNames();
- const ::rtl::OUString* pNames = lNames.getConstArray();
- sal_Int32 c = lNames.getLength();
- sal_Int32 i = 0;
-
- for (i=0; i<c; ++i)
- {
- try
- {
- if (xFolder->isStorageElement(pNames[i]))
- lSubFolders.push_back(pNames[i]);
- }
- catch(const css::uno::RuntimeException& exRun)
- { throw exRun; }
- catch(const css::uno::Exception&)
- {}
- }
-
- return lSubFolders;
-}
-
-//-----------------------------------------------
-} // namespace framework
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */