xref: /AOO41X/main/dbaccess/source/ui/inc/datasourcemap.hxx (revision 2e2212a7c22e96cf6f6fab0dd042c34a45a64bd6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef DBAUI_DATASOURCEMAP_HXX
25 #define DBAUI_DATASOURCEMAP_HXX
26 
27 #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #endif
30 #ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
31 #include <com/sun/star/container/XNameAccess.hpp>
32 #endif
33 #ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
34 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35 #endif
36 #ifndef _COMPHELPER_STLTYPES_HXX_
37 #include <comphelper/stl_types.hxx>
38 #endif
39 #ifndef _STRING_HXX
40 #include <tools/string.hxx>
41 #endif
42 
43 class SfxItemPool;
44 class SfxItemSet;
45 //.........................................................................
46 namespace dbaui
47 {
48 //.........................................................................
49 
50     //=====================================================================
51     //= ODatasourceMap
52     //=====================================================================
53     class ODatasourceMap
54     {
55         struct DatasourceInfo
56         {
57             ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
58                                 xDatasource;
59             SfxItemSet*         pModifications;
60 
DatasourceInfodbaui::ODatasourceMap::DatasourceInfo61             DatasourceInfo() :pModifications (NULL) {  }
DatasourceInfodbaui::ODatasourceMap::DatasourceInfo62             DatasourceInfo(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxDS,
63                     SfxItemSet* _pMods = NULL)
64                 :xDatasource(_rxDS), pModifications(_pMods) { }
65         };
66 
67         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
68                                 m_xORB;                 /// service factory
69         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
70                                 m_xDatabaseContext;     /// database context we're working in
71 
72         DECLARE_STL_USTRINGACCESS_MAP(DatasourceInfo, DatasourceInfos);
73         DatasourceInfos         m_aDatasources;         /// known infos about data sources
74 
75         // deleted data sources, not necessarily with distinct names, that's why accessed via unique ids
76         DECLARE_STL_MAP(sal_Int32, DatasourceInfo, ::std::less< sal_Int32 >, MapInt2Info);
77         MapInt2Info             m_aDeletedDatasources;
78 
79     public:
80         /// iterating through all data sources
81         class Iterator;
82         friend class ODatasourceMap::Iterator;
83 
84         /// encapsulates the infos about a data source for access from outside the class
85         class ODatasourceInfo;
86         friend class ODatasourceMap::ODatasourceInfo;
87 
88         ODatasourceInfo operator[](const ::rtl::OUString _rName);
89 
90         ODatasourceMap(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > _rxORB);
91 
92         // get the database context
93         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
getContext()94                     getContext() { return m_xDatabaseContext; }
95 
96         /// first element for iterating through the datasources
97         Iterator    begin();
98         /// last element for iterating through the datasources
99         Iterator    end();
100 
101         /// first element for iterating through the deleted datasources
102         Iterator    beginDeleted();
103         /// last element for iterating through the deleted datasources
104         Iterator    endDeleted();
105 
106         /// check if the object contains a valid datasource enumeration
isValid() const107         sal_Bool    isValid() const { return m_xDatabaseContext.is(); }
108         /// check if a datasource with the given name exists
109         sal_Bool    exists(const ::rtl::OUString& _rName) const;
110         /// return the number of datasources available
size() const111         sal_Int32   size() const { return m_aDatasources.size(); }
112         /// clear the map (non-deleted <em>and</em> deleted items)
113         void        clear();
114         /// clear the map (deleted items only)
115         void        clearDeleted();
116 
117         /// clear the modification items for a datasource
118         void        clearModifiedFlag(const ::rtl::OUString& _rName);
119 
120         /** tell the map that a data source is scheduled to be deleted.
121             @return     id for accessing the deleted data source later. -1 if no free id existed or an error occured
122         */
123         sal_Int32   markDeleted(const ::rtl::OUString& _rName);
124 
125         /** restores a datasource which has previously been marked as deleted.<p/>
126             @param      _nAccessId      the access id as got from <method>markDeleted</method>
127             @param      _rName          contains, upon return, the name of the datasource the access key refers to
128             @return     sal_True if the datasource was successfully restored, sal_False if it could not be restored
129                         because of a naming conflict (e.g. because another data source now has the name of the
130                         to-be-restored one).
131             @see    renamed
132             @see    markDeleted
133         */
134         sal_Bool    restoreDeleted(sal_Int32 _nAccessId, ::rtl::OUString& _rName);
135 
136         /// remove an element from the map
137         void        deleted(const ::rtl::OUString& _rName);
138             // (should be an erase(const Iterator&), but this is way to general ...
139 
140         /// update the infos for a data source with a given item set
141         void        update(const ::rtl::OUString& _rName, SfxItemSet& _rSet);
142         /** Tells the map that an entry has been renamed in a sense that it should be accessible under
143             a new name. This does not necesssarily mean that the data source has been renamed within
144             it's database context
145         */
146         void        renamed(const ::rtl::OUString& _rOldName, const ::rtl::OUString& _rNewName);
147 
148         /** adjust the registration name if necessary<p/>
149             The real name of the data source (as indicated in the SfxItemSet for this ds) may be another
150             one than the name the ds is registered for. This method corrects this, the ds will become registered
151             under it's real name.
152             @param      _rName      the name the ds is registered for
153             @return                 the real name of the data source
154         */
155         ::rtl::OUString adjustRealName(const ::rtl::OUString& _rName);
156 
157     protected:
158         /** ensure that the DatabaseInfo for the named object is filled<p/>
159             This method allows us lazy access to the data sources: They're retrieved from the context
160             only if they're accessed by somebody.
161         */
162         void    ensureObject(const ::rtl::OUString& _rName);
163     };
164 
165     //-------------------------------------------------------------------------
166     //- ODatasourceMap::ODatasourceInfo
167     //-------------------------------------------------------------------------
168     class ODatasourceMap::ODatasourceInfo
169     {
170         friend class ODatasourceMap;
171         friend class ODatasourceMap::Iterator;
172 
173     private:
174         ODatasourceMap*                             m_pOwner;
175         const ODatasourceMap::DatasourceInfo&       m_rInfoImpl;
176         ::rtl::OUString                             m_sName;
177         sal_Int32                                   m_nAccessKey;
178 
179     public:
ODatasourceInfo(const ODatasourceInfo & _rSource)180         ODatasourceInfo(const ODatasourceInfo& _rSource)
181             :m_pOwner(_rSource.m_pOwner), m_sName(_rSource.m_sName), m_rInfoImpl(_rSource.m_rInfoImpl), m_nAccessKey(_rSource.m_nAccessKey) { }
182 
183         /// check if the datasource settings are modified
184         sal_Bool        isModified() const;
185         /// get the name the datasource is registered under
getName() const186         ::rtl::OUString getName() const { return m_sName; }
187         /// get the original name of a datasource (may habe been renamed)
188         ::rtl::OUString getOriginalName() const;
189         /// get the real name of the datasource, which is the name which is in the item set
190         ::rtl::OUString getRealName() const;
191         /// check if the datasource should is about to be renamed (which means the original name does not equal the real name
isRenamed() const192         sal_Bool        isRenamed() const { return !getRealName().equals(getOriginalName()); }
193         /// get the key used to acces the object in the data source map
getAccessKey() const194         sal_Int32       getAccessKey() const { return m_nAccessKey; }
195 
196         /// return the datasource the object represents
197         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
198                         getDatasource() const;
199         /** return the modifications for the data source<p/>
200             The return value is non-NULL if and only if <method>isModified</method> returned sal_True
201         */
202         const SfxItemSet*
getModifications() const203                         getModifications() const { return m_rInfoImpl.pModifications; }
204 
operator ::rtl::OUString() const205         operator ::rtl::OUString() const { return getName(); }
operator String() const206         operator String() const { return getName().getStr(); }
207 
operator ->() const208         const ODatasourceInfo* const operator->() const { return this; }
209 
210     protected:
ODatasourceInfo(ODatasourceMap * _pOwner,const::rtl::OUString & _rName,const ODatasourceMap::DatasourceInfo & _rSource,sal_Int32 _nAccessKey)211         ODatasourceInfo(
212                 ODatasourceMap* _pOwner, const ::rtl::OUString& _rName,
213                 const ODatasourceMap::DatasourceInfo& _rSource, sal_Int32 _nAccessKey)
214             :m_pOwner(_pOwner), m_sName(_rName), m_rInfoImpl(_rSource), m_nAccessKey(_nAccessKey) { }
215     };
216 
217     //-------------------------------------------------------------------------
218     //- ODatasourceMap::Iterator
219     //-------------------------------------------------------------------------
220     class ODatasourceMap::Iterator
221     {
222         friend class ODatasourceMap;
223     protected:
224         ODatasourceMap*                                 m_pOwner;
225         ODatasourceMap::ConstDatasourceInfosIterator    m_aPos;
226         ODatasourceMap::ConstMapInt2InfoIterator        m_aPosDeleted;
227         sal_Bool                                        m_bLoopingDeleted;
228 
229     public:
230         Iterator(const Iterator& _rSource);
231 
232         ODatasourceInfo operator->() const;
233         ODatasourceInfo operator*() const;
234 
235         /// prefix increment
236         const Iterator& operator++();
237         /// postfix increment
operator ++(int)238         const Iterator  operator++(int) { Iterator hold(*this); ++*this; return hold; }
239 
240         /// prefix decrement
241         const Iterator& operator--();
242         /// postfix decrement
operator --(int)243         const Iterator  operator--(int) { Iterator hold(*this); --*this; return hold; }
244 
245 
246     // compare two iterators
operator ==(const Iterator & lhs,const Iterator & rhs)247         friend bool operator==(const Iterator& lhs, const Iterator& rhs)
248         {
249             if (lhs.m_bLoopingDeleted)
250                 return lhs.m_aPosDeleted == rhs.m_aPosDeleted;
251             else
252                 return lhs.m_aPos == rhs.m_aPos;
253         }
254 
operator !=(const Iterator & lhs,const Iterator & rhs)255         friend bool operator!=(const Iterator& lhs, const Iterator& rhs) { return !(lhs == rhs); }
256 
257     protected:
258         Iterator(ODatasourceMap* _pOwner, ODatasourceMap::ConstDatasourceInfosIterator _rPos);
259         Iterator(ODatasourceMap* _pOwner, ODatasourceMap::ConstMapInt2InfoIterator _rPos);
260 
261     protected:
262         ::rtl::OUString implGetName(const ODatasourceMap::DatasourceInfo& _rInfo) const;
263     };
264 
265 //.........................................................................
266 }   // namespace dbaui
267 //.........................................................................
268 
269 #endif // DBAUI_DATASOURCEMAP_HXX
270 
271