blob: eeeac3a4454270c9cec242263ab964bedb365148 [file] [log] [blame]
/**************************************************************
*
* 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_PARAMWRAPPER_HXX
#define CONNECTIVITY_PARAMWRAPPER_HXX
#include "connectivity/dbtoolsdllapi.hxx"
#include <connectivity/FValue.hxx>
/** === begin UNO includes === **/
#include <com/sun/star/sdbc/XParameters.hpp>
#include <com/sun/star/container/XIndexAccess.hpp>
#include <com/sun/star/container/XEnumerationAccess.hpp>
#include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.hpp>
/** === end UNO includes === **/
#include <comphelper/uno3.hxx>
#include <comphelper/broadcasthelper.hxx>
#include <cppuhelper/weak.hxx>
#include <cppuhelper/propshlp.hxx>
#include <cppuhelper/compbase2.hxx>
#include <memory>
#include <vector>
//........................................................................
namespace dbtools
{
namespace param
{
//........................................................................
//====================================================================
//= ParameterWrapper
//====================================================================
/** wraps a parameter column as got from an SQLQueryComposer, so that it has an additional
property "Value", which is forwarded to an XParameters interface
*/
class OOO_DLLPUBLIC_DBTOOLS ParameterWrapper :public ::cppu::OWeakObject
,public ::comphelper::OMutexAndBroadcastHelper
,public ::cppu::OPropertySetHelper
{
private:
typedef ::cppu::OWeakObject UnoBase;
typedef ::cppu::OPropertySetHelper PropertyBase;
private:
/// the most recently set value of the parameter
::connectivity::ORowSetValue m_aValue;
/// the positions (in our m_xValueDestination) at which the value should be set (0-based!)
::std::vector< sal_Int32 > m_aIndexes;
/// the "delegator" column to which standard property requests are forwarded
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xDelegator;
/// the property set info for our delegator
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > m_xDelegatorPSI;
/// the component taking the value
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters > m_xValueDestination;
/// helper for implementing XPropertySetInfo
::std::auto_ptr< ::cppu::OPropertyArrayHelper > m_pInfoHelper;
public:
const ::connectivity::ORowSetValue& Value() const { return m_aValue; }
::connectivity::ORowSetValue& Value() { return m_aValue; }
public:
ParameterWrapper(
const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn
);
ParameterWrapper(
const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn,
const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters >& _rxAllParameters,
const ::std::vector< sal_Int32 >& _rIndexes
);
DECLARE_XINTERFACE()
DECLARE_XTYPEPROVIDER()
// XPropertySet
virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException );
virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
// OPropertySetHelper
virtual sal_Bool SAL_CALL convertFastPropertyValue( ::com::sun::star::uno::Any& rConvertedValue, ::com::sun::star::uno::Any& rOldValue, sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue) throw( ::com::sun::star::lang::IllegalArgumentException );
virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw( ::com::sun::star::uno::Exception );
virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const;
// pseudo-XComponent
virtual void SAL_CALL dispose();
protected:
virtual ~ParameterWrapper();
// disambiguations
using ::cppu::OPropertySetHelper::getFastPropertyValue;
private:
::rtl::OUString impl_getPseudoAggregatePropertyName( sal_Int32 _nHandle ) const;
private:
ParameterWrapper(); // not implemented
};
//====================================================================
//= ParameterWrapperContainer
//====================================================================
typedef ::std::vector< ::rtl::Reference< ParameterWrapper > > Parameters;
//====================================================================
//= ParameterWrapperContainer
//====================================================================
typedef ::cppu::WeakComponentImplHelper2 < ::com::sun::star::container::XIndexAccess
, ::com::sun::star::container::XEnumerationAccess
> ParameterWrapperContainer_Base;
/// class for the parameter event @see approveParameter
class OOO_DLLPUBLIC_DBTOOLS ParameterWrapperContainer :
public ParameterWrapperContainer_Base
{
private:
::osl::Mutex m_aMutex;
Parameters m_aParameters;
protected:
virtual ~ParameterWrapperContainer();
public:
/** creates an empty container
*/
ParameterWrapperContainer();
/** creates a container from a SingleSelectQuerAnalyzer's parameter columns
Note that here, the simple constructor of the ParameterWrapper will be used, which does not
use a XParameters instance to forward values to, but only remembers the values itself.
*/
ParameterWrapperContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryAnalyzer >& _rxComposer );
// ::com::sun::star::container::XElementAccess
virtual ::com::sun::star::uno::Type SAL_CALL getElementType() throw( ::com::sun::star::uno::RuntimeException );
virtual sal_Bool SAL_CALL hasElements() throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::container::XEnumerationAccess
virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration() throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::container::XIndexAccess
virtual sal_Int32 SAL_CALL getCount() throw( ::com::sun::star::uno::RuntimeException );
virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 _rIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException );
public:
const Parameters& getParameters() { return m_aParameters; }
const ::connectivity::ORowSetValue& operator[]( size_t _index ) const { return m_aParameters[ _index ]->Value(); }
::connectivity::ORowSetValue& operator[]( size_t _index ) { return m_aParameters[ _index ]->Value(); }
/** adds an ParameterWrapper to the end of the array
*/
void push_back( ParameterWrapper* _pParameter )
{
m_aParameters.push_back( _pParameter );
}
size_t size() const { return m_aParameters.size(); }
protected:
// XComponent
virtual void SAL_CALL disposing();
private:
void impl_checkDisposed_throw();
};
//====================================================================
//= ParamatersContainer
//====================================================================
typedef ::rtl::Reference< ParameterWrapperContainer > ParametersContainerRef;
//........................................................................
} } // namespace dbtools::param
//........................................................................
#endif // CONNECTIVITY_PARAMWRAPPER_HXX