summaryrefslogtreecommitdiff
path: root/configmgr/source/treecache/cacheline.hxx
blob: 5035dac3e9af1b7d3062483d8ffe3be40d90df7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*************************************************************************
 *
 * 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: cacheline.hxx,v $
 * $Revision: 1.7 $
 *
 * 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_CACHELINE_HXX
#define CONFIGMGR_CACHELINE_HXX

#include "configpath.hxx"
#include "requesttypes.hxx"
#include "utility.hxx"
#include "treefragment.hxx"
#include <osl/interlck.h>
#include <rtl/ref.hxx>
#include <salhelper/simplereferenceobject.hxx>

namespace configmgr
{
    /** This object represents a cache line for a single configuration tree
    */
    class CacheLine: public salhelper::SimpleReferenceObject
    {
    public:
        // create a new CacheLine for the given component name
        static rtl::Reference<CacheLine> 
        createNew( rtl::OUString const & _aModuleName ); 
       
        // create a new CacheLine attached to the given memory location
        static rtl::Reference<CacheLine> 
        createAttached( rtl::OUString const & _aModuleName, sharable::TreeFragment * _aLocation );

        bool hasDefaults() const;

        bool isEmpty() const { return m_base == NULL; }
        sharable::TreeFragment *   getTreeAddress() const { return m_base; }
        sharable::TreeFragment *	getPartialTree(configuration::AbsolutePath const & _aTemplatePath ) const;
        sharable::Node *	getNode(configuration::AbsolutePath const & _aPath) const;

        sharable::TreeFragment *   setComponentData( backend::ComponentDataStruct const & _aComponentInstance, 
                                              bool _bWithDefaults
                                           ) SAL_THROW((com::sun::star::uno::RuntimeException));

        sharable::TreeFragment *   insertDefaults(   backend::NodeInstance const & _aDefaultInstance
                                           ) SAL_THROW((com::sun::star::uno::RuntimeException));

        // get the module name for this component
        rtl::OUString getModuleName() const;

        /// add a client for this module's data
        oslInterlockedCount clientReferences() const { return m_nDataRefs; }
        /// add a client for this modules data
        oslInterlockedCount clientAcquire() { return osl_incrementInterlockedCount(&m_nDataRefs); }			
        /// subtract a client for this modules data
        oslInterlockedCount clientRelease() { return osl_decrementInterlockedCount(&m_nDataRefs); }		

    protected:
        // create a new CacheLine attached to the given memory location
        explicit 
        CacheLine( rtl::OUString const & _aModuleName, sharable::TreeFragment * _pLocation );
       
        // create a new empty CacheLine for the given component name
        explicit 
        CacheLine( rtl::OUString const & _aModuleName );

        sharable::Node * internalGetNode(configuration::AbsolutePath const & _rPath) const;

        sharable::TreeFragment * base() const { return m_base; }
        void setBase(sharable::TreeFragment * _base); 

    private:
        sharable::TreeFragment *   m_base;
        rtl::OUString m_name;

        oslInterlockedCount m_nDataRefs;			/// the number of clients on this modules data
    };

////////////////////////////////////////////////////////////////////////////////
    /** This object represents a cache line and associated data for a single configuration tree
    */
    class ExtendedCacheLine : public CacheLine
    {
    public:
        // create a new CacheLine for the given component name
        static rtl::Reference<ExtendedCacheLine> 
        createNew( rtl::OUString const & _aModuleName ); 
       
        // create a new CacheLine attached to the given memory location
        static rtl::Reference<ExtendedCacheLine> 
        createAttached( rtl::OUString const & _aModuleName,
                            sharable::TreeFragment * _aLocation );
       
    // management of pending changes
        bool hasPending() const {return m_pPending.get() != NULL;}
        
        void addPending(backend::ConstUpdateInstance const & _anUpdate) SAL_THROW((com::sun::star::uno::RuntimeException));
        std::auto_ptr<SubtreeChange> releasePending() {return m_pPending;}
        
    private:
        // create a new empty CacheLine for the given component name
        explicit 
        ExtendedCacheLine( rtl::OUString const & _aModuleName );
        
        // create a new CacheLine attached to the given memory location
        explicit 
        ExtendedCacheLine( rtl::OUString const & _aModuleName, 
                           sharable::TreeFragment * _aLocation );

    private:
        std::auto_ptr<SubtreeChange> m_pPending;
    };
    
} // namespace configmgr

#endif