/* -*- 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 * * for a copy of the LGPLv3 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_FAIL(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_ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */