/************************************************************** * * 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_AOLEWRAP_HXX_ #define _CONNECTIVITY_ADO_AOLEWRAP_HXX_ #include #include #include #include #include "connectivity/StdTypeDefs.hxx" namespace rtl { class OUString; } namespace connectivity { namespace ado { class OLEVariant; class WpBase { protected: IDispatch* pIUnknown; void setIDispatch(IDispatch* _pIUnknown); public: WpBase(); WpBase(IDispatch* pInt); //inline WpBase& operator=(const WpBase& rhs); WpBase& operator=(IDispatch* rhs); WpBase(const WpBase& aWrapper); virtual ~WpBase(); void clear(); sal_Bool IsValid() const; operator IDispatch*(); }; ////////////////////////////////////////////////////////////////////////// // // Template-Klasse WpOLEBase // ================================== // // Objekte dieser Klasse haelt einen Zeiger auf ein Interface vom Typ T. // Es gibt Konstruktoren und Zuweisungsoperator die sicherstellen, dass // AddRef() und Release() entsprechend den COM-Konventionen gerufen werden. // Ein Objekt kann auch keinen Zeiger halten (Nullzeiger), dann ergibt // der Aufruf von IsValid() FALSE. // // Um effizientes pass-by-value machen zu koennen, ist diese (ebenso wie die // abgeleiteten Klassen) eine ganz schmale Wrapper-Klasse unter Vermeidung // virtueller Methoden und mit Inlining. //------------------------------------------------------------------------ template class WpOLEBase : public WpBase { protected: T* pInterface; public: WpOLEBase(T* pInt = NULL) : WpBase(pInt),pInterface(pInt){} //inline WpOLEBase& operator=(const WpOLEBase& rhs) { WpBase::operator=(rhs); pInterface = rhs.pInterface; return *this; }; WpOLEBase& operator=(T* rhs) { WpBase::operator=(rhs); pInterface = rhs.pInterface; return *this; } WpOLEBase(const WpOLEBase& aWrapper) { operator=(aWrapper); } virtual ~WpOLEBase() { } operator T*() const { return static_cast(pInterface); } void setWithOutAddRef(T* _pInterface) { pInterface = _pInterface; WpBase::setIDispatch(_pInterface); } }; ////////////////////////////////////////////////////////////////////////// // // Template-Klasse WpOLECollection // =============================================================== // // Diese Klasse, welche sich von WpOLEBase ableitet, abstrahiert die // den DAO-Collections gemeinsamen Eigenschaften: // // Sie werden ueber ein Interface Ts (etwa: DAOFields) angesprochen // und koennen ueber get_Item (hier:GetItem) Items des Typs T (genauer: // mit Interface T, etwa DAOField) herausgeben. // // Diese Wrapperklasse gibt aber nicht ein Interface T heraus, // sondern ein Objekt der Klasse WrapT. Dieses muss eine Konstruktion // durch T zulassen, vorzugsweise ist es von WpOLEBase abgeleitet. // //------------------------------------------------------------------------ template class WpOLECollection : public WpOLEBase { public: using WpOLEBase::pInterface; using WpOLEBase::IsValid; // Konstruktoren, operator= // diese rufen nur die Oberklasse WpOLECollection(Ts* pInt=NULL):WpOLEBase(pInt){} WpOLECollection(const WpOLECollection& rhs){operator=(rhs);} inline WpOLECollection& operator=(const WpOLECollection& rhs) {WpOLEBase::operator=(rhs); return *this;}; ////////////////////////////////////////////////////////////////////// inline void Refresh(){pInterface->Refresh();} inline sal_Int32 GetItemCount() const { sal_Int32 nCount = 0; return pInterface ? (SUCCEEDED(pInterface->get_Count(&nCount)) ? nCount : sal_Int32(0)) : sal_Int32(0); } inline WrapT GetItem(sal_Int32 index) const { OSL_ENSURE(index >= 0 && indexget_Item(OLEVariant(index), &pT))) aRet.setWithOutAddRef(pT); return aRet; } inline WrapT GetItem(const OLEVariant& index) const { T* pT = NULL; WrapT aRet(NULL); if(SUCCEEDED(pInterface->get_Item(index, &pT))) aRet.setWithOutAddRef(pT); return aRet; } inline WrapT GetItem(const ::rtl::OUString& sStr) const { WrapT aRet(NULL); T* pT = NULL; if (FAILED(pInterface->get_Item(OLEVariant(sStr), &pT))) { #if OSL_DEBUG_LEVEL > 0 ::rtl::OString sTemp("Unknown Item: "); sTemp += ::rtl::OString(sStr.getStr(),sStr.getLength(),osl_getThreadTextEncoding()); OSL_ENSURE(0,sTemp); #endif } else aRet.setWithOutAddRef(pT); return aRet; } inline void fillElementNames(TStringVector& _rVector) { if(IsValid()) { Refresh(); sal_Int32 nCount = GetItemCount(); _rVector.reserve(nCount); for(sal_Int32 i=0;i< nCount;++i) { WrapT aElement = GetItem(i); if(aElement.IsValid()) _rVector.push_back(aElement.get_Name()); } } } }; template class WpOLEAppendCollection: public WpOLECollection { public: // Konstruktoren, operator= // diese rufen nur die Oberklasse using WpOLEBase::pInterface; WpOLEAppendCollection(Ts* pInt=NULL):WpOLECollection(pInt){} WpOLEAppendCollection(const WpOLEAppendCollection& rhs){ operator=(rhs); } inline WpOLEAppendCollection& operator=(const WpOLEAppendCollection& rhs) {WpOLEBase::operator=(rhs); return *this;}; ////////////////////////////////////////////////////////////////////// inline sal_Bool Append(const WrapT& aWrapT) { return SUCCEEDED(pInterface->Append(OLEVariant((T*)aWrapT))); }; inline sal_Bool Delete(const ::rtl::OUString& sName) { return SUCCEEDED(pInterface->Delete(OLEVariant(sName))); }; }; } } #endif // _CONNECTIVITY_ADO_AOLEWRAP_HXX_