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