summaryrefslogtreecommitdiff
path: root/comphelper/source/property/propertysetinfo.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'comphelper/source/property/propertysetinfo.cxx')
-rw-r--r--comphelper/source/property/propertysetinfo.cxx217
1 files changed, 217 insertions, 0 deletions
diff --git a/comphelper/source/property/propertysetinfo.cxx b/comphelper/source/property/propertysetinfo.cxx
new file mode 100644
index 000000000000..1b3d8b92b951
--- /dev/null
+++ b/comphelper/source/property/propertysetinfo.cxx
@@ -0,0 +1,217 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_comphelper.hxx"
+
+#include "comphelper/propertysetinfo.hxx"
+
+using namespace ::rtl;
+using namespace ::comphelper;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+
+namespace comphelper
+{
+class PropertyMapImpl
+{
+public:
+ PropertyMapImpl() throw();
+ virtual ~PropertyMapImpl() throw();
+
+ void add( PropertyMapEntry* pMap, sal_Int32 nCount = -1 ) throw();
+ void remove( const OUString& aName ) throw();
+
+ Sequence< Property > getProperties() throw();
+
+ const PropertyMap* getPropertyMap() const throw();
+
+ Property getPropertyByName( const OUString& aName ) throw( UnknownPropertyException );
+ sal_Bool hasPropertyByName( const OUString& aName ) throw();
+
+private:
+ PropertyMap maPropertyMap;
+ Sequence< Property > maProperties;
+};
+}
+
+PropertyMapImpl::PropertyMapImpl() throw()
+{
+}
+
+PropertyMapImpl::~PropertyMapImpl() throw()
+{
+}
+
+void PropertyMapImpl::add( PropertyMapEntry* pMap, sal_Int32 nCount ) throw()
+{
+ // nCount < 0 => add all
+ // nCount == 0 => add nothing
+ // nCount > 0 => add at most nCount entries
+
+ while( pMap->mpName && ( ( nCount < 0) || ( nCount-- > 0 ) ) )
+ {
+ OUString aName( pMap->mpName, pMap->mnNameLen, RTL_TEXTENCODING_ASCII_US );
+
+#ifdef DBG_UTIL
+ PropertyMap::iterator aIter = maPropertyMap.find( aName );
+ if( aIter != maPropertyMap.end() )
+ {
+ OSL_ENSURE( sal_False, "Warning: PropertyMapEntry added twice, possible error!");
+ }
+#endif
+ if( NULL == pMap->mpType )
+ {
+ OSL_ENSURE( sal_False, "No type in PropertyMapEntry!");
+ pMap->mpType = &::getCppuType((const sal_Int32*)0);
+ }
+
+ maPropertyMap[aName] = pMap;
+
+ if( maProperties.getLength() )
+ maProperties.realloc( 0 );
+
+ pMap = &pMap[1];
+ }
+}
+
+void PropertyMapImpl::remove( const OUString& aName ) throw()
+{
+ maPropertyMap.erase( aName );
+
+ if( maProperties.getLength() )
+ maProperties.realloc( 0 );
+}
+
+Sequence< Property > PropertyMapImpl::getProperties() throw()
+{
+ // maybe we have to generate the properties after
+ // a change in the property map or at first call
+ // to getProperties
+ if( maProperties.getLength() != (sal_Int32)maPropertyMap.size() )
+ {
+ maProperties = Sequence< Property >( maPropertyMap.size() );
+ Property* pProperties = maProperties.getArray();
+
+ PropertyMap::iterator aIter = maPropertyMap.begin();
+ const PropertyMap::iterator aEnd = maPropertyMap.end();
+ while( aIter != aEnd )
+ {
+ PropertyMapEntry* pEntry = (*aIter).second;
+
+ pProperties->Name = OUString( pEntry->mpName, pEntry->mnNameLen, RTL_TEXTENCODING_ASCII_US );
+ pProperties->Handle = pEntry->mnHandle;
+ pProperties->Type = *pEntry->mpType;
+ pProperties->Attributes = pEntry->mnAttributes;
+
+ ++pProperties;
+ ++aIter;
+ }
+ }
+
+ return maProperties;
+}
+
+const PropertyMap* PropertyMapImpl::getPropertyMap() const throw()
+{
+ return &maPropertyMap;
+}
+
+Property PropertyMapImpl::getPropertyByName( const OUString& aName ) throw( UnknownPropertyException )
+{
+ PropertyMap::iterator aIter = maPropertyMap.find( aName );
+
+ if( maPropertyMap.end() == aIter )
+ throw UnknownPropertyException( aName, NULL );
+
+ PropertyMapEntry* pEntry = (*aIter).second;
+
+ return Property( aName, pEntry->mnHandle, *pEntry->mpType, pEntry->mnAttributes );
+}
+
+sal_Bool PropertyMapImpl::hasPropertyByName( const OUString& aName ) throw()
+{
+ return maPropertyMap.find( aName ) != maPropertyMap.end();
+}
+
+///////////////////////////////////////////////////////////////////////
+
+PropertySetInfo::PropertySetInfo() throw()
+{
+ mpMap = new PropertyMapImpl();
+}
+
+PropertySetInfo::PropertySetInfo( PropertyMapEntry* pMap ) throw()
+{
+ mpMap = new PropertyMapImpl();
+ mpMap->add( pMap );
+}
+
+PropertySetInfo::~PropertySetInfo() throw()
+{
+ delete mpMap;
+}
+
+void PropertySetInfo::add( PropertyMapEntry* pMap ) throw()
+{
+ mpMap->add( pMap );
+}
+
+void PropertySetInfo::add( PropertyMapEntry* pMap, sal_Int32 nCount ) throw()
+{
+ mpMap->add( pMap, nCount );
+}
+
+void PropertySetInfo::remove( const rtl::OUString& aName ) throw()
+{
+ mpMap->remove( aName );
+}
+
+Sequence< ::com::sun::star::beans::Property > SAL_CALL PropertySetInfo::getProperties() throw(::com::sun::star::uno::RuntimeException)
+{
+ return mpMap->getProperties();
+}
+
+Property SAL_CALL PropertySetInfo::getPropertyByName( const ::rtl::OUString& aName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
+{
+ return mpMap->getPropertyByName( aName );
+}
+
+sal_Bool SAL_CALL PropertySetInfo::hasPropertyByName( const ::rtl::OUString& Name ) throw(::com::sun::star::uno::RuntimeException)
+{
+ return mpMap->hasPropertyByName( Name );
+}
+
+const PropertyMap* PropertySetInfo::getPropertyMap() const throw()
+{
+ return mpMap->getPropertyMap();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */