|  | /************************************************************** | 
|  | * | 
|  | * 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. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_basic.hxx" | 
|  |  | 
|  | #include "propacc.hxx" | 
|  |  | 
|  | #include <tools/urlobj.hxx> | 
|  | #include <tools/errcode.hxx> | 
|  | #include <svl/svarray.hxx> | 
|  | #include <basic/sbstar.hxx> | 
|  | #include <sbunoobj.hxx> | 
|  |  | 
|  | using com::sun::star::uno::Reference; | 
|  | using namespace com::sun::star::uno; | 
|  | using namespace com::sun::star::lang; | 
|  | using namespace com::sun::star::beans; | 
|  | using namespace cppu; | 
|  |  | 
|  |  | 
|  | //======================================================================== | 
|  |  | 
|  | // Declaration conversion from Sbx to UNO with known target type | 
|  | Any sbxToUnoValue( SbxVariable* pVar, const Type& rType, Property* pUnoProperty = NULL ); | 
|  |  | 
|  | //======================================================================== | 
|  |  | 
|  | #ifdef WNT | 
|  | #define CDECL _cdecl | 
|  | #endif | 
|  | #if defined(UNX) || defined(OS2) | 
|  | #define CDECL | 
|  | #endif | 
|  |  | 
|  | int CDECL SbCompare_PropertyValues_Impl( const void *arg1, const void *arg2 ) | 
|  | { | 
|  | return ((PropertyValue*)arg1)->Name.compareTo( ((PropertyValue*)arg2)->Name ); | 
|  | } | 
|  |  | 
|  | extern "C" int CDECL SbCompare_UString_PropertyValue_Impl( const void *arg1, const void *arg2 ) | 
|  | { | 
|  | const ::rtl::OUString *pArg1 = (::rtl::OUString*) arg1; | 
|  | const PropertyValue **pArg2 = (const PropertyValue**) arg2; | 
|  | return pArg1->compareTo( (*pArg2)->Name ); | 
|  | } | 
|  |  | 
|  | int CDECL SbCompare_Properties_Impl( const void *arg1, const void *arg2 ) | 
|  | { | 
|  | return ((Property*)arg1)->Name.compareTo( ((Property*)arg2)->Name ); | 
|  | } | 
|  |  | 
|  | extern "C" int CDECL SbCompare_UString_Property_Impl( const void *arg1, const void *arg2 ) | 
|  | { | 
|  | const ::rtl::OUString *pArg1 = (::rtl::OUString*) arg1; | 
|  | const Property *pArg2 = (Property*) arg2; | 
|  | return pArg1->compareTo( pArg2->Name ); | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | SbPropertyValues::SbPropertyValues() | 
|  | { | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | SbPropertyValues::~SbPropertyValues() | 
|  | { | 
|  | _xInfo = Reference< XPropertySetInfo >(); | 
|  |  | 
|  | for ( sal_uInt16 n = 0; n < _aPropVals.Count(); ++n ) | 
|  | delete _aPropVals.GetObject( n ); | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | Reference< XPropertySetInfo > SbPropertyValues::getPropertySetInfo(void) throw( RuntimeException ) | 
|  | { | 
|  | // create on demand? | 
|  | if ( !_xInfo.is() ) | 
|  | { | 
|  | SbPropertySetInfo *pInfo = new SbPropertySetInfo( _aPropVals ); | 
|  | ((SbPropertyValues*)this)->_xInfo = (XPropertySetInfo*)pInfo; | 
|  | } | 
|  | return _xInfo; | 
|  | } | 
|  |  | 
|  | //------------------------------------------------------------------------- | 
|  |  | 
|  | sal_Int32 SbPropertyValues::GetIndex_Impl( const ::rtl::OUString &rPropName ) const | 
|  | { | 
|  | PropertyValue **ppPV; | 
|  | ppPV = (PropertyValue **) | 
|  | bsearch( &rPropName, _aPropVals.GetData(), _aPropVals.Count(), | 
|  | sizeof( PropertyValue* ), | 
|  | SbCompare_UString_PropertyValue_Impl ); | 
|  | return ppPV ? ( (ppPV-_aPropVals.GetData()) / sizeof(ppPV) ) : USHRT_MAX; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void SbPropertyValues::setPropertyValue( | 
|  | const ::rtl::OUString& aPropertyName, | 
|  | const Any& aValue) | 
|  | throw (::com::sun::star::beans::UnknownPropertyException, | 
|  | ::com::sun::star::beans::PropertyVetoException, | 
|  | ::com::sun::star::lang::IllegalArgumentException, | 
|  | ::com::sun::star::lang::WrappedTargetException, | 
|  | ::com::sun::star::uno::RuntimeException) | 
|  | { | 
|  | sal_Int32 nIndex = GetIndex_Impl( aPropertyName ); | 
|  | PropertyValue *pPropVal = _aPropVals.GetObject( | 
|  | sal::static_int_cast< sal_uInt16 >(nIndex)); | 
|  | pPropVal->Value = aValue; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | Any SbPropertyValues::getPropertyValue( | 
|  | const ::rtl::OUString& aPropertyName) | 
|  | throw(::com::sun::star::beans::UnknownPropertyException, | 
|  | ::com::sun::star::lang::WrappedTargetException, | 
|  | ::com::sun::star::uno::RuntimeException) | 
|  | { | 
|  | sal_Int32 nIndex = GetIndex_Impl( aPropertyName ); | 
|  | if ( nIndex != USHRT_MAX ) | 
|  | return _aPropVals.GetObject( | 
|  | sal::static_int_cast< sal_uInt16 >(nIndex))->Value; | 
|  | return Any(); | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void SbPropertyValues::addPropertyChangeListener( | 
|  | const ::rtl::OUString& aPropertyName, | 
|  | const Reference< XPropertyChangeListener >& ) | 
|  | throw () | 
|  | { | 
|  | (void)aPropertyName; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void SbPropertyValues::removePropertyChangeListener( | 
|  | const ::rtl::OUString& aPropertyName, | 
|  | const Reference< XPropertyChangeListener >& ) | 
|  | throw () | 
|  | { | 
|  | (void)aPropertyName; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void SbPropertyValues::addVetoableChangeListener( | 
|  | const ::rtl::OUString& aPropertyName, | 
|  | const Reference< XVetoableChangeListener >& ) | 
|  | throw() | 
|  | { | 
|  | (void)aPropertyName; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void SbPropertyValues::removeVetoableChangeListener( | 
|  | const ::rtl::OUString& aPropertyName, | 
|  | const Reference< XVetoableChangeListener >& ) | 
|  | throw() | 
|  | { | 
|  | (void)aPropertyName; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | Sequence< PropertyValue > SbPropertyValues::getPropertyValues(void) throw (::com::sun::star::uno::RuntimeException) | 
|  | { | 
|  | Sequence<PropertyValue> aRet( _aPropVals.Count()); | 
|  | for ( sal_uInt16 n = 0; n < _aPropVals.Count(); ++n ) | 
|  | aRet.getArray()[n] = *_aPropVals.GetObject(n); | 
|  | return aRet; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void SbPropertyValues::setPropertyValues(const Sequence< PropertyValue >& rPropertyValues ) | 
|  | throw (::com::sun::star::beans::UnknownPropertyException, | 
|  | ::com::sun::star::beans::PropertyVetoException, | 
|  | ::com::sun::star::lang::IllegalArgumentException, | 
|  | ::com::sun::star::lang::WrappedTargetException, | 
|  | ::com::sun::star::uno::RuntimeException) | 
|  | { | 
|  | if ( _aPropVals.Count() ) | 
|  | throw PropertyExistException(); | 
|  |  | 
|  | const PropertyValue *pPropVals = rPropertyValues.getConstArray(); | 
|  | for ( sal_Int16 n = 0; n < rPropertyValues.getLength(); ++n ) | 
|  | { | 
|  | PropertyValue *pPropVal = new PropertyValue(pPropVals[n]); | 
|  | _aPropVals.Insert( pPropVal, n ); | 
|  | } | 
|  | } | 
|  |  | 
|  | //============================================================================ | 
|  | //PropertySetInfoImpl | 
|  |  | 
|  | PropertySetInfoImpl::PropertySetInfoImpl() | 
|  | { | 
|  | } | 
|  |  | 
|  | sal_Int32 PropertySetInfoImpl::GetIndex_Impl( const ::rtl::OUString &rPropName ) const | 
|  | { | 
|  | Property *pP; | 
|  | pP = (Property*) | 
|  | bsearch( &rPropName, _aProps.getConstArray(), _aProps.getLength(), | 
|  | sizeof( Property ), | 
|  | SbCompare_UString_Property_Impl ); | 
|  | return pP ? sal::static_int_cast<sal_Int32>( (pP-_aProps.getConstArray()) / sizeof(pP) ) : -1; | 
|  | } | 
|  |  | 
|  | Sequence< Property > PropertySetInfoImpl::getProperties(void) throw() | 
|  | { | 
|  | return _aProps; | 
|  | } | 
|  |  | 
|  | Property PropertySetInfoImpl::getPropertyByName(const ::rtl::OUString& Name) throw( RuntimeException ) | 
|  | { | 
|  | sal_Int32 nIndex = GetIndex_Impl( Name ); | 
|  | if( USHRT_MAX != nIndex ) | 
|  | return _aProps.getConstArray()[ nIndex ]; | 
|  | return Property(); | 
|  | } | 
|  |  | 
|  | sal_Bool PropertySetInfoImpl::hasPropertyByName(const ::rtl::OUString& Name) throw( RuntimeException ) | 
|  | { | 
|  | sal_Int32 nIndex = GetIndex_Impl( Name ); | 
|  | return USHRT_MAX != nIndex; | 
|  | } | 
|  |  | 
|  |  | 
|  | //============================================================================ | 
|  |  | 
|  | SbPropertySetInfo::SbPropertySetInfo() | 
|  | { | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | SbPropertySetInfo::SbPropertySetInfo( const SbPropertyValueArr_Impl &rPropVals ) | 
|  | { | 
|  | aImpl._aProps.realloc( rPropVals.Count() ); | 
|  | for ( sal_uInt16 n = 0; n < rPropVals.Count(); ++n ) | 
|  | { | 
|  | Property &rProp = aImpl._aProps.getArray()[n]; | 
|  | const PropertyValue &rPropVal = *rPropVals.GetObject(n); | 
|  | rProp.Name = rPropVal.Name; | 
|  | rProp.Handle = rPropVal.Handle; | 
|  | rProp.Type = getCppuVoidType(); | 
|  | rProp.Attributes = 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | SbPropertySetInfo::~SbPropertySetInfo() | 
|  | { | 
|  | } | 
|  |  | 
|  | //------------------------------------------------------------------------- | 
|  |  | 
|  | Sequence< Property > SbPropertySetInfo::getProperties(void) throw( RuntimeException ) | 
|  | { | 
|  | return aImpl.getProperties(); | 
|  | } | 
|  |  | 
|  | Property SbPropertySetInfo::getPropertyByName(const ::rtl::OUString& Name) | 
|  | throw( RuntimeException ) | 
|  | { | 
|  | return aImpl.getPropertyByName( Name ); | 
|  | } | 
|  |  | 
|  | sal_Bool SbPropertySetInfo::hasPropertyByName(const ::rtl::OUString& Name) | 
|  | throw( RuntimeException ) | 
|  | { | 
|  | return aImpl.hasPropertyByName( Name ); | 
|  | } | 
|  |  | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | SbPropertyContainer::SbPropertyContainer() | 
|  | { | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | SbPropertyContainer::~SbPropertyContainer() | 
|  | { | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | void SbPropertyContainer::addProperty(const ::rtl::OUString& Name, | 
|  | sal_Int16 Attributes, | 
|  | const Any& DefaultValue) | 
|  | throw(  PropertyExistException, IllegalTypeException, | 
|  | IllegalArgumentException, RuntimeException ) | 
|  | { | 
|  | (void)Name; | 
|  | (void)Attributes; | 
|  | (void)DefaultValue; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | void SbPropertyContainer::removeProperty(const ::rtl::OUString& Name) | 
|  | throw( UnknownPropertyException, RuntimeException ) | 
|  | { | 
|  | (void)Name; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | // XPropertySetInfo | 
|  | Sequence< Property > SbPropertyContainer::getProperties(void) throw () | 
|  | { | 
|  | return aImpl.getProperties(); | 
|  | } | 
|  |  | 
|  | Property SbPropertyContainer::getPropertyByName(const ::rtl::OUString& Name) | 
|  | throw( RuntimeException ) | 
|  | { | 
|  | return aImpl.getPropertyByName( Name ); | 
|  | } | 
|  |  | 
|  | sal_Bool SbPropertyContainer::hasPropertyByName(const ::rtl::OUString& Name) | 
|  | throw( RuntimeException ) | 
|  | { | 
|  | return aImpl.hasPropertyByName( Name ); | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | Sequence< PropertyValue > SbPropertyContainer::getPropertyValues(void) | 
|  | { | 
|  | return Sequence<PropertyValue>(); | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void SbPropertyContainer::setPropertyValues(const Sequence< PropertyValue >& PropertyValues_) | 
|  | { | 
|  | (void)PropertyValues_; | 
|  | } | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  |  | 
|  | void RTL_Impl_CreatePropertySet( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ) | 
|  | { | 
|  | (void)pBasic; | 
|  | (void)bWrite; | 
|  |  | 
|  | // We need at least one parameter | 
|  | // TODO: In this case < 2 is not correct ;-) | 
|  | if ( rPar.Count() < 2 ) | 
|  | { | 
|  | StarBASIC::Error( SbERR_BAD_ARGUMENT ); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Get class names of struct | 
|  | String aServiceName( RTL_CONSTASCII_USTRINGPARAM("stardiv.uno.beans.PropertySet") ); | 
|  |  | 
|  | #if 0 | 
|  | // Service suchen und instanzieren | 
|  | Reference< XMultiServiceFactory > xServiceManager = getProcessServiceFactory(); | 
|  | Reference< XInterface > xInterface; | 
|  | if( xProv.is() ) | 
|  | xInterface = xProv->newInstance(); | 
|  | #else | 
|  | Reference< XInterface > xInterface = (OWeakObject*) new SbPropertyValues(); | 
|  | #endif | 
|  |  | 
|  | SbxVariableRef refVar = rPar.Get(0); | 
|  | if( xInterface.is() ) | 
|  | { | 
|  | // Set PropertyValues | 
|  | Any aArgAsAny = sbxToUnoValue( rPar.Get(1), | 
|  | getCppuType( (Sequence<PropertyValue>*)0 ) ); | 
|  | Sequence<PropertyValue> *pArg = | 
|  | (Sequence<PropertyValue>*) aArgAsAny.getValue(); | 
|  | Reference< XPropertyAccess > xPropAcc = Reference< XPropertyAccess >::query( xInterface ); | 
|  | xPropAcc->setPropertyValues( *pArg ); | 
|  |  | 
|  | // Build a SbUnoObject and return it | 
|  | Any aAny; | 
|  | aAny <<= xInterface; | 
|  | SbUnoObjectRef xUnoObj = new SbUnoObject( aServiceName, aAny ); | 
|  | if( xUnoObj->getUnoAny().getValueType().getTypeClass() != TypeClass_VOID ) | 
|  | { | 
|  | // Return object | 
|  | refVar->PutObject( (SbUnoObject*)xUnoObj ); | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Object could not be created | 
|  | refVar->PutObject( NULL ); | 
|  | } | 
|  |  |