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 INCLUDED_CONFIGMGR_SOURCE_ACCESS_HXX 25 #define INCLUDED_CONFIGMGR_SOURCE_ACCESS_HXX 26 27 #include "sal/config.h" 28 29 #include <map> 30 #include <set> 31 #include <vector> 32 33 #include "boost/noncopyable.hpp" 34 #include "com/sun/star/beans/PropertyVetoException.hpp" 35 #include "com/sun/star/beans/UnknownPropertyException.hpp" 36 #include "com/sun/star/beans/XExactName.hpp" 37 #include "com/sun/star/beans/XHierarchicalPropertySet.hpp" 38 #include "com/sun/star/beans/XHierarchicalPropertySetInfo.hpp" 39 #include "com/sun/star/beans/XMultiHierarchicalPropertySet.hpp" 40 #include "com/sun/star/beans/XMultiPropertySet.hpp" 41 #include "com/sun/star/beans/XProperty.hpp" 42 #include "com/sun/star/beans/XPropertySet.hpp" 43 #include "com/sun/star/beans/XPropertySetInfo.hpp" 44 #include "com/sun/star/container/ElementExistException.hpp" 45 #include "com/sun/star/container/NoSuchElementException.hpp" 46 #include "com/sun/star/container/XContainer.hpp" 47 #include "com/sun/star/container/XHierarchicalName.hpp" 48 #include "com/sun/star/container/XHierarchicalNameAccess.hpp" 49 #include "com/sun/star/container/XNameContainer.hpp" 50 #include "com/sun/star/container/XNamed.hpp" 51 #include "com/sun/star/lang/IllegalArgumentException.hpp" 52 #include "com/sun/star/lang/NoSupportException.hpp" 53 #include "com/sun/star/lang/WrappedTargetException.hpp" 54 #include "com/sun/star/lang/XComponent.hpp" 55 #include "com/sun/star/lang/XServiceInfo.hpp" 56 #include "com/sun/star/lang/XTypeProvider.hpp" 57 #include "com/sun/star/lang/XSingleServiceFactory.hpp" 58 #include "com/sun/star/uno/Exception.hpp" 59 #include "com/sun/star/uno/Reference.hxx" 60 #include "com/sun/star/uno/RuntimeException.hpp" 61 #include "com/sun/star/uno/Sequence.hxx" 62 #include "cppuhelper/weak.hxx" 63 #include "osl/interlck.h" 64 #include "rtl/ref.hxx" 65 #include "sal/types.h" 66 67 #include "modifications.hxx" 68 #include "path.hxx" 69 #include "type.hxx" 70 71 namespace com { namespace sun { namespace star { 72 namespace beans { 73 class XHierarchicalPropertySetInfo; 74 class XPropertiesChangeListener; 75 class XPropertyChangeListener; 76 class XVetoableChangeListener; 77 struct Property; 78 } 79 namespace container { class XContainerListener; } 80 namespace lang { class XEventListener; } 81 namespace uno { 82 class Any; 83 class Type; 84 class XInterface; 85 } 86 namespace util { struct ElementChange; } 87 } } } 88 namespace rtl { class OUString; } 89 90 namespace configmgr { 91 92 class Broadcaster; 93 class Change; 94 class ChildAccess; 95 class Components; 96 class Node; 97 class RootAccess; 98 99 class Access: 100 public cppu::OWeakObject, public com::sun::star::lang::XTypeProvider, 101 public com::sun::star::lang::XServiceInfo, 102 public com::sun::star::lang::XComponent, 103 public com::sun::star::container::XHierarchicalNameAccess, 104 public com::sun::star::container::XContainer, 105 public com::sun::star::beans::XExactName, 106 public com::sun::star::beans::XPropertySetInfo, 107 public com::sun::star::container::XHierarchicalName, 108 public com::sun::star::container::XNamed, 109 public com::sun::star::beans::XProperty, 110 public com::sun::star::beans::XPropertySet, 111 public com::sun::star::beans::XMultiPropertySet, 112 public com::sun::star::beans::XHierarchicalPropertySet, 113 public com::sun::star::beans::XMultiHierarchicalPropertySet, 114 public com::sun::star::beans::XHierarchicalPropertySetInfo, 115 public com::sun::star::container::XNameContainer, 116 public com::sun::star::lang::XSingleServiceFactory, 117 private boost::noncopyable 118 { 119 public: 120 oslInterlockedCount acquireCounting(); 121 122 void releaseNondeleting(); 123 124 bool isValue(); 125 126 void markChildAsModified(rtl::Reference< ChildAccess > const & child); 127 128 void releaseChild(rtl::OUString const & name); 129 130 virtual Path getAbsolutePath() = 0; 131 132 virtual Path getRelativePath() = 0; 133 134 virtual rtl::OUString getRelativePathRepresentation() = 0; 135 136 virtual rtl::Reference< Node > getNode() = 0; 137 138 virtual bool isFinalized() = 0; 139 140 virtual void initBroadcaster( 141 Modifications::Node const & modifications, Broadcaster * broadcaster); 142 143 using OWeakObject::acquire; 144 using OWeakObject::release; 145 146 protected: 147 Access(Components & components); 148 149 virtual ~Access(); 150 151 virtual rtl::OUString getNameInternal() = 0; 152 153 virtual rtl::Reference< RootAccess > getRootAccess() = 0; 154 155 virtual rtl::Reference< Access > getParentAccess() = 0; 156 157 virtual void addTypes(std::vector< com::sun::star::uno::Type > * types) 158 const = 0; 159 160 virtual void addSupportedServiceNames( 161 std::vector< rtl::OUString > * services) = 0; 162 163 virtual void initDisposeBroadcaster(Broadcaster * broadcaster); 164 165 virtual void clearListeners() throw (); 166 167 virtual com::sun::star::uno::Any SAL_CALL queryInterface( 168 com::sun::star::uno::Type const & aType); 169 170 Components & getComponents() const; 171 172 void checkLocalizedPropertyAccess(); 173 174 rtl::Reference< Node > getParentNode(); 175 176 rtl::Reference< ChildAccess > getChild(rtl::OUString const & name); 177 178 std::vector< rtl::Reference< ChildAccess > > getAllChildren(); 179 180 void checkValue( 181 com::sun::star::uno::Any const & value, Type type, bool nillable); 182 183 void insertLocalizedValueChild( 184 rtl::OUString const & name, com::sun::star::uno::Any const & value, 185 Modifications * localModifications); 186 187 void reportChildChanges( 188 std::vector< com::sun::star::util::ElementChange > * changes); 189 190 void commitChildChanges(bool valid, Modifications * globalModifications); 191 192 void initBroadcasterAndChanges( 193 Modifications::Node const & modifications, Broadcaster * broadcaster, 194 std::vector< com::sun::star::util::ElementChange > * changes); 195 196 bool isDisposed() const; 197 198 private: 199 struct ModifiedChild { 200 rtl::Reference< ChildAccess > child; 201 bool directlyModified; 202 203 ModifiedChild(); 204 205 ModifiedChild( 206 rtl::Reference< ChildAccess > const & theChild, 207 bool theDirectlyModified); 208 }; 209 210 typedef std::map< rtl::OUString, ModifiedChild > ModifiedChildren; 211 212 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Type > SAL_CALL 213 getTypes(); 214 215 virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL 216 getImplementationId(); 217 218 virtual rtl::OUString SAL_CALL getImplementationName(); 219 220 virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName); 221 222 virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL 223 getSupportedServiceNames(); 224 225 virtual void SAL_CALL dispose(); 226 227 virtual void SAL_CALL addEventListener( 228 com::sun::star::uno::Reference< com::sun::star::lang::XEventListener > 229 const & xListener); 230 231 virtual void SAL_CALL removeEventListener( 232 com::sun::star::uno::Reference< com::sun::star::lang::XEventListener > 233 const & aListener); 234 235 virtual com::sun::star::uno::Type SAL_CALL getElementType(); 236 237 virtual sal_Bool SAL_CALL hasElements(); 238 239 virtual com::sun::star::uno::Any SAL_CALL getByName( 240 rtl::OUString const & aName); 241 242 virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL 243 getElementNames(); 244 245 virtual sal_Bool SAL_CALL hasByName(rtl::OUString const & aName); 246 247 virtual com::sun::star::uno::Any SAL_CALL getByHierarchicalName( 248 rtl::OUString const & aName); 249 250 virtual sal_Bool SAL_CALL hasByHierarchicalName(rtl::OUString const & aName); 251 252 virtual void SAL_CALL addContainerListener( 253 com::sun::star::uno::Reference< 254 com::sun::star::container::XContainerListener > const & xListener); 255 256 virtual void SAL_CALL removeContainerListener( 257 com::sun::star::uno::Reference< 258 com::sun::star::container::XContainerListener > const & xListener); 259 260 virtual rtl::OUString SAL_CALL getExactName( 261 rtl::OUString const & aApproximateName); 262 263 virtual com::sun::star::uno::Sequence< com::sun::star::beans::Property > 264 SAL_CALL getProperties(); 265 266 virtual com::sun::star::beans::Property SAL_CALL getPropertyByName( 267 rtl::OUString const & aName); 268 269 virtual sal_Bool SAL_CALL hasPropertyByName(rtl::OUString const & Name); 270 271 virtual rtl::OUString SAL_CALL getHierarchicalName(); 272 273 virtual rtl::OUString SAL_CALL composeHierarchicalName( 274 rtl::OUString const & aRelativeName); 275 276 virtual rtl::OUString SAL_CALL getName(); 277 278 virtual void SAL_CALL setName(rtl::OUString const & aName); 279 280 virtual com::sun::star::beans::Property SAL_CALL getAsProperty(); 281 282 virtual 283 com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo > 284 SAL_CALL getPropertySetInfo(); 285 286 virtual void SAL_CALL setPropertyValue( 287 rtl::OUString const & aPropertyName, 288 com::sun::star::uno::Any const & aValue); 289 290 virtual com::sun::star::uno::Any SAL_CALL getPropertyValue( 291 rtl::OUString const & PropertyName); 292 293 virtual void SAL_CALL addPropertyChangeListener( 294 rtl::OUString const & aPropertyName, 295 com::sun::star::uno::Reference< 296 com::sun::star::beans::XPropertyChangeListener > const & xListener); 297 298 virtual void SAL_CALL removePropertyChangeListener( 299 rtl::OUString const & aPropertyName, 300 com::sun::star::uno::Reference< 301 com::sun::star::beans::XPropertyChangeListener > const & aListener); 302 303 virtual void SAL_CALL addVetoableChangeListener( 304 rtl::OUString const & PropertyName, 305 com::sun::star::uno::Reference< 306 com::sun::star::beans::XVetoableChangeListener > const & aListener); 307 308 virtual void SAL_CALL removeVetoableChangeListener( 309 rtl::OUString const & PropertyName, 310 com::sun::star::uno::Reference< 311 com::sun::star::beans::XVetoableChangeListener > const & aListener); 312 313 virtual void SAL_CALL setPropertyValues( 314 com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames, 315 com::sun::star::uno::Sequence< com::sun::star::uno::Any > const & 316 aValues); 317 318 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Any > SAL_CALL 319 getPropertyValues( 320 com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames); 321 322 virtual void SAL_CALL addPropertiesChangeListener( 323 com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames, 324 com::sun::star::uno::Reference< 325 com::sun::star::beans::XPropertiesChangeListener > const & 326 xListener); 327 328 virtual void SAL_CALL removePropertiesChangeListener( 329 com::sun::star::uno::Reference< 330 com::sun::star::beans::XPropertiesChangeListener > const & 331 xListener); 332 333 virtual void SAL_CALL firePropertiesChangeEvent( 334 com::sun::star::uno::Sequence< rtl::OUString > const & aPropertyNames, 335 com::sun::star::uno::Reference< 336 com::sun::star::beans::XPropertiesChangeListener > const & 337 xListener); 338 339 virtual 340 com::sun::star::uno::Reference< 341 com::sun::star::beans::XHierarchicalPropertySetInfo > SAL_CALL 342 getHierarchicalPropertySetInfo(); 343 344 virtual void SAL_CALL setHierarchicalPropertyValue( 345 rtl::OUString const & aHierarchicalPropertyName, 346 com::sun::star::uno::Any const & aValue); 347 348 virtual com::sun::star::uno::Any SAL_CALL getHierarchicalPropertyValue( 349 rtl::OUString const & aHierarchicalPropertyName); 350 351 virtual void SAL_CALL setHierarchicalPropertyValues( 352 com::sun::star::uno::Sequence< rtl::OUString > const & 353 aHierarchicalPropertyNames, 354 com::sun::star::uno::Sequence< com::sun::star::uno::Any > const & 355 Values); 356 357 virtual com::sun::star::uno::Sequence< com::sun::star::uno::Any > SAL_CALL 358 getHierarchicalPropertyValues( 359 com::sun::star::uno::Sequence< rtl::OUString > const & 360 aHierarchicalPropertyNames); 361 362 virtual com::sun::star::beans::Property SAL_CALL 363 getPropertyByHierarchicalName(rtl::OUString const & aHierarchicalName); 364 365 virtual sal_Bool SAL_CALL hasPropertyByHierarchicalName( 366 rtl::OUString const & aHierarchicalName); 367 368 virtual void SAL_CALL replaceByName( 369 rtl::OUString const & aName, com::sun::star::uno::Any const & aElement); 370 371 virtual void SAL_CALL insertByName( 372 rtl::OUString const & aName, com::sun::star::uno::Any const & aElement); 373 374 virtual void SAL_CALL removeByName(rtl::OUString const & aName); 375 376 virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > 377 SAL_CALL createInstance(); 378 379 virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > 380 SAL_CALL createInstanceWithArguments( 381 com::sun::star::uno::Sequence< com::sun::star::uno::Any > const & 382 aArguments); 383 384 rtl::Reference< ChildAccess > getModifiedChild( 385 ModifiedChildren::iterator const & childIterator); 386 387 rtl::Reference< ChildAccess > getUnmodifiedChild( 388 rtl::OUString const & name); 389 390 rtl::Reference< ChildAccess > getSubChild(rtl::OUString const & path); 391 392 bool setChildProperty( 393 rtl::OUString const & name, com::sun::star::uno::Any const & value, 394 Modifications * localModifications); 395 396 com::sun::star::beans::Property asProperty(); 397 398 void checkFinalized(); 399 400 void checkKnownProperty(rtl::OUString const & descriptor); 401 402 rtl::Reference< ChildAccess > getFreeSetMember( 403 com::sun::star::uno::Any const & value); 404 405 rtl::Reference< Access > getNotificationRoot(); 406 407 typedef std::map< rtl::OUString, ChildAccess * > WeakChildMap; 408 409 typedef 410 std::multiset< 411 com::sun::star::uno::Reference< 412 com::sun::star::lang::XEventListener > > 413 DisposeListeners; 414 415 typedef 416 std::multiset< 417 com::sun::star::uno::Reference< 418 com::sun::star::container::XContainerListener > > 419 ContainerListeners; 420 421 typedef 422 std::multiset< 423 com::sun::star::uno::Reference< 424 com::sun::star::beans::XPropertyChangeListener > > 425 PropertyChangeListenersElement; 426 427 typedef std::map< rtl::OUString, PropertyChangeListenersElement > 428 PropertyChangeListeners; 429 430 typedef 431 std::multiset< 432 com::sun::star::uno::Reference< 433 com::sun::star::beans::XVetoableChangeListener > > 434 VetoableChangeListenersElement; 435 436 typedef std::map< rtl::OUString, VetoableChangeListenersElement > 437 VetoableChangeListeners; 438 439 typedef 440 std::multiset< 441 com::sun::star::uno::Reference< 442 com::sun::star::beans::XPropertiesChangeListener > > 443 PropertiesChangeListeners; 444 445 Components & components_; 446 ModifiedChildren modifiedChildren_; 447 WeakChildMap cachedChildren_; 448 DisposeListeners disposeListeners_; 449 ContainerListeners containerListeners_; 450 PropertyChangeListeners propertyChangeListeners_; 451 VetoableChangeListeners vetoableChangeListeners_; 452 PropertiesChangeListeners propertiesChangeListeners_; 453 bool disposed_; 454 455 #if OSL_DEBUG_LEVEL > 0 456 protected: 457 enum { 458 IS_ANY = 0, IS_GROUP = 0x01, IS_SET = 0x02, IS_EXTENSIBLE = 0x04, 459 IS_GROUP_MEMBER = 0x08, IS_SET_MEMBER = 0x10, IS_UPDATE = 0x20 }; 460 bool thisIs(int what); 461 #endif 462 }; 463 464 } 465 466 #endif 467