diff options
Diffstat (limited to 'configmgr/source/treecache/cachedata.hxx')
-rw-r--r-- | configmgr/source/treecache/cachedata.hxx | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/configmgr/source/treecache/cachedata.hxx b/configmgr/source/treecache/cachedata.hxx new file mode 100644 index 000000000000..ae1408179635 --- /dev/null +++ b/configmgr/source/treecache/cachedata.hxx @@ -0,0 +1,179 @@ +/************************************************************************* + * + * 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: cachedata.hxx,v $ + * $Revision: 1.10 $ + * + * 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. + * + ************************************************************************/ + +#ifndef CONFIGMGR_CACHEDATA_HXX +#define CONFIGMGR_CACHEDATA_HXX + +#include "cacheline.hxx" + +#ifndef INCLUDED_MAP +#include <map> +#define INCLUDED_MAP +#endif + +#ifndef INCLUDED_VECTOR +#include <vector> +#define INCLUDED_VECTOR +#endif + +namespace configmgr +{ +//////////////////////////////////////////////////////////////////////////////// + namespace backend + { + struct NodeInstance; + struct TemplateInstance; + struct UpdateInstance; + struct ConstUpdateInstance; + } + +//////////////////////////////////////////////////////////////////////////////// + /** A collection of CacheLines + */ + + class CacheData + { + public: + CacheData(); + virtual ~CacheData(); + + // attach a module with a given name + void attachModule(sharable::TreeFragment * _aLocation, rtl::OUString const & _aModule); + /// check if the given module exists already (and is not empty) + bool hasModule(rtl::OUString const & _aModule) const; + /// checks if the given module exists and has defaults available + bool hasModuleDefaults(rtl::OUString const & _aModule) const; + + /// gets a tree address for the given module if it exists + sharable::TreeFragment * getTreeAddress(rtl::OUString const & _aModule) const; + + /// checks whether a certain node exists in the tree + bool hasNode(configuration::AbsolutePath const & _aLocation) const; + + /// retrieve the given node without changing its ref count + sharable::Node * getNode(configuration::AbsolutePath const & _rPath); + /// retrieve the given template tree without changing its ref count + sharable::TreeFragment * getTemplateTree( configuration::AbsolutePath const & aTemplateName ) const; + + /// retrieve the subtree at _aPath and clientAcquire() it + sharable::Node * acquireNode(configuration::AbsolutePath const & _aPath ); + /// retrieve the subtree at _aPath and clientAcquire() it, return true on success + bool acquireModule( rtl::OUString const & _aModule ); + /// clientRelease() the tree at aComponentName, and return the resulting reference count + oslInterlockedCount releaseModule( rtl::OUString const & _aModule, bool _bKeepDeadModule = false ); + + bool insertDefaults( backend::NodeInstance const & _aDefaultInstance + ) SAL_THROW((com::sun::star::uno::RuntimeException)); + + /// merge the given changes into this tree - reflects old values to _anUpdate + void applyUpdate( backend::UpdateInstance & _anUpdate) SAL_THROW((com::sun::star::uno::RuntimeException)); + + // low-level interface for cache management + typedef std::map<rtl::OUString, rtl::Reference<CacheLine> > ModuleList; + ModuleList& accessModuleList() { return m_aModules; } + + protected: + virtual rtl::Reference<CacheLine> doCreateAttachedModule(sharable::TreeFragment * _aLocation, rtl::OUString const & _aName) SAL_THROW((com::sun::star::uno::RuntimeException)); + + sharable::TreeFragment * internalGetPartialTree(configuration::AbsolutePath const & _aPath ) const; + sharable::Node * internalGetNode(const configuration::AbsolutePath& _rPath) const; + + rtl::Reference<CacheLine> internalAttachModule(sharable::TreeFragment * _aLocation, rtl::OUString const & _aName) SAL_THROW((com::sun::star::uno::RuntimeException)); + void internalAddModule(rtl::OUString const & _aName, rtl::Reference<CacheLine> const & _aModule); + + rtl::Reference<CacheLine> internalGetModule(rtl::OUString const & _aName) const; + rtl::Reference<CacheLine> internalGetModule(const configuration::AbsolutePath& _aLocation) const; + + private: + ModuleList m_aModules; + }; +//////////////////////////////////////////////////////////////////////////////// + /** A collection of CacheLines for templates + */ + + class TemplateCacheData : public CacheData + { + public: + TemplateCacheData() : CacheData() + { + } + + /** add the given template tree at the given location, + return the tree that is now pertinent and clientAcquire() it once + */ + sharable::TreeFragment * addTemplates( backend::ComponentDataStruct const & _aComponentInstance + ) SAL_THROW((com::sun::star::uno::RuntimeException)); + + // create a new module with the given name + void createModule(rtl::OUString const & _aModule) SAL_THROW((com::sun::star::uno::RuntimeException)); + private: + virtual rtl::Reference<CacheLine> doCreateAttachedModule(sharable::TreeFragment * _aLocation, rtl::OUString const & _aName) SAL_THROW((com::sun::star::uno::RuntimeException)); + }; +//----------------------------------------------------------------------------- + /** A collection of CacheLines + */ + + class ExtendedCacheData : public CacheData + { + public: + ExtendedCacheData() : CacheData() + { + } + + /** add the given subtree at the given location, + return the tree that is now pertinent and clientAcquire() it once + */ + sharable::TreeFragment * addComponentData( backend::ComponentInstance const & _aComponentInstance, + bool _bWithDefaults + ) SAL_THROW((com::sun::star::uno::RuntimeException)); + + /// find the modules having pending changes + bool hasPending(rtl::OUString const & _aModule); + /// find the modules having pending changes + void findPendingModules( std::vector< rtl::OUString > & _rPendingList ); + + /// add or merge the given subtreechange at the given location + void addPending(backend::ConstUpdateInstance const & _anUpdate) SAL_THROW((com::sun::star::uno::RuntimeException)); + /// remove and return pending changes for the given component + std::auto_ptr<SubtreeChange> releasePending(rtl::OUString const & _aModule) SAL_THROW((com::sun::star::uno::RuntimeException)); + + // create a new module with the given name + void createModule(rtl::OUString const & _aModule) SAL_THROW((com::sun::star::uno::RuntimeException)); + private: + virtual rtl::Reference<CacheLine> doCreateAttachedModule(sharable::TreeFragment * _aLocation, rtl::OUString const & _aName) SAL_THROW((com::sun::star::uno::RuntimeException)); + + rtl::Reference<ExtendedCacheLine> implExtended(rtl::Reference<CacheLine> const & _aSimpleRef) const; + }; +//----------------------------------------------------------------------------- + +} // namespace configmgr + +#endif + |