/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _CONNECTIVITY_ADO_COLLECTION_HXX_ #define _CONNECTIVITY_ADO_COLLECTION_HXX_ #include #include #include #include "ado/Awrapadox.hxx" #include "ado/Aolevariant.hxx" #include namespace connectivity { namespace ado { namespace starcontainer = ::com::sun::star::container; namespace starlang = ::com::sun::star::lang; namespace staruno = ::com::sun::star::uno; namespace starbeans = ::com::sun::star::beans; typedef ::cppu::WeakImplHelper3< starcontainer::XNameAccess, starcontainer::XIndexAccess, starlang::XServiceInfo> OCollectionBase; //************************************************************ // OCollection //************************************************************ template class OCollection : public OCollectionBase { private: OCollection( const OCollection& ); // never implemented OCollection& operator=( const OCollection& ); // never implemented protected: vector m_aElements; ::cppu::OWeakObject& m_rParent; ::osl::Mutex& m_rMutex; // mutex of the parent T* m_pCollection; public: OCollection(::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex,T* _pCollection) : m_rParent(_rParent) ,m_rMutex(_rMutex) ,m_pCollection(_pCollection) { m_pCollection->AddRef(); } ~OCollection() { m_pCollection->Release(); } virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (staruno::RuntimeException) { return ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.ACollection"); } virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& _rServiceName ) throw(staruno::RuntimeException) { staruno::Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); const ::rtl::OUString* pSupported = aSupported.getConstArray(); for (sal_Int32 i=0; iequals(_rServiceName)) return sal_True; return sal_False; } virtual staruno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw(staruno::RuntimeException) { staruno::Sequence< ::rtl::OUString > aSupported(1); aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.Container"); return aSupported; } // dispatch the refcounting to the parent virtual void SAL_CALL acquire() throw() { m_rParent.acquire(); } virtual void SAL_CALL release() throw() { m_rParent.release(); } // ::com::sun::star::container::XElementAccess virtual staruno::Type SAL_CALL getElementType( ) throw(staruno::RuntimeException) { return::getCppuType(static_cast< staruno::Reference< starbeans::XPropertySet>*>(NULL)); } virtual sal_Bool SAL_CALL hasElements( ) throw(staruno::RuntimeException) { ::osl::MutexGuard aGuard(m_rMutex); return getCount() > 0; } // starcontainer::XIndexAccess virtual sal_Int32 SAL_CALL getCount( ) throw(staruno::RuntimeException) { ::osl::MutexGuard aGuard(m_rMutex); sal_Int32 nCnt = 0; m_pCollection->get_Count(&nCnt); return nCnt; } virtual staruno::Any SAL_CALL getByIndex( sal_Int32 Index ) throw(starlang::IndexOutOfBoundsException, starlang::WrappedTargetException, staruno::RuntimeException) { ::osl::MutexGuard aGuard(m_rMutex); if (Index < 0 || Index >= getCount()) throw starlang::IndexOutOfBoundsException(); SimT* pCol = NULL; m_pCollection->get_Item(OLEVariant(Index),&pCol); if(!pCol) throw starlang::IndexOutOfBoundsException(); OCl* pIndex = new OCl(pCol); m_aElements.push_back(pIndex); return staruno::makeAny( staruno::Reference< starbeans::XPropertySet >(pIndex)); } // starcontainer::XNameAccess virtual staruno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw(starcontainer::NoSuchElementException, starlang::WrappedTargetException, staruno::RuntimeException) { ::osl::MutexGuard aGuard(m_rMutex); SimT* pCol = NULL; m_pCollection->get_Item(OLEVariant(aName),&pCol); if(!pCol) throw starlang::IndexOutOfBoundsException(); OCl* pIndex = new OCl(pCol); m_aElements.push_back(pIndex); return staruno::makeAny( staruno::Reference< starbeans::XPropertySet >(pIndex)); } virtual staruno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw(staruno::RuntimeException) { ::osl::MutexGuard aGuard(m_rMutex); sal_Int32 nLen = getCount(); staruno::Sequence< ::rtl::OUString > aNameList(nLen); ::rtl::OUString* pStringArray = aNameList.getArray(); OLEVariant aVar; for (sal_Int32 i=0;iget_Item(aVar,&pIdx); pIdx->AddRef(); _bstr_t sBSTR; pIdx->get_Name(&sBSTR); (*pStringArray) = (sal_Unicode*)sBSTR; pIdx->Release(); ++pStringArray; } return aNameList; } virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw(staruno::RuntimeException) { ::osl::MutexGuard aGuard(m_rMutex); SimT* pCol = NULL; m_pCollection->get_Item(OLEVariant(aName),&pCol); return pCol != NULL; } void SAL_CALL disposing() { ::osl::MutexGuard aGuard(m_rMutex); for (::std::vector::const_iterator i = m_aElements.begin(); i != m_aElements.end(); ++i) { (*i)->disposing(); (*i)->release(); } m_aElements.clear(); } }; class OIndex; class OKey; class OColumn; class OTable; class OView; class OGroup; class OUser; typedef OCollection< ADOIndexes,ADOIndex,OIndex> OIndexes; typedef OCollection< ADOKeys,ADOKey,OKey> OKeys; typedef OCollection< ADOColumns,ADOColumn,OColumn> OColumns; typedef OCollection< ADOTables,ADOTable,OTable> OTables; typedef OCollection< ADOViews,ADOView,OView> OViews; typedef OCollection< ADOGroups,ADOGroup,OGroup> OGroups; typedef OCollection< ADOUsers,ADOUser,OUser> OUsers; } } #endif // _CONNECTIVITY_ADO_COLLECTION_HXX_