summaryrefslogtreecommitdiff
path: root/configmgr/source/inc/treemanager.hxx
blob: 2b59b1de31a7cded8e8a54681c0d7f06635f02a8 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/*************************************************************************
 *
 *  OpenOffice.org - a multi-platform office productivity suite
 *
 *  $RCSfile: treemanager.hxx,v $
 *
 *  $Revision: 1.5 $
 *
 *  last change: $Author: rt $ $Date: 2005-09-08 03:59:42 $
 *
 *  The Contents of this file are made available subject to
 *  the terms of GNU Lesser General Public License Version 2.1.
 *
 *
 *    GNU Lesser General Public License Version 2.1
 *    =============================================
 *    Copyright 2005 by Sun Microsystems, Inc.
 *    901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License version 2.1, as published by the Free Software Foundation.
 *
 *    This library 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 for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *    MA  02111-1307  USA
 *
 ************************************************************************/

#ifndef CONFIGMGR_TREEMANAGER_HXX_
#define CONFIGMGR_TREEMANAGER_HXX_

#ifndef CONFIGMGR_TREEPROVIDER_HXX
#include "treeprovider.hxx"
#endif
#ifndef CONFIGMGR_DEFAULTPROVIDER_HXX
#include "defaultprovider.hxx"
#endif
#ifndef CONFIGMGR_BACKEND_CACHEDDATAPROVIDER_HXX
#include "cacheddataprovider.hxx"
#endif

#ifndef CONFIGMGR_API_EVENTS_HXX_
#include "confevents.hxx"
#endif
#ifndef CONFIGMGR_MISC_OPTIONS_HXX_
#include "options.hxx"
#endif

#ifndef CONFIGMGR_AUTOREFERENCEMAP_HXX
#include "autoreferencemap.hxx"
#endif
#ifndef CONFIGMGR_AUTOOBJECT_HXX
#include "autoobject.hxx"
#endif

namespace configmgr
{
    namespace uno       = ::com::sun::star::uno;

    //==========================================================================
    //= TreeManager
    //==========================================================================
    class CacheClientAccess;
    class CacheData;
    //==========================================================================
    class TreeManager   : public IConfigTreeManager
                        , public IConfigDefaultProvider
                        , public IDefaultableTreeManager
                        , private backend::ICachedDataListener
                        , private ConfigChangeBroadcaster
    {
        typedef CacheClientAccess       Cache;
        typedef rtl::Reference<Cache>   CacheRef;

        typedef AutoReferenceMap< RequestOptions, Cache, lessRequestOptions>    CacheList;
        typedef AutoObject< CacheData >                                         TemplateCache;

        typedef backend::ICachedDataProvider BackendCache;
        typedef rtl::Reference< BackendCache > BackendCacheRef;

        osl::Mutex          m_aCacheControllerMutex;
        BackendCacheRef     m_xCacheController;

        BackendCacheRef maybeGetBackendCache() CFG_NOTHROW( );
        BackendCacheRef getCacheLoader() CFG_UNO_THROW_RTE( );
        void disposeBackendCache() CFG_NOTHROW( );

        CacheList           m_aCacheList; // Map
        TemplateCache       m_aTemplates;
        sal_Bool            m_bEnableAsync;

    protected:
        // ref counted, that's why no public dtor
        ~TreeManager();

    public:
        /** ctor
        */
        explicit
        TreeManager(BackendCacheRef const & _xBackend, memory::HeapManager & _rCacheHeapManager);

        // disposing the cache before destroying
        void dispose();

        memory::HeapManager & getCacheHeapManager() const;

        // ITreeManager
        virtual memory::Segment* getDataSegment(AbsolutePath const& _rAccessor,
                                                RequestOptions const& _aOptions);

        /** requests a node given by it's path. Basicly, this means
            that the node is fetch from the cache when it contains it else it ask the server
            system into it's cache.
            @param          _rSubtreePath   the path to the node in URI notation.
            @param          _nMinLevels     indicates how many tree levels under the node determined by <arg>_rSubtreePath</arg>
                                            should be loaded
        */
        virtual data::NodeAccess requestSubtree(AbsolutePath const& _rSubtreePath,
                                                RequestOptions const& _aOptions
                                               ) CFG_UNO_THROW_ALL(  );

        virtual void updateTree(memory::UpdateAccessor& _aAccessToken, TreeChangeList& aChanges) CFG_UNO_THROW_ALL(  );

        virtual void saveAndNotifyUpdate(memory::Accessor const& _aChangedDataAccessor,
                                            TreeChangeList const& aChanges) CFG_UNO_THROW_ALL(  );

        virtual void releaseSubtree(AbsolutePath const& aSubtreePath,
                                    RequestOptions const& _aOptions ) CFG_NOTHROW();

        virtual void disposeData(const RequestOptions& _aOptions) CFG_NOTHROW();

        virtual void fetchSubtree(  AbsolutePath const& aSubtreePath,
                                    RequestOptions const& _xOptions
                                 ) CFG_NOTHROW();

        virtual void refreshAll() CFG_UNO_THROW_ALL(  );
        virtual void flushAll() CFG_NOTHROW();
        virtual void enableAsync(const sal_Bool& bEnableAsync) CFG_NOTHROW() ;

        // IDefaultableTreeManager
        virtual sal_Bool fetchDefaultData(  memory::UpdateAccessor& _aAccessToken,
                                            AbsolutePath const& aSubtreePath,
                                            RequestOptions const& _aOptions
                                         ) CFG_UNO_THROW_ALL(  );

        // IDefaultProvider
        virtual std::auto_ptr<ISubtree> requestDefaultData(AbsolutePath const& aSubtreePath,
                                                            const RequestOptions& _aOptions
                                                          ) CFG_UNO_THROW_ALL(  );
        // ITemplateManager
        virtual data::TreeAccessor requestTemplate( memory::Accessor const& _aAccessor,
                                                    Name const& aName, Name const& aModule
                                                  ) CFG_UNO_THROW_ALL(  );

        IConfigBroadcaster* getBroadcaster() { return this; }


    // implementation interfaces
        void refreshSubtree(const AbsolutePath &_aAbsoluteSubtreePath,
                            const RequestOptions& _aOptions) CFG_UNO_THROW_ALL(  );



    private:
        CacheData & getTemplates() { return * m_aTemplates.get(); }

        AbsolutePath encodeTemplateLocation(const Name& _rLogicalTemplateName, const Name &_rModule);

        void fireChanges(memory::Accessor const& _aChangedDataAccessor, TreeChangeList const& aChangeTree, sal_Bool _bError);

    private:
        CacheRef getCacheAlways(RequestOptions const & _aOptions);

        // disposing
        void disposeAll();
        void disposeOne(RequestOptions const & _aOptions);
        void disposeUser(RequestOptions const & _aUserOptions);
        void implDisposeOne(CacheRef const & _aCache, RequestOptions const & _aOptions);

        // ConfigChangeBroadcaster
        virtual ConfigChangeBroadcastHelper* getBroadcastHelper(RequestOptions const& _aOptions, bool bCreate);

        // former INotifyListener
        void nodeUpdated(TreeChangeList& _rChanges);

        // ICachedDataListener
        virtual void disposing(backend::ICachedDataProvider & _rProvider)   CFG_NOTHROW();
        virtual void componentCreated(backend::ComponentRequest const & _aComponent) CFG_NOTHROW();
        virtual void componentChanged(backend::UpdateRequest  const & _anUpdate)     CFG_NOTHROW();
    };

}


#endif