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