diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2000-09-18 15:18:56 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2000-09-18 15:18:56 +0000 |
commit | a253a5ecd3e1deb645b041c92b37f92bba0b8e15 (patch) | |
tree | 84082577e030e4e8ccb28b0409d98bea0ebbdd52 /dbaccess/source/inc/apitools.hxx | |
download | core-a253a5ecd3e1deb645b041c92b37f92bba0b8e15.tar.gz core-a253a5ecd3e1deb645b041c92b37f92bba0b8e15.zip |
initial import
Diffstat (limited to 'dbaccess/source/inc/apitools.hxx')
-rw-r--r-- | dbaccess/source/inc/apitools.hxx | 451 |
1 files changed, 451 insertions, 0 deletions
diff --git a/dbaccess/source/inc/apitools.hxx b/dbaccess/source/inc/apitools.hxx new file mode 100644 index 000000000000..e0682adc2dae --- /dev/null +++ b/dbaccess/source/inc/apitools.hxx @@ -0,0 +1,451 @@ +/************************************************************************* + * + * $RCSfile: apitools.hxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 16:14:56 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _DBASHARED_APITOOLS_HXX_ +#define _DBASHARED_APITOOLS_HXX_ + +#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ +#include <com/sun/star/beans/PropertyValue.hpp> +#endif +#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_ +#include <com/sun/star/beans/PropertyAttribute.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_SQLEXCEPTION_HPP_ +#include <com/sun/star/sdbc/SQLException.hpp> +#endif +#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_ +#include <com/sun/star/lang/XUnoTunnel.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_ +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#endif +#ifndef _CPPUHELPER_COMPONENT_HXX_ +#include <cppuhelper/component.hxx> +#endif +#ifndef _OSL_MUTEX_HXX_ +#include <osl/mutex.hxx> +#endif +#ifndef _CPPUHELPER_INTERFACECONTAINER_HXX_ +#include <cppuhelper/interfacecontainer.hxx> +#endif +#ifndef _OSL_DIAGNOSE_H_ +#include <osl/diagnose.h> +#endif +#ifndef _UTL_STLTYPES_HXX_ +#include <unotools/stl_types.hxx> +#endif + +//================================================================================== +//= various typedefs +//================================================================================== +DECLARE_STL_VECTOR(::com::sun::star::uno::WeakReferenceHelper, OWeakRefArray); + +//================================================================================== +//= various helper functions +//================================================================================== +//---------------------------------------------------------------------------------- +template <class TYPE> +inline void disposeComponent(const ::com::sun::star::uno::Reference< TYPE >& _rxObject) +{ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp(_rxObject, UNO_QUERY); + if (xComp.is()) + xComp->dispose(); +} + +//---------------------------------------------------------------------------------- +/** compose a complete table name from it's up to three parts, regarding to the database meta data composing rules +*/ +void composeTableName( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rxMetaData, + const ::rtl::OUString& _rCatalog, + const ::rtl::OUString& _rSchema, + const ::rtl::OUString& _rName, + ::rtl::OUString& _rComposedName, + sal_Bool _bQuote); + +//---------------------------------------------------------------------------------- +/** throw a generic SQLException, i.e. one with an SQLState of S1000, an ErrorCode of 0 and no NextException +*/ +inline void throwGenericSQLException(const ::rtl::OUString& _rMsg, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxSource) + throw (::com::sun::star::sdbc::SQLException) +{ + throw ::com::sun::star::sdbc::SQLException(_rMsg, _rxSource, ::rtl::OUString::createFromAscii("S1000"), 0, ::com::sun::star::uno::Any()); +} + +//---------------------------------------------------------------------------------- +template <class TYPE> +sal_Bool getImplementation(TYPE*& _pObject, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxIFace) +{ + _pObject = NULL; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xTunnel(_rxIFace, UNO_QUERY); + if (xTunnel.is()) + _pObject = reinterpret_cast< TYPE* >(xTunnel->getSomething(TYPE::getUnoTunnelImplementationId())); + + return (_pObject != NULL); +} + +//================================================================================== +//= OSubComponent - a class which olds a Mutex and a OBroadcastHelper; +//= needed because when deriving from OPropertySetHelper, +//= the OBroadcastHelper has to be initialized before +//= the OPropertySetHelper +//================================================================================== +class OMutexAndBroadcastHelper +{ +protected: + ::osl::Mutex m_aMutex; + ::cppu::OBroadcastHelper m_aBHelper; + +public: + OMutexAndBroadcastHelper() : m_aBHelper( m_aMutex ) { } + ~OMutexAndBroadcastHelper() + { + int nDummy = 0; + } + + ::osl::Mutex& GetMutex() { return m_aMutex; } + ::cppu::OBroadcastHelper& GetBroadcastHelper() { return m_aBHelper; } + +}; + +//================================================================================== +//= OSubComponent - a component which holds a hard ref to it's parent +//= and is been hold itself (by the parent) with a weak ref +//================================================================================== +class OSubComponent : public ::cppu::OComponentHelper +{ +protected: + // the parent must support the tunnel implementation + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent; + +public: + OSubComponent(::osl::Mutex& _rMutex, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xParent); + +// ::com::sun::star::lang::XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException); + +// ::com::sun::star::uno::XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) + throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL release() throw(::com::sun::star::uno::RuntimeException); + + inline operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > () const + { return (::com::sun::star::uno::XWeak *)this; } + +protected: + virtual void SAL_CALL disposing(); +}; + +//================================================================================== +//= StandardExceptions +//================================================================================== +class FunctionSequenceException : public ::com::sun::star::sdbc::SQLException +{ +public: + FunctionSequenceException(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context, + const ::com::sun::star::uno::Any& _Next = ::com::sun::star::uno::Any()); +}; + + +//************************************************************ +// OIdPropertyArrayUsageHelper +//************************************************************ +namespace cppu { class IPropertyArrayHelper; } + +typedef std::map< sal_Int32, ::cppu::IPropertyArrayHelper*, std::less< sal_Int32 > > OIdPropertyArrayMap; +template <class TYPE> +class OIdPropertyArrayUsageHelper +{ +protected: + static sal_Int32 s_nRefCount; + static OIdPropertyArrayMap* s_pMap; + static ::osl::Mutex s_aMutex; + +public: + OIdPropertyArrayUsageHelper(); + virtual ~OIdPropertyArrayUsageHelper() + { + ::osl::MutexGuard aGuard(s_aMutex); + OSL_ENSHURE(s_nRefCount > 0, "OIdPropertyArrayUsageHelper::~OIdPropertyArrayUsageHelper : suspicious call : have a refcount of 0 !"); + if (!--s_nRefCount) + { + // delete the element + for (OIdPropertyArrayMap::iterator i = s_pMap->begin(); i != s_pMap->end(); ++i) + delete (*i).second; + delete s_pMap; + s_pMap = NULL; + } + } + + /** call this in the getInfoHelper method of your derived class. The method returns the array helper of the + class, which is created if neccessary. + */ + ::cppu::IPropertyArrayHelper* getArrayHelper(sal_Int32 nId); + +protected: + /** used to implement the creation of the array helper which is shared amongst all instances of the class. + This method needs to be implemented in derived classes. + <BR> + The method gets called with s_aMutex acquired. + <BR> + as long as IPropertyArrayHelper has no virtual destructor, the implementation of ~OPropertyArrayUsageHelper + assumes that you created an ::cppu::OPropertyArrayHelper when deleting s_pProps. + @return an pointer to the newly created array helper. Must not be NULL. + */ + virtual ::cppu::IPropertyArrayHelper* createArrayHelper(sal_Int32 nId) const = 0; +}; + +//------------------------------------------------------------------ +template<class TYPE> +sal_Int32 OIdPropertyArrayUsageHelper< TYPE >::s_nRefCount = 0; + +template<class TYPE> +OIdPropertyArrayMap* OIdPropertyArrayUsageHelper< TYPE >::s_pMap = NULL; + +template<class TYPE> +::osl::Mutex OIdPropertyArrayUsageHelper< TYPE >::s_aMutex; + +//------------------------------------------------------------------ +template <class TYPE> +OIdPropertyArrayUsageHelper<TYPE>::OIdPropertyArrayUsageHelper() +{ + ::osl::MutexGuard aGuard(s_aMutex); + // create the map if necessary + if (s_pMap == NULL) + s_pMap = new OIdPropertyArrayMap(); + ++s_nRefCount; +} + +//------------------------------------------------------------------ +template <class TYPE> +::cppu::IPropertyArrayHelper* OIdPropertyArrayUsageHelper<TYPE>::getArrayHelper(sal_Int32 nId) +{ + OSL_ENSHURE(s_nRefCount, "OIdPropertyArrayUsageHelper::getArrayHelper : suspicious call : have a refcount of 0 !"); + ::osl::MutexGuard aGuard(s_aMutex); + // do we have the array already? + if (! (*s_pMap)[nId] ) + { + (*s_pMap)[nId] = createArrayHelper(nId); + OSL_ENSHURE((*s_pMap)[nId], "OIdPropertyArrayUsageHelper::getArrayHelper : createArrayHelper returned nonsense !"); + } + return (*s_pMap)[nId]; +} + + +//================================================================================== +//= helper for implementing the XServiceInfo interface + +//---------------------------------------------------------------------------------- +// (internal - not to be used outside - usually) +#define IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname) \ + ::rtl::OUString SAL_CALL classname::getImplementationName( ) throw (::com::sun::star::uno::RuntimeException) \ + { \ + return ::rtl::OUString::createFromAscii(implasciiname); \ + } \ + +#define IMPLEMENT_SERVICE_INFO_SUPPORTS(classname) \ + sal_Bool SAL_CALL classname::supportsService( const ::rtl::OUString& _rServiceName ) throw(::com::sun::star::uno::RuntimeException) \ + { \ + ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); \ + const ::rtl::OUString* pSupported = aSupported.getConstArray(); \ + for (sal_Int32 i=0; i<aSupported.getLength(); ++i, ++pSupported) \ + if (pSupported->equals(_rServiceName)) \ + return sal_True; \ + \ + return sal_False; \ + } \ + +#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED1(classname, serviceasciiname) \ + ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) \ + { \ + ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(1); \ + aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname); \ + return aSupported; \ + } \ + +#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED2(classname, serviceasciiname1, serviceasciiname2) \ + ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) \ + { \ + ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(2); \ + aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname1); \ + aSupported[1] = ::rtl::OUString::createFromAscii(serviceasciiname2); \ + return aSupported; \ + } \ + +#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED3(classname, serviceasciiname1, serviceasciiname2, serviceasciiname3) \ + ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) \ + { \ + ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(3); \ + aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname1); \ + aSupported[1] = ::rtl::OUString::createFromAscii(serviceasciiname2); \ + aSupported[2] = ::rtl::OUString::createFromAscii(serviceasciiname3); \ + return aSupported; \ + } \ + +//---------------------------------------------------------------------------------- +// declare service info methods - no getImplementationName, so the class is abstract +#define DECLARE_SERVICE_INFO_ABSTRACT() \ + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); \ + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) \ + +//---------------------------------------------------------------------------------- +// declare service info methods +#define DECLARE_SERVICE_INFO() \ + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); \ + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); \ + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) \ + +//---------------------------------------------------------------------------------- +#define IMPLEMENT_SERVICE_INFO1(classname, implasciiname, serviceasciiname) \ + IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname) \ + IMPLEMENT_SERVICE_INFO_SUPPORTS(classname) \ + IMPLEMENT_SERVICE_INFO_GETSUPPORTED1(classname, serviceasciiname) \ + +//---------------------------------------------------------------------------------- +#define IMPLEMENT_SERVICE_INFO2(classname, implasciiname, serviceasciiname1, serviceasciiname2) \ + IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname) \ + IMPLEMENT_SERVICE_INFO_SUPPORTS(classname) \ + IMPLEMENT_SERVICE_INFO_GETSUPPORTED2(classname, serviceasciiname1, serviceasciiname2) \ + +//---------------------------------------------------------------------------------- +#define IMPLEMENT_SERVICE_INFO3(classname, implasciiname, serviceasciiname1, serviceasciiname2, serviceasciiname3) \ + IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname) \ + IMPLEMENT_SERVICE_INFO_SUPPORTS(classname) \ + IMPLEMENT_SERVICE_INFO_GETSUPPORTED3(classname, serviceasciiname1, serviceasciiname2, serviceasciiname3) \ + +//---------------------------------------------------------------------------------- +#define IMPLEMENT_SERVICE_INFO1_ABSTRACT(classname, serviceasciiname) \ + IMPLEMENT_SERVICE_INFO_SUPPORTS(classname) \ + IMPLEMENT_SERVICE_INFO_GETSUPPORTED1(classname, serviceasciiname) \ + +//---------------------------------------------------------------------------------- +#define IMPLEMENT_SERVICE_INFO2_ABSTRACT(classname, serviceasciiname1, serviceasciiname2) \ + IMPLEMENT_SERVICE_INFO_SUPPORTS(classname) \ + IMPLEMENT_SERVICE_INFO_GETSUPPORTED2(classname, serviceasciiname1, serviceasciiname2) \ + +//================================================================================== +//= helper for implementing the createArrayHelper +//---------------------------------------------------------------------------------- +#define BEGIN_PROPERTY_SEQUENCE(count) \ + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property> aDescriptor(count); \ + ::com::sun::star::beans::Property* pDesc = aDescriptor.getArray(); \ + sal_Int32 nPos = 0; \ + +//---------------------------------------------------------------------------------- +#define BEGIN_PROPERTY_HELPER(count) \ + BEGIN_PROPERTY_SEQUENCE(count) + +//---------------------------------------------------------------------------------- +#define DECL_PROP_IMPL(varname, cpputype) \ + pDesc[nPos++] = ::com::sun::star::beans::Property(PROPERTY_##varname, PROPERTY_ID_##varname, cpputype, + +//---------------------------------------------------------------------------------- +#define DECL_PROP0(varname, type) \ + DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) 0) +//---------------------------------------------------------------------------------- +#define DECL_PROP0_BOOL(varname) \ + DECL_PROP_IMPL(varname, ::getBooleanCppuType()) 0) +//---------------------------------------------------------------------------------- +#define DECL_PROP0_IFACE(varname, iface) \ + DECL_PROP_IMPL(varname, ::getCppuType(static_cast< ::com::sun::star::uno::Reference< iface >* >(NULL))) 0) + +//---------------------------------------------------------------------------------- +#define DECL_PROP1(varname, type, attrib1) \ + DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) ::com::sun::star::beans::PropertyAttribute::##attrib1) +//---------------------------------------------------------------------------------- +#define DECL_PROP1_BOOL(varname, attrib1) \ + DECL_PROP_IMPL(varname, ::getBooleanCppuType()) ::com::sun::star::beans::PropertyAttribute::##attrib1) +//---------------------------------------------------------------------------------- +#define DECL_PROP1_IFACE(varname, iface, attrib1) \ + DECL_PROP_IMPL(varname, ::getCppuType(static_cast< ::com::sun::star::uno::Reference< iface >* >(NULL))) ::com::sun::star::beans::PropertyAttribute::##attrib1) + +//---------------------------------------------------------------------------------- +#define DECL_PROP2(varname, type, attrib1, attrib2) \ + DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) ::com::sun::star::beans::PropertyAttribute::##attrib1 | ::com::sun::star::beans::PropertyAttribute::##attrib2) +//---------------------------------------------------------------------------------- +#define DECL_PROP2_BOOL(varname, attrib1, attrib2) \ + DECL_PROP_IMPL(varname, ::getBooleanCppuType()) ::com::sun::star::beans::PropertyAttribute::##attrib1 | ::com::sun::star::beans::PropertyAttribute::##attrib2) + +//---------------------------------------------------------------------------------- +#define DECL_PROP3(varname, type, attrib1, attrib2, attrib3) \ + DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) ::com::sun::star::beans::PropertyAttribute::##attrib1 | ::com::sun::star::beans::PropertyAttribute::##attrib2 | ::com::sun::star::beans::PropertyAttribute::##attrib3) +//---------------------------------------------------------------------------------- +#define DECL_PROP3_BOOL(varname, attrib1, attrib2, attrib3) \ + DECL_PROP_IMPL(varname, ::getBooleanCppuType()) ::com::sun::star::beans::PropertyAttribute::##attrib1 | ::com::sun::star::beans::PropertyAttribute::##attrib2 | ::com::sun::star::beans::PropertyAttribute::##attrib3) + + +//---------------------------------------------------------------------------------- +#define END_PROPERTY_SEQUENCE() \ + OSL_ENSHURE(nPos == aDescriptor.getLength(), "forgot to adjust the count ?"); \ + +//---------------------------------------------------------------------------------- +#define END_PROPERTY_HELPER() \ + END_PROPERTY_SEQUENCE() \ + return new ::cppu::OPropertyArrayHelper(aDescriptor); + + +//================================================================================== +// miscellaneous +#define UNUSED(x) x; + +#endif // _DBASHARED_APITOOLS_HXX_ + |