xref: /aoo4110/main/basic/source/classes/propacc.cxx (revision b1cdbd2c)
1  /**************************************************************
2   *
3   * Licensed to the Apache Software Foundation (ASF) under one
4   * or more contributor license agreements.  See the NOTICE file
5   * distributed with this work for additional information
6   * regarding copyright ownership.  The ASF licenses this file
7   * to you under the Apache License, Version 2.0 (the
8   * "License"); you may not use this file except in compliance
9   * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   *
20   *************************************************************/
21  
22  
23  
24  // MARKER(update_precomp.py): autogen include statement, do not remove
25  #include "precompiled_basic.hxx"
26  
27  #include "propacc.hxx"
28  
29  #include <tools/urlobj.hxx>
30  #include <tools/errcode.hxx>
31  #include <svl/svarray.hxx>
32  #include <basic/sbstar.hxx>
33  #include <sbunoobj.hxx>
34  
35  using com::sun::star::uno::Reference;
36  using namespace com::sun::star::uno;
37  using namespace com::sun::star::lang;
38  using namespace com::sun::star::beans;
39  using namespace cppu;
40  
41  
42  //========================================================================
43  
44  // Declaration conversion from Sbx to UNO with known target type
45  Any sbxToUnoValue( SbxVariable* pVar, const Type& rType, Property* pUnoProperty = NULL );
46  
47  //========================================================================
48  
49  #ifdef WNT
50  #define CDECL _cdecl
51  #endif
52  #if defined(UNX) || defined(OS2)
53  #define CDECL
54  #endif
55  
SbCompare_PropertyValues_Impl(const void * arg1,const void * arg2)56  int CDECL SbCompare_PropertyValues_Impl( const void *arg1, const void *arg2 )
57  {
58     return ((PropertyValue*)arg1)->Name.compareTo( ((PropertyValue*)arg2)->Name );
59  }
60  
SbCompare_UString_PropertyValue_Impl(const void * arg1,const void * arg2)61  extern "C" int CDECL SbCompare_UString_PropertyValue_Impl( const void *arg1, const void *arg2 )
62  {
63  	const ::rtl::OUString *pArg1 = (::rtl::OUString*) arg1;
64  	const PropertyValue **pArg2 = (const PropertyValue**) arg2;
65  	return pArg1->compareTo( (*pArg2)->Name );
66  }
67  
SbCompare_Properties_Impl(const void * arg1,const void * arg2)68  int CDECL SbCompare_Properties_Impl( const void *arg1, const void *arg2 )
69  {
70     return ((Property*)arg1)->Name.compareTo( ((Property*)arg2)->Name );
71  }
72  
SbCompare_UString_Property_Impl(const void * arg1,const void * arg2)73  extern "C" int CDECL SbCompare_UString_Property_Impl( const void *arg1, const void *arg2 )
74  {
75  	const ::rtl::OUString *pArg1 = (::rtl::OUString*) arg1;
76  	const Property *pArg2 = (Property*) arg2;
77  	return pArg1->compareTo( pArg2->Name );
78  }
79  
80  //----------------------------------------------------------------------------
81  
SbPropertyValues()82  SbPropertyValues::SbPropertyValues()
83  {
84  }
85  
86  //----------------------------------------------------------------------------
87  
~SbPropertyValues()88  SbPropertyValues::~SbPropertyValues()
89  {
90  	_xInfo = Reference< XPropertySetInfo >();
91  
92  	for ( sal_uInt16 n = 0; n < _aPropVals.Count(); ++n )
93  		delete _aPropVals.GetObject( n );
94  }
95  
96  //----------------------------------------------------------------------------
97  
getPropertySetInfo(void)98  Reference< XPropertySetInfo > SbPropertyValues::getPropertySetInfo(void) throw( RuntimeException )
99  {
100  	// create on demand?
101  	if ( !_xInfo.is() )
102  	{
103  		SbPropertySetInfo *pInfo = new SbPropertySetInfo( _aPropVals );
104  		((SbPropertyValues*)this)->_xInfo = (XPropertySetInfo*)pInfo;
105  	}
106  	return _xInfo;
107  }
108  
109  //-------------------------------------------------------------------------
110  
GetIndex_Impl(const::rtl::OUString & rPropName) const111  sal_Int32 SbPropertyValues::GetIndex_Impl( const ::rtl::OUString &rPropName ) const
112  {
113  	PropertyValue **ppPV;
114  	ppPV = (PropertyValue **)
115  			bsearch( &rPropName, _aPropVals.GetData(), _aPropVals.Count(),
116  					  sizeof( PropertyValue* ),
117  					  SbCompare_UString_PropertyValue_Impl );
118  	return ppPV ? ( (ppPV-_aPropVals.GetData()) / sizeof(ppPV) ) : USHRT_MAX;
119  }
120  
121  //----------------------------------------------------------------------------
122  
setPropertyValue(const::rtl::OUString & aPropertyName,const Any & aValue)123  void SbPropertyValues::setPropertyValue(
124  					const ::rtl::OUString& aPropertyName,
125  					const Any& aValue)
126                      throw (::com::sun::star::beans::UnknownPropertyException,
127                      ::com::sun::star::beans::PropertyVetoException,
128                      ::com::sun::star::lang::IllegalArgumentException,
129                      ::com::sun::star::lang::WrappedTargetException,
130                      ::com::sun::star::uno::RuntimeException)
131  {
132  	sal_Int32 nIndex = GetIndex_Impl( aPropertyName );
133  	PropertyValue *pPropVal = _aPropVals.GetObject(
134          sal::static_int_cast< sal_uInt16 >(nIndex));
135  	pPropVal->Value = aValue;
136  }
137  
138  //----------------------------------------------------------------------------
139  
getPropertyValue(const::rtl::OUString & aPropertyName)140  Any SbPropertyValues::getPropertyValue(
141  					const ::rtl::OUString& aPropertyName)
142  		            throw(::com::sun::star::beans::UnknownPropertyException,
143      				::com::sun::star::lang::WrappedTargetException,
144  	    			::com::sun::star::uno::RuntimeException)
145  {
146  	sal_Int32 nIndex = GetIndex_Impl( aPropertyName );
147  	if ( nIndex != USHRT_MAX )
148  		return _aPropVals.GetObject(
149              sal::static_int_cast< sal_uInt16 >(nIndex))->Value;
150  	return Any();
151  }
152  
153  //----------------------------------------------------------------------------
154  
addPropertyChangeListener(const::rtl::OUString & aPropertyName,const Reference<XPropertyChangeListener> &)155  void SbPropertyValues::addPropertyChangeListener(
156  					const ::rtl::OUString& aPropertyName,
157  					const Reference< XPropertyChangeListener >& )
158                      throw ()
159  {
160      (void)aPropertyName;
161  }
162  
163  //----------------------------------------------------------------------------
164  
removePropertyChangeListener(const::rtl::OUString & aPropertyName,const Reference<XPropertyChangeListener> &)165  void SbPropertyValues::removePropertyChangeListener(
166  					const ::rtl::OUString& aPropertyName,
167  					const Reference< XPropertyChangeListener >& )
168                      throw ()
169  {
170      (void)aPropertyName;
171  }
172  
173  //----------------------------------------------------------------------------
174  
addVetoableChangeListener(const::rtl::OUString & aPropertyName,const Reference<XVetoableChangeListener> &)175  void SbPropertyValues::addVetoableChangeListener(
176  					const ::rtl::OUString& aPropertyName,
177  					const Reference< XVetoableChangeListener >& )
178                      throw()
179  {
180      (void)aPropertyName;
181  }
182  
183  //----------------------------------------------------------------------------
184  
removeVetoableChangeListener(const::rtl::OUString & aPropertyName,const Reference<XVetoableChangeListener> &)185  void SbPropertyValues::removeVetoableChangeListener(
186  					const ::rtl::OUString& aPropertyName,
187  					const Reference< XVetoableChangeListener >& )
188                      throw()
189  {
190      (void)aPropertyName;
191  }
192  
193  //----------------------------------------------------------------------------
194  
getPropertyValues(void)195  Sequence< PropertyValue > SbPropertyValues::getPropertyValues(void) throw (::com::sun::star::uno::RuntimeException)
196  {
197  	Sequence<PropertyValue> aRet( _aPropVals.Count());
198  	for ( sal_uInt16 n = 0; n < _aPropVals.Count(); ++n )
199  		aRet.getArray()[n] = *_aPropVals.GetObject(n);
200  	return aRet;
201  }
202  
203  //----------------------------------------------------------------------------
204  
setPropertyValues(const Sequence<PropertyValue> & rPropertyValues)205  void SbPropertyValues::setPropertyValues(const Sequence< PropertyValue >& rPropertyValues )
206                       throw (::com::sun::star::beans::UnknownPropertyException,
207                       ::com::sun::star::beans::PropertyVetoException,
208                       ::com::sun::star::lang::IllegalArgumentException,
209                       ::com::sun::star::lang::WrappedTargetException,
210                       ::com::sun::star::uno::RuntimeException)
211  {
212  	if ( _aPropVals.Count() )
213  		throw PropertyExistException();
214  
215  	const PropertyValue *pPropVals = rPropertyValues.getConstArray();
216  	for ( sal_Int16 n = 0; n < rPropertyValues.getLength(); ++n )
217  	{
218  		PropertyValue *pPropVal = new PropertyValue(pPropVals[n]);
219  		_aPropVals.Insert( pPropVal, n );
220  	}
221  }
222  
223  //============================================================================
224  //PropertySetInfoImpl
225  
PropertySetInfoImpl()226  PropertySetInfoImpl::PropertySetInfoImpl()
227  {
228  }
229  
GetIndex_Impl(const::rtl::OUString & rPropName) const230  sal_Int32 PropertySetInfoImpl::GetIndex_Impl( const ::rtl::OUString &rPropName ) const
231  {
232  	Property *pP;
233  	pP = (Property*)
234  			bsearch( &rPropName, _aProps.getConstArray(), _aProps.getLength(),
235  					  sizeof( Property ),
236  					  SbCompare_UString_Property_Impl );
237  	return pP ? sal::static_int_cast<sal_Int32>( (pP-_aProps.getConstArray()) / sizeof(pP) ) : -1;
238  }
239  
getProperties(void)240  Sequence< Property > PropertySetInfoImpl::getProperties(void) throw()
241  {
242  	return _aProps;
243  }
244  
getPropertyByName(const::rtl::OUString & Name)245  Property PropertySetInfoImpl::getPropertyByName(const ::rtl::OUString& Name) throw( RuntimeException )
246  {
247  	sal_Int32 nIndex = GetIndex_Impl( Name );
248  	if( USHRT_MAX != nIndex )
249  		return _aProps.getConstArray()[ nIndex ];
250  	return Property();
251  }
252  
hasPropertyByName(const::rtl::OUString & Name)253  sal_Bool PropertySetInfoImpl::hasPropertyByName(const ::rtl::OUString& Name) throw( RuntimeException )
254  {
255  	sal_Int32 nIndex = GetIndex_Impl( Name );
256  	return USHRT_MAX != nIndex;
257  }
258  
259  
260  //============================================================================
261  
SbPropertySetInfo()262  SbPropertySetInfo::SbPropertySetInfo()
263  {
264  }
265  
266  //----------------------------------------------------------------------------
267  
SbPropertySetInfo(const SbPropertyValueArr_Impl & rPropVals)268  SbPropertySetInfo::SbPropertySetInfo( const SbPropertyValueArr_Impl &rPropVals )
269  {
270  	aImpl._aProps.realloc( rPropVals.Count() );
271  	for ( sal_uInt16 n = 0; n < rPropVals.Count(); ++n )
272  	{
273  		Property &rProp = aImpl._aProps.getArray()[n];
274  		const PropertyValue &rPropVal = *rPropVals.GetObject(n);
275  		rProp.Name = rPropVal.Name;
276  		rProp.Handle = rPropVal.Handle;
277  		rProp.Type = getCppuVoidType();
278  		rProp.Attributes = 0;
279  	}
280  }
281  
282  //----------------------------------------------------------------------------
283  
~SbPropertySetInfo()284  SbPropertySetInfo::~SbPropertySetInfo()
285  {
286  }
287  
288  //-------------------------------------------------------------------------
289  
getProperties(void)290  Sequence< Property > SbPropertySetInfo::getProperties(void) throw( RuntimeException )
291  {
292  	return aImpl.getProperties();
293  }
294  
getPropertyByName(const::rtl::OUString & Name)295  Property SbPropertySetInfo::getPropertyByName(const ::rtl::OUString& Name)
296  	throw( RuntimeException )
297  {
298  	return aImpl.getPropertyByName( Name );
299  }
300  
hasPropertyByName(const::rtl::OUString & Name)301  sal_Bool SbPropertySetInfo::hasPropertyByName(const ::rtl::OUString& Name)
302  	throw( RuntimeException )
303  {
304  	return aImpl.hasPropertyByName( Name );
305  }
306  
307  
308  //----------------------------------------------------------------------------
309  
SbPropertyContainer()310  SbPropertyContainer::SbPropertyContainer()
311  {
312  }
313  
314  //----------------------------------------------------------------------------
315  
~SbPropertyContainer()316  SbPropertyContainer::~SbPropertyContainer()
317  {
318  }
319  
320  //----------------------------------------------------------------------------
addProperty(const::rtl::OUString & Name,sal_Int16 Attributes,const Any & DefaultValue)321  void SbPropertyContainer::addProperty(const ::rtl::OUString& Name,
322  									  sal_Int16 Attributes,
323  									  const Any& DefaultValue)
324  	throw(  PropertyExistException, IllegalTypeException,
325  			IllegalArgumentException, RuntimeException )
326  {
327      (void)Name;
328      (void)Attributes;
329      (void)DefaultValue;
330  }
331  
332  //----------------------------------------------------------------------------
removeProperty(const::rtl::OUString & Name)333  void SbPropertyContainer::removeProperty(const ::rtl::OUString& Name)
334  	throw( UnknownPropertyException, RuntimeException )
335  {
336      (void)Name;
337  }
338  
339  //----------------------------------------------------------------------------
340  // XPropertySetInfo
getProperties(void)341  Sequence< Property > SbPropertyContainer::getProperties(void) throw ()
342  {
343  	return aImpl.getProperties();
344  }
345  
getPropertyByName(const::rtl::OUString & Name)346  Property SbPropertyContainer::getPropertyByName(const ::rtl::OUString& Name)
347  	throw( RuntimeException )
348  {
349  	return aImpl.getPropertyByName( Name );
350  }
351  
hasPropertyByName(const::rtl::OUString & Name)352  sal_Bool SbPropertyContainer::hasPropertyByName(const ::rtl::OUString& Name)
353  	throw( RuntimeException )
354  {
355  	return aImpl.hasPropertyByName( Name );
356  }
357  
358  //----------------------------------------------------------------------------
359  
getPropertyValues(void)360  Sequence< PropertyValue > SbPropertyContainer::getPropertyValues(void)
361  {
362  	return Sequence<PropertyValue>();
363  }
364  
365  //----------------------------------------------------------------------------
366  
setPropertyValues(const Sequence<PropertyValue> & PropertyValues_)367  void SbPropertyContainer::setPropertyValues(const Sequence< PropertyValue >& PropertyValues_)
368  {
369      (void)PropertyValues_;
370  }
371  
372  //----------------------------------------------------------------------------
373  
RTL_Impl_CreatePropertySet(StarBASIC * pBasic,SbxArray & rPar,sal_Bool bWrite)374  void RTL_Impl_CreatePropertySet( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite )
375  {
376      (void)pBasic;
377      (void)bWrite;
378  
379      // We need at least one parameter
380      // TODO: In this case < 2 is not correct ;-)
381  	if ( rPar.Count() < 2 )
382  	{
383  		StarBASIC::Error( SbERR_BAD_ARGUMENT );
384  		return;
385  	}
386  
387      // Get class names of struct
388  	String aServiceName( RTL_CONSTASCII_USTRINGPARAM("stardiv.uno.beans.PropertySet") );
389  
390  #if 0
391  	// Service suchen und instanzieren
392  	Reference< XMultiServiceFactory > xServiceManager = getProcessServiceFactory();
393  	Reference< XInterface > xInterface;
394  	if( xProv.is() )
395  		xInterface = xProv->newInstance();
396  #else
397  	Reference< XInterface > xInterface = (OWeakObject*) new SbPropertyValues();
398  #endif
399  
400  	SbxVariableRef refVar = rPar.Get(0);
401  	if( xInterface.is() )
402  	{
403  		// Set PropertyValues
404  		Any aArgAsAny = sbxToUnoValue( rPar.Get(1),
405  				getCppuType( (Sequence<PropertyValue>*)0 ) );
406  		Sequence<PropertyValue> *pArg =
407  				(Sequence<PropertyValue>*) aArgAsAny.getValue();
408  		Reference< XPropertyAccess > xPropAcc = Reference< XPropertyAccess >::query( xInterface );
409  		xPropAcc->setPropertyValues( *pArg );
410  
411  		// Build a SbUnoObject and return it
412  		Any aAny;
413  		aAny <<= xInterface;
414  		SbUnoObjectRef xUnoObj = new SbUnoObject( aServiceName, aAny );
415  		if( xUnoObj->getUnoAny().getValueType().getTypeClass() != TypeClass_VOID )
416  		{
417  			// Return object
418  			refVar->PutObject( (SbUnoObject*)xUnoObj );
419  			return;
420  		}
421  	}
422  
423  	// Object could not be created
424  	refVar->PutObject( NULL );
425  }
426  
427