2001-04-11 11:37:54 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* $RCSfile: dataaccessdescriptor.cxx,v $
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* $Revision: 1.13 $
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* last change: $Author: rt $ $Date: 2005-09-08 22:48:30 $
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* The Contents of this file are made available subject to
|
|
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* 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.
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* 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.
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
2005-09-08 21:48:30 +00:00
|
|
|
* 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
|
2001-04-11 11:37:54 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifndef _SVX_DATACCESSDESCRIPTOR_HXX_
|
|
|
|
#include "dataaccessdescriptor.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _COMPHELPER_STLTYPES_HXX_
|
|
|
|
#include <comphelper/stl_types.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _COMPHELPER_PROPERTSETINFO_HXX_
|
|
|
|
#include <comphelper/propertysetinfo.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _COMPHELPER_GENERICPROPERTYSET_HXX_
|
|
|
|
#include <comphelper/genericpropertyset.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _OSL_DIAGNOSE_H_
|
|
|
|
#include <osl/diagnose.h>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBC_XCONNECTION_HPP_
|
|
|
|
#include <com/sun/star/sdbc/XConnection.hpp>
|
|
|
|
#endif
|
2004-08-02 15:44:28 +00:00
|
|
|
#ifndef _COM_SUN_STAR_UCB_XCONTENT_HPP_
|
|
|
|
#include <com/sun/star/ucb/XContent.hpp>
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
|
|
|
|
#include <com/sun/star/beans/PropertyAttribute.hpp>
|
|
|
|
#endif
|
2004-08-02 15:44:28 +00:00
|
|
|
#ifndef _URLOBJ_HXX
|
|
|
|
#include <tools/urlobj.hxx>
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
|
|
|
|
//........................................................................
|
|
|
|
namespace svx
|
|
|
|
{
|
|
|
|
//........................................................................
|
|
|
|
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace ::com::sun::star::sdbc;
|
|
|
|
using namespace ::com::sun::star::beans;
|
2004-08-02 15:44:28 +00:00
|
|
|
using namespace ::com::sun::star::ucb;
|
2001-04-11 11:37:54 +00:00
|
|
|
using namespace ::comphelper;
|
|
|
|
|
|
|
|
//====================================================================
|
|
|
|
//=
|
|
|
|
//====================================================================
|
|
|
|
#define CONST_CHAR( propname ) propname, sizeof(propname) - 1
|
|
|
|
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
//====================================================================
|
|
|
|
//= ODADescriptorImpl
|
|
|
|
//====================================================================
|
|
|
|
class ODADescriptorImpl
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
sal_Bool m_bSetOutOfDate : 1;
|
|
|
|
sal_Bool m_bSequenceOutOfDate : 1;
|
|
|
|
|
|
|
|
public:
|
|
|
|
DECLARE_STL_STDKEY_MAP( DataAccessDescriptorProperty, Any, DescriptorValues );
|
|
|
|
DescriptorValues m_aValues;
|
|
|
|
Sequence< PropertyValue > m_aAsSequence;
|
|
|
|
Reference< XPropertySet > m_xAsSet;
|
|
|
|
|
|
|
|
public:
|
|
|
|
ODADescriptorImpl();
|
|
|
|
ODADescriptorImpl(const ODADescriptorImpl& _rSource);
|
|
|
|
|
|
|
|
void invalidateExternRepresentations();
|
|
|
|
|
|
|
|
void updateSequence();
|
|
|
|
void updateSet();
|
|
|
|
|
|
|
|
/** builds the descriptor from a property value sequence
|
|
|
|
@return <TRUE/>
|
|
|
|
if and only if the sequence contained valid properties only
|
|
|
|
*/
|
|
|
|
sal_Bool buildFrom( const Sequence< PropertyValue >& _rValues );
|
|
|
|
|
|
|
|
/** builds the descriptor from a property set
|
|
|
|
@return <TRUE/>
|
|
|
|
if and only if the set contained valid properties only
|
|
|
|
*/
|
|
|
|
sal_Bool buildFrom( const Reference< XPropertySet >& _rValues );
|
|
|
|
|
|
|
|
protected:
|
|
|
|
PropertyValue buildPropertyValue( const ConstDescriptorValuesIterator& _rPos );
|
|
|
|
PropertyMapEntry* getPropertyMap( ) const;
|
|
|
|
PropertyMapEntry* getPropertyMapEntry( const ConstDescriptorValuesIterator& _rPos ) const;
|
|
|
|
};
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODADescriptorImpl::ODADescriptorImpl()
|
|
|
|
:m_bSetOutOfDate(sal_True)
|
|
|
|
,m_bSequenceOutOfDate(sal_True)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODADescriptorImpl::ODADescriptorImpl(const ODADescriptorImpl& _rSource)
|
|
|
|
:m_aValues( _rSource.m_aValues )
|
|
|
|
,m_bSetOutOfDate( _rSource.m_bSetOutOfDate )
|
|
|
|
,m_bSequenceOutOfDate( _rSource.m_bSequenceOutOfDate )
|
|
|
|
{
|
|
|
|
if (!m_bSetOutOfDate)
|
|
|
|
m_xAsSet = _rSource.m_xAsSet;
|
|
|
|
if (!m_bSequenceOutOfDate)
|
|
|
|
m_aAsSequence = _rSource.m_aAsSequence;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
// Vergleichen von Strings
|
|
|
|
static int
|
|
|
|
#if defined( WNT )
|
|
|
|
__cdecl
|
|
|
|
#endif
|
|
|
|
#if defined( ICC ) && defined( OS2 )
|
|
|
|
_Optlink
|
|
|
|
#endif
|
|
|
|
PropertySearch(const void* pFirst, const void* pSecond)
|
|
|
|
{
|
|
|
|
return static_cast<const PropertyValue*>(pFirst)->Name.compareToAscii(
|
|
|
|
static_cast<const PropertyMapEntry*>(pSecond)->mpName);
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
sal_Bool ODADescriptorImpl::buildFrom( const Sequence< PropertyValue >& _rValues )
|
|
|
|
{
|
|
|
|
PropertyMapEntry* pPropertyMap = getPropertyMap();
|
|
|
|
// determine the size of the map
|
|
|
|
sal_Int32 nMapSize = 0;
|
|
|
|
PropertyMapEntry* pMapLoop = pPropertyMap;
|
|
|
|
while (pMapLoop->mpName)
|
|
|
|
{
|
|
|
|
++nMapSize; ++pMapLoop;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Bool bValidPropsOnly = sal_True;
|
|
|
|
|
|
|
|
// loop through the sequence, and fill our m_aValues
|
|
|
|
const PropertyValue* pValues = _rValues.getConstArray();
|
|
|
|
const PropertyValue* pValuesEnd = pValues + _rValues.getLength();
|
|
|
|
for (;pValues != pValuesEnd; ++pValues)
|
|
|
|
{
|
|
|
|
PropertyMapEntry* pPropPos = static_cast<PropertyMapEntry*>(bsearch(pValues, pPropertyMap, nMapSize, sizeof(*pPropertyMap), PropertySearch));
|
|
|
|
if (pPropPos)
|
|
|
|
{
|
|
|
|
DataAccessDescriptorProperty eProperty = (DataAccessDescriptorProperty)pPropPos->mnHandle;
|
|
|
|
m_aValues[eProperty] = pValues->Value;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
// unknown property
|
|
|
|
bValidPropsOnly = sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bValidPropsOnly)
|
|
|
|
{
|
|
|
|
m_aAsSequence = _rValues;
|
|
|
|
m_bSequenceOutOfDate = sal_False;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m_bSequenceOutOfDate = sal_True;
|
|
|
|
|
|
|
|
return bValidPropsOnly;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
sal_Bool ODADescriptorImpl::buildFrom( const Reference< XPropertySet >& _rxValues )
|
|
|
|
{
|
|
|
|
Reference< XPropertySetInfo > xPropInfo;
|
|
|
|
if (_rxValues.is())
|
|
|
|
xPropInfo = _rxValues->getPropertySetInfo();
|
|
|
|
if (!xPropInfo.is())
|
|
|
|
{
|
|
|
|
OSL_ENSURE(sal_False, "ODADescriptorImpl::buildFrom: invalid property set!");
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
// build a PropertyValue sequence with the current values
|
|
|
|
Sequence< Property > aProperties = xPropInfo->getProperties();
|
|
|
|
const Property* pProperty = aProperties.getConstArray();
|
|
|
|
const Property* pPropertyEnd = pProperty + aProperties.getLength();
|
|
|
|
|
|
|
|
Sequence< PropertyValue > aValues(aProperties.getLength());
|
|
|
|
PropertyValue* pValues = aValues.getArray();
|
|
|
|
|
|
|
|
for (;pProperty != pPropertyEnd; ++pProperty, ++pValues)
|
|
|
|
{
|
|
|
|
pValues->Name = pProperty->Name;
|
|
|
|
pValues->Value = _rxValues->getPropertyValue(pProperty->Name);
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Bool bValidPropsOnly = buildFrom(aValues);
|
|
|
|
if (bValidPropsOnly)
|
|
|
|
{
|
|
|
|
m_xAsSet = _rxValues;
|
|
|
|
m_bSetOutOfDate = sal_False;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m_bSetOutOfDate = sal_True;
|
|
|
|
|
|
|
|
return bValidPropsOnly;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODADescriptorImpl::invalidateExternRepresentations()
|
|
|
|
{
|
|
|
|
m_bSetOutOfDate = sal_True;
|
|
|
|
m_bSequenceOutOfDate = sal_True;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
PropertyMapEntry* ODADescriptorImpl::getPropertyMap( ) const
|
|
|
|
{
|
|
|
|
// the properties we know
|
|
|
|
static PropertyMapEntry s_aDesriptorProperties[] =
|
|
|
|
{
|
2004-08-02 15:44:28 +00:00
|
|
|
{ CONST_CHAR("ActiveConnection"), daConnection, &::getCppuType( static_cast< Reference< XConnection >* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("BookmarkSelection"), daBookmarkSelection, &::getBooleanCppuType( ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("Column"), daColumnObject, &::getCppuType( static_cast< Reference< XPropertySet >* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("ColumnName"), daColumnName, &::getCppuType( static_cast< ::rtl::OUString* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("Command"), daCommand, &::getCppuType( static_cast< ::rtl::OUString* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("CommandType"), daCommandType, &::getCppuType( static_cast< sal_Int32* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("Component"), daComponent, &::getCppuType( static_cast< Reference< XContent >* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("ConnectionResource"), daConnectionResource, &::getCppuType( static_cast< ::rtl::OUString* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("Cursor"), daCursor, &::getCppuType( static_cast< Reference< XResultSet>* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("DataSourceName"), daDataSource, &::getCppuType( static_cast< ::rtl::OUString* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("DatabaseLocation"), daDatabaseLocation, &::getCppuType( static_cast< ::rtl::OUString* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("EscapeProcessing"), daEscapeProcessing, &::getBooleanCppuType( ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("Filter"), daFilter, &::getCppuType( static_cast< ::rtl::OUString* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
|
|
|
{ CONST_CHAR("Selection"), daSelection, &::getCppuType( static_cast< Sequence< Any >* >(NULL) ), PropertyAttribute::TRANSIENT, 0 },
|
2001-04-11 11:37:54 +00:00
|
|
|
{ NULL, 0, 0, NULL, 0, 0 }
|
|
|
|
};
|
|
|
|
// MUST be sorted !!
|
|
|
|
|
2003-04-15 16:31:01 +00:00
|
|
|
#if OSL_DEBUG_LEVEL > 0
|
2001-04-11 11:37:54 +00:00
|
|
|
PropertyMapEntry* pLoop = s_aDesriptorProperties;
|
|
|
|
if (pLoop->mpName)
|
|
|
|
{
|
|
|
|
::rtl::OUString sLeft = ::rtl::OUString::createFromAscii(pLoop->mpName);
|
|
|
|
::rtl::OUString sRight;
|
|
|
|
while ((++pLoop)->mpName)
|
|
|
|
{
|
|
|
|
sRight = ::rtl::OUString::createFromAscii(pLoop->mpName);
|
|
|
|
OSL_ENSURE(sLeft < sRight, "ODADescriptorImpl::getPropertyMap: property map not sorted!");
|
|
|
|
sLeft = sRight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return s_aDesriptorProperties;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
PropertyMapEntry* ODADescriptorImpl::getPropertyMapEntry( const ConstDescriptorValuesIterator& _rPos ) const
|
|
|
|
{
|
|
|
|
PropertyMapEntry* pMap = getPropertyMap();
|
|
|
|
|
|
|
|
// the index in the map above (depends on the property requested)
|
|
|
|
sal_Int32 nNeededHandle = (sal_Int32)(_rPos->first);
|
|
|
|
|
|
|
|
PropertyMapEntry* pSearchHandle = pMap;
|
|
|
|
while (pSearchHandle->mpName)
|
|
|
|
{
|
|
|
|
if (nNeededHandle == pSearchHandle->mnHandle)
|
|
|
|
return pSearchHandle;
|
|
|
|
|
|
|
|
++pSearchHandle;
|
|
|
|
}
|
|
|
|
OSL_ENSURE(sal_False, "ODADescriptorImpl::getPropertyMapEntry: could not find the property!");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
PropertyValue ODADescriptorImpl::buildPropertyValue( const ConstDescriptorValuesIterator& _rPos )
|
|
|
|
{
|
|
|
|
// the map entry
|
|
|
|
PropertyMapEntry* pProp = getPropertyMapEntry(_rPos);
|
|
|
|
|
|
|
|
// build the property value
|
|
|
|
PropertyValue aReturn;
|
|
|
|
aReturn.Name = ::rtl::OUString::createFromAscii(pProp->mpName);
|
|
|
|
aReturn.Handle = pProp->mnHandle;
|
|
|
|
aReturn.Value = _rPos->second;
|
|
|
|
aReturn.State = PropertyState_DIRECT_VALUE;
|
|
|
|
|
2003-04-15 16:31:01 +00:00
|
|
|
#if OSL_DEBUG_LEVEL > 0
|
2001-04-11 11:37:54 +00:00
|
|
|
// check for type consistency
|
|
|
|
if (TypeClass_INTERFACE == pProp->mpType->getTypeClass())
|
|
|
|
{
|
|
|
|
Reference< XInterface > xCurrentValue;
|
|
|
|
_rPos->second >>= xCurrentValue;
|
|
|
|
Any aRequestedIFace;
|
|
|
|
if (xCurrentValue.is())
|
|
|
|
aRequestedIFace = xCurrentValue->queryInterface(*pProp->mpType);
|
|
|
|
OSL_ENSURE(aRequestedIFace.hasValue(), "ODADescriptorImpl::buildPropertyValue: invalid property value type (missing the requested interface)!");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
OSL_ENSURE(pProp->mpType->equals(_rPos->second.getValueType()), "ODADescriptorImpl::buildPropertyValue: invalid property value type!");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// outta here
|
|
|
|
return aReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODADescriptorImpl::updateSequence()
|
|
|
|
{
|
|
|
|
if (!m_bSequenceOutOfDate)
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_aAsSequence.realloc(m_aValues.size());
|
|
|
|
PropertyValue* pValue = m_aAsSequence.getArray();
|
|
|
|
|
|
|
|
// loop through all our values
|
|
|
|
for ( ConstDescriptorValuesIterator aLoop = m_aValues.begin();
|
|
|
|
aLoop != m_aValues.end();
|
|
|
|
++aLoop, ++pValue
|
|
|
|
)
|
|
|
|
{
|
|
|
|
*pValue = buildPropertyValue(aLoop);
|
|
|
|
}
|
|
|
|
|
|
|
|
// don't need to rebuild next time
|
|
|
|
m_bSequenceOutOfDate = sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODADescriptorImpl::updateSet()
|
|
|
|
{
|
|
|
|
if (!m_bSetOutOfDate)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// will be the current values
|
|
|
|
Sequence< PropertyValue > aValuesToSet(m_aValues.size());
|
|
|
|
PropertyValue* pValuesToSet = aValuesToSet.getArray();
|
|
|
|
|
|
|
|
// build a new property set info
|
|
|
|
PropertySetInfo* pPropSetInfo = new PropertySetInfo;
|
|
|
|
|
|
|
|
// loop through all our values
|
|
|
|
for ( ConstDescriptorValuesIterator aLoop = m_aValues.begin();
|
|
|
|
aLoop != m_aValues.end();
|
|
|
|
++aLoop, ++pValuesToSet
|
|
|
|
)
|
|
|
|
{
|
|
|
|
PropertyMapEntry* pMapEntry = getPropertyMapEntry(aLoop);
|
|
|
|
pPropSetInfo->add( pMapEntry, 1 );
|
|
|
|
|
|
|
|
*pValuesToSet = buildPropertyValue(aLoop);
|
|
|
|
}
|
|
|
|
|
|
|
|
// create the generic set
|
|
|
|
m_xAsSet = GenericPropertySet_CreateInstance( pPropSetInfo );
|
|
|
|
|
|
|
|
// no we have the set, still need to set the current values
|
|
|
|
const PropertyValue* pSetValues = aValuesToSet.getConstArray();
|
|
|
|
const PropertyValue* pSetValuesEnd = pSetValues + aValuesToSet.getLength();
|
|
|
|
for (; pSetValues != pSetValuesEnd; ++pSetValues)
|
|
|
|
m_xAsSet->setPropertyValue(pSetValues->Name, pSetValues->Value);
|
|
|
|
|
|
|
|
// don't need to rebuild next time
|
|
|
|
m_bSetOutOfDate = sal_True;
|
|
|
|
}
|
2001-04-20 15:14:36 +00:00
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
|
|
|
|
//====================================================================
|
|
|
|
//= ODataAccessDescriptor
|
|
|
|
//====================================================================
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODataAccessDescriptor::ODataAccessDescriptor()
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
:m_pImpl(new ODADescriptorImpl)
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
:m_pImpl(NULL)
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODataAccessDescriptor::ODataAccessDescriptor( const ODataAccessDescriptor& _rSource )
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
:m_pImpl(new ODADescriptorImpl(*_rSource.m_pImpl))
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
:m_pImpl(NULL)
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2001-04-18 09:42:37 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
const ODataAccessDescriptor& ODataAccessDescriptor::operator=(const ODataAccessDescriptor& _rSource)
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-18 09:42:37 +00:00
|
|
|
delete m_pImpl;
|
|
|
|
m_pImpl = new ODADescriptorImpl(*_rSource.m_pImpl);
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
OSL_ENSURE(sal_False, "ODataAccessDescriptor::operator=: not available in the SVX_LIGHT version!");
|
|
|
|
#endif
|
2001-04-18 09:42:37 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2001-04-11 11:37:54 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODataAccessDescriptor::ODataAccessDescriptor( const Reference< XPropertySet >& _rValues )
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
:m_pImpl(new ODADescriptorImpl)
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
:m_pImpl(NULL)
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
m_pImpl->buildFrom(_rValues);
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
OSL_ENSURE(sal_False, "ODataAccessDescriptor::ODataAccessDescriptor: not available in the SVX_LIGHT version!");
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
2002-05-06 09:35:21 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODataAccessDescriptor::ODataAccessDescriptor( const Any& _rValues )
|
|
|
|
#ifndef SVX_LIGHT
|
|
|
|
:m_pImpl(new ODADescriptorImpl)
|
|
|
|
#else
|
|
|
|
:m_pImpl(NULL)
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
#ifndef SVX_LIGHT
|
|
|
|
// check if we know the format in the Any
|
|
|
|
Sequence< PropertyValue > aValues;
|
|
|
|
Reference< XPropertySet > xValues;
|
|
|
|
if ( _rValues >>= aValues )
|
|
|
|
m_pImpl->buildFrom( aValues );
|
|
|
|
else if ( _rValues >>= xValues )
|
|
|
|
m_pImpl->buildFrom( xValues );
|
|
|
|
#else
|
|
|
|
OSL_ENSURE(sal_False, "ODataAccessDescriptor::ODataAccessDescriptor: not available in the SVX_LIGHT version!");
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2001-04-11 11:37:54 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODataAccessDescriptor::ODataAccessDescriptor( const Sequence< PropertyValue >& _rValues )
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
:m_pImpl(new ODADescriptorImpl)
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
:m_pImpl(NULL)
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
m_pImpl->buildFrom(_rValues);
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
OSL_ENSURE(sal_False, "ODataAccessDescriptor::ODataAccessDescriptor: not available in the SVX_LIGHT version!");
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
ODataAccessDescriptor::~ODataAccessDescriptor()
|
|
|
|
{
|
|
|
|
delete m_pImpl;
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODataAccessDescriptor::clear()
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
m_pImpl->m_aValues.clear();
|
2001-04-20 15:14:36 +00:00
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODataAccessDescriptor::erase(DataAccessDescriptorProperty _eWhich)
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
OSL_ENSURE(has(_eWhich), "ODataAccessDescriptor::erase: invalid call!");
|
|
|
|
if (has(_eWhich))
|
|
|
|
m_pImpl->m_aValues.erase(_eWhich);
|
2001-04-20 15:14:36 +00:00
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
sal_Bool ODataAccessDescriptor::has(DataAccessDescriptorProperty _eWhich) const
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
return m_pImpl->m_aValues.find(_eWhich) != m_pImpl->m_aValues.end();
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
return sal_False;
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
const Any& ODataAccessDescriptor::operator [] ( DataAccessDescriptorProperty _eWhich ) const
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
if (!has(_eWhich))
|
|
|
|
{
|
|
|
|
OSL_ENSURE(sal_False, "ODataAccessDescriptor::operator[]: invalid acessor!");
|
|
|
|
static const Any aDummy;
|
|
|
|
return aDummy;
|
|
|
|
}
|
|
|
|
|
|
|
|
return m_pImpl->m_aValues[_eWhich];
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
static const Any aDummy;
|
|
|
|
return aDummy;
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
Any& ODataAccessDescriptor::operator[] ( DataAccessDescriptorProperty _eWhich )
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
m_pImpl->invalidateExternRepresentations();
|
|
|
|
return m_pImpl->m_aValues[_eWhich];
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
static const Any aDummy;
|
|
|
|
return aDummy;
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
2001-06-25 07:45:37 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODataAccessDescriptor::initializeFrom(const Reference< XPropertySet >& _rxValues, sal_Bool _bClear)
|
|
|
|
{
|
|
|
|
#ifndef SVX_LIGHT
|
|
|
|
if (_bClear)
|
|
|
|
clear();
|
|
|
|
m_pImpl->buildFrom(_rxValues);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODataAccessDescriptor::initializeFrom(const Sequence< PropertyValue >& _rValues, sal_Bool _bClear)
|
|
|
|
{
|
|
|
|
#ifndef SVX_LIGHT
|
|
|
|
if (_bClear)
|
|
|
|
clear();
|
|
|
|
m_pImpl->buildFrom(_rValues);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2001-04-11 11:37:54 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
Sequence< PropertyValue > ODataAccessDescriptor::createPropertyValueSequence()
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
m_pImpl->updateSequence();
|
|
|
|
return m_pImpl->m_aAsSequence;
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
return Sequence< PropertyValue >();
|
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
2002-07-18 07:38:49 +00:00
|
|
|
//--------------------------------------------------------------------
|
|
|
|
Sequence< Any > ODataAccessDescriptor::createAnySequence()
|
|
|
|
{
|
|
|
|
#ifndef SVX_LIGHT
|
|
|
|
m_pImpl->updateSequence();
|
|
|
|
Sequence< Any > aRet(m_pImpl->m_aAsSequence.getLength());
|
|
|
|
const PropertyValue* pBegin = m_pImpl->m_aAsSequence.getConstArray();
|
|
|
|
const PropertyValue* pEnd = pBegin + m_pImpl->m_aAsSequence.getLength();
|
|
|
|
for(sal_Int32 i=0;pBegin != pEnd;++pBegin,++i)
|
|
|
|
aRet[i] <<= *pBegin;
|
|
|
|
return aRet;
|
|
|
|
#else
|
|
|
|
return Sequence< createAnySequence >();
|
|
|
|
#endif
|
|
|
|
}
|
2001-04-11 11:37:54 +00:00
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
Reference< XPropertySet > ODataAccessDescriptor::createPropertySet()
|
|
|
|
{
|
2001-04-20 15:14:36 +00:00
|
|
|
#ifndef SVX_LIGHT
|
2001-04-11 11:37:54 +00:00
|
|
|
m_pImpl->updateSet();
|
|
|
|
return m_pImpl->m_xAsSet;
|
2001-04-20 15:14:36 +00:00
|
|
|
#else
|
|
|
|
return Reference< XPropertySet >();
|
2004-08-02 15:44:28 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
::rtl::OUString ODataAccessDescriptor::getDataSource() const
|
|
|
|
{
|
|
|
|
#ifndef SVX_LIGHT
|
|
|
|
::rtl::OUString sDataSourceName;
|
|
|
|
if ( has(daDataSource) )
|
|
|
|
(*this)[daDataSource] >>= sDataSourceName;
|
|
|
|
else if ( has(daDatabaseLocation) )
|
|
|
|
(*this)[daDatabaseLocation] >>= sDataSourceName;
|
|
|
|
return sDataSourceName;
|
|
|
|
#else
|
|
|
|
return ::rtl::OUString();
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
void ODataAccessDescriptor::setDataSource(const ::rtl::OUString& _sDataSourceNameOrLocation)
|
|
|
|
{
|
|
|
|
#ifndef SVX_LIGHT
|
|
|
|
if ( _sDataSourceNameOrLocation.getLength() )
|
|
|
|
{
|
|
|
|
INetURLObject aURL(_sDataSourceNameOrLocation);
|
|
|
|
(*this)[ (( aURL.GetProtocol() == INET_PROT_FILE ) ? daDatabaseLocation : daDataSource)] <<= _sDataSourceNameOrLocation;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
(*this)[ daDataSource ] <<= ::rtl::OUString();
|
2001-04-20 15:14:36 +00:00
|
|
|
#endif
|
2001-04-11 11:37:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//........................................................................
|
|
|
|
} // namespace svx
|
|
|
|
//........................................................................
|
|
|
|
|
|
|
|
|