1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir #ifndef SB_UNO_OBJ 28*cdf0e10cSrcweir #define SB_UNO_OBJ 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include <basic/sbxobj.hxx> 31*cdf0e10cSrcweir #include <basic/sbxmeth.hxx> 32*cdf0e10cSrcweir #include <basic/sbxprop.hxx> 33*cdf0e10cSrcweir #include <basic/sbxfac.hxx> 34*cdf0e10cSrcweir #ifndef __SBX_SBX_HXX //autogen 35*cdf0e10cSrcweir #include <basic/sbx.hxx> 36*cdf0e10cSrcweir #endif 37*cdf0e10cSrcweir #include <com/sun/star/beans/XMaterialHolder.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/beans/XExactName.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospectionAccess.hpp> 40*cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospection.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/script/XInvocation.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/reflection/XIdlClass.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/reflection/XServiceTypeDescription2.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/reflection/XSingletonTypeDescription.hpp> 45*cdf0e10cSrcweir #include <rtl/ustring.hxx> 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir class SbUnoObject: public SbxObject 48*cdf0e10cSrcweir { 49*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XIntrospectionAccess > mxUnoAccess; 50*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMaterialHolder > mxMaterialHolder; 51*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::script::XInvocation > mxInvocation; 52*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XExactName > mxExactName; 53*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XExactName > mxExactNameInvocation; 54*cdf0e10cSrcweir sal_Bool bNeedIntrospection; 55*cdf0e10cSrcweir sal_Bool bNativeCOMObject; 56*cdf0e10cSrcweir ::com::sun::star::uno::Any maTmpUnoObj; // Only to save obj for doIntrospection! 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir // Hilfs-Methode zum Anlegen der dbg_-Properties 59*cdf0e10cSrcweir void implCreateDbgProperties( void ); 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir // Hilfs-Methode zum Anlegen aller Properties und Methoden 62*cdf0e10cSrcweir // (Beim on-demand-Mechanismus erforderlich fuer die dbg_-Properties) 63*cdf0e10cSrcweir void implCreateAll( void ); 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir public: 66*cdf0e10cSrcweir static bool getDefaultPropName( SbUnoObject* pUnoObj, String& sDfltProp ); 67*cdf0e10cSrcweir TYPEINFO(); 68*cdf0e10cSrcweir SbUnoObject( const String& aName_, const ::com::sun::star::uno::Any& aUnoObj_ ); 69*cdf0e10cSrcweir ~SbUnoObject(); 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir // #76470 Introspection on Demand durchfuehren 72*cdf0e10cSrcweir void doIntrospection( void ); 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir // Find ueberladen, um z.B. NameAccess zu unterstuetzen 75*cdf0e10cSrcweir virtual SbxVariable* Find( const String&, SbxClassType ); 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir // Force creation of all properties for debugging 78*cdf0e10cSrcweir void createAllProperties( void ) 79*cdf0e10cSrcweir { implCreateAll(); } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir // Wert rausgeben 82*cdf0e10cSrcweir ::com::sun::star::uno::Any getUnoAny( void ); 83*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XIntrospectionAccess > getIntrospectionAccess( void ) { return mxUnoAccess; } 84*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::script::XInvocation > getInvocation( void ) { return mxInvocation; } 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir void SFX_NOTIFY( SfxBroadcaster&, const TypeId&, const SfxHint& rHint, const TypeId& ); 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir bool isNativeCOMObject( void ) 89*cdf0e10cSrcweir { return bNativeCOMObject; } 90*cdf0e10cSrcweir }; 91*cdf0e10cSrcweir SV_DECL_IMPL_REF(SbUnoObject); 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir // #67781 Rueckgabewerte der Uno-Methoden loeschen 95*cdf0e10cSrcweir void clearUnoMethods( void ); 96*cdf0e10cSrcweir void clearUnoMethodsForBasic( StarBASIC* pBasic ); 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir class SbUnoMethod : public SbxMethod 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir friend class SbUnoObject; 101*cdf0e10cSrcweir friend void clearUnoMethods( void ); 102*cdf0e10cSrcweir friend void clearUnoMethodsForBasic( StarBASIC* pBasic ); 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlMethod > m_xUnoMethod; 105*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::com::sun::star::reflection::ParamInfo >* pParamInfoSeq; 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir // #67781 Verweis auf vorige und naechste Methode in der Methoden-Liste 108*cdf0e10cSrcweir SbUnoMethod* pPrev; 109*cdf0e10cSrcweir SbUnoMethod* pNext; 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir bool mbInvocation; // Method is based on invocation 112*cdf0e10cSrcweir bool mbDirectInvocation; // Method should be used with XDirectInvocation interface 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir public: 115*cdf0e10cSrcweir TYPEINFO(); 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir SbUnoMethod( const String& aName_, SbxDataType eSbxType, ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlMethod > xUnoMethod_, 118*cdf0e10cSrcweir bool bInvocation, 119*cdf0e10cSrcweir bool bDirect = false ); 120*cdf0e10cSrcweir virtual ~SbUnoMethod(); 121*cdf0e10cSrcweir virtual SbxInfo* GetInfo(); 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir const ::com::sun::star::uno::Sequence< ::com::sun::star::reflection::ParamInfo >& getParamInfos( void ); 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir bool isInvocationBased( void ) 126*cdf0e10cSrcweir { return mbInvocation; } 127*cdf0e10cSrcweir bool needsDirectInvocation( void ) 128*cdf0e10cSrcweir { return mbDirectInvocation; } 129*cdf0e10cSrcweir }; 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir class SbUnoProperty : public SbxProperty 133*cdf0e10cSrcweir { 134*cdf0e10cSrcweir friend class SbUnoObject; 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir // Daten der Uno-Property 137*cdf0e10cSrcweir ::com::sun::star::beans::Property aUnoProp; 138*cdf0e10cSrcweir sal_Int32 nId; 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir bool mbInvocation; // Property is based on invocation 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir virtual ~SbUnoProperty(); 143*cdf0e10cSrcweir public: 144*cdf0e10cSrcweir TYPEINFO(); 145*cdf0e10cSrcweir SbUnoProperty( const String& aName_, SbxDataType eSbxType, 146*cdf0e10cSrcweir const ::com::sun::star::beans::Property& aUnoProp_, sal_Int32 nId_, bool bInvocation ); 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir bool isInvocationBased( void ) 149*cdf0e10cSrcweir { return mbInvocation; } 150*cdf0e10cSrcweir }; 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir // Factory-Klasse fuer das Anlegen von Uno-Structs per DIM AS NEW 153*cdf0e10cSrcweir class SbUnoFactory : public SbxFactory 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir public: 156*cdf0e10cSrcweir virtual SbxBase* Create( sal_uInt16 nSbxId, sal_uInt32 = SBXCR_SBX ); 157*cdf0e10cSrcweir virtual SbxObject* CreateObject( const String& ); 158*cdf0e10cSrcweir }; 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir // Wrapper fuer eine Uno-Klasse 161*cdf0e10cSrcweir class SbUnoClass : public SbxObject 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > m_xClass; 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir public: 166*cdf0e10cSrcweir TYPEINFO(); 167*cdf0e10cSrcweir SbUnoClass( const String& aName_ ) 168*cdf0e10cSrcweir : SbxObject( aName_ ) 169*cdf0e10cSrcweir {} 170*cdf0e10cSrcweir SbUnoClass( const String& aName_, const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass >& xClass_ ) 171*cdf0e10cSrcweir : SbxObject( aName_ ) 172*cdf0e10cSrcweir , m_xClass( xClass_ ) 173*cdf0e10cSrcweir {} 174*cdf0e10cSrcweir //~SbUnoClass(); 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir // Find ueberladen, um Elemente on Demand anzulegen 177*cdf0e10cSrcweir virtual SbxVariable* Find( const String&, SbxClassType ); 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir // Wert rausgeben 180*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass >& getUnoClass( void ) { return m_xClass; } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir //void SFX_NOTIFY( SfxBroadcaster&, const TypeId&, const SfxHint& rHint, const TypeId& ); 183*cdf0e10cSrcweir }; 184*cdf0e10cSrcweir SV_DECL_IMPL_REF(SbUnoClass); 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir // Funktion, um einen globalen Bezeichner im 188*cdf0e10cSrcweir // UnoScope zu suchen und fuer Sbx zu wrappen 189*cdf0e10cSrcweir SbUnoClass* findUnoClass( const String& rName ); 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir // Wrapper for UNO Service 193*cdf0e10cSrcweir class SbUnoService : public SbxObject 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XServiceTypeDescription2 > m_xServiceTypeDesc; 196*cdf0e10cSrcweir bool m_bNeedsInit; 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir public: 199*cdf0e10cSrcweir TYPEINFO(); 200*cdf0e10cSrcweir SbUnoService( const String& aName_, 201*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XServiceTypeDescription2 >& xServiceTypeDesc ) 202*cdf0e10cSrcweir : SbxObject( aName_ ) 203*cdf0e10cSrcweir , m_xServiceTypeDesc( xServiceTypeDesc ) 204*cdf0e10cSrcweir , m_bNeedsInit( true ) 205*cdf0e10cSrcweir {} 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir virtual SbxVariable* Find( const String&, SbxClassType ); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir void SFX_NOTIFY( SfxBroadcaster&, const TypeId&, const SfxHint& rHint, const TypeId& ); 210*cdf0e10cSrcweir }; 211*cdf0e10cSrcweir SV_DECL_IMPL_REF(SbUnoService); 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir SbUnoService* findUnoService( const String& rName ); 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir void clearUnoServiceCtors( void ); 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir class SbUnoServiceCtor : public SbxMethod 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir friend class SbUnoService; 221*cdf0e10cSrcweir friend void clearUnoServiceCtors( void ); 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XServiceConstructorDescription > m_xServiceCtorDesc; 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir SbUnoServiceCtor* pPrev; 226*cdf0e10cSrcweir SbUnoServiceCtor* pNext; 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir public: 229*cdf0e10cSrcweir TYPEINFO(); 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir SbUnoServiceCtor( const String& aName_, ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XServiceConstructorDescription > xServiceCtorDesc ); 232*cdf0e10cSrcweir virtual ~SbUnoServiceCtor(); 233*cdf0e10cSrcweir virtual SbxInfo* GetInfo(); 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XServiceConstructorDescription > getServiceCtorDesc( void ) 236*cdf0e10cSrcweir { return m_xServiceCtorDesc; } 237*cdf0e10cSrcweir }; 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir // Wrapper for UNO Singleton 241*cdf0e10cSrcweir class SbUnoSingleton : public SbxObject 242*cdf0e10cSrcweir { 243*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XSingletonTypeDescription > m_xSingletonTypeDesc; 244*cdf0e10cSrcweir 245*cdf0e10cSrcweir public: 246*cdf0e10cSrcweir TYPEINFO(); 247*cdf0e10cSrcweir SbUnoSingleton( const String& aName_, 248*cdf0e10cSrcweir const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XSingletonTypeDescription >& xSingletonTypeDesc ); 249*cdf0e10cSrcweir 250*cdf0e10cSrcweir void SFX_NOTIFY( SfxBroadcaster&, const TypeId&, const SfxHint& rHint, const TypeId& ); 251*cdf0e10cSrcweir }; 252*cdf0e10cSrcweir SV_DECL_IMPL_REF(SbUnoSingleton); 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir SbUnoSingleton* findUnoSingleton( const String& rName ); 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir // #105565 Special Object to wrap a strongly typed Uno Any 258*cdf0e10cSrcweir class SbUnoAnyObject: public SbxObject 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir ::com::sun::star::uno::Any mVal; 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir public: 263*cdf0e10cSrcweir SbUnoAnyObject( const ::com::sun::star::uno::Any& rVal ) 264*cdf0e10cSrcweir : SbxObject( String() ) 265*cdf0e10cSrcweir , mVal( rVal ) 266*cdf0e10cSrcweir {} 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir const ::com::sun::star::uno::Any& getValue( void ) 269*cdf0e10cSrcweir { return mVal; } 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir TYPEINFO(); 272*cdf0e10cSrcweir }; 273*cdf0e10cSrcweir 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir // #112509 Special SbxArray to transport named parameters for calls 276*cdf0e10cSrcweir // to OLEAutomation objects through the UNO OLE automation bridge 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir class AutomationNamedArgsSbxArray : public SbxArray 279*cdf0e10cSrcweir { 280*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::rtl::OUString > maNameSeq; 281*cdf0e10cSrcweir public: 282*cdf0e10cSrcweir TYPEINFO(); 283*cdf0e10cSrcweir AutomationNamedArgsSbxArray( sal_Int32 nSeqSize ) 284*cdf0e10cSrcweir : maNameSeq( nSeqSize ) 285*cdf0e10cSrcweir {} 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::rtl::OUString >& getNames( void ) 288*cdf0e10cSrcweir { return maNameSeq; } 289*cdf0e10cSrcweir }; 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir class StarBASIC; 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir // Impl-Methoden fuer RTL 295*cdf0e10cSrcweir void RTL_Impl_CreateUnoStruct( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 296*cdf0e10cSrcweir void RTL_Impl_CreateUnoService( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 297*cdf0e10cSrcweir void RTL_Impl_CreateUnoServiceWithArguments( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 298*cdf0e10cSrcweir void RTL_Impl_CreateUnoValue( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 299*cdf0e10cSrcweir void RTL_Impl_GetProcessServiceManager( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 300*cdf0e10cSrcweir void RTL_Impl_HasInterfaces( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 301*cdf0e10cSrcweir void RTL_Impl_IsUnoStruct( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 302*cdf0e10cSrcweir void RTL_Impl_EqualUnoObjects( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 303*cdf0e10cSrcweir void RTL_Impl_GetDefaultContext( StarBASIC* pBasic, SbxArray& rPar, sal_Bool bWrite ); 304*cdf0e10cSrcweir 305*cdf0e10cSrcweir void disposeComVariablesForBasic( StarBASIC* pBasic ); 306*cdf0e10cSrcweir void clearNativeObjectWrapperVector( void ); 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir //======================================================================== 310*cdf0e10cSrcweir // #118116 Collection object 311*cdf0e10cSrcweir 312*cdf0e10cSrcweir class BasicCollection : public SbxObject 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir friend class SbiRuntime; 315*cdf0e10cSrcweir SbxArrayRef xItemArray; 316*cdf0e10cSrcweir static SbxInfoRef xAddInfo; 317*cdf0e10cSrcweir static SbxInfoRef xItemInfo; 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir void Initialize(); 320*cdf0e10cSrcweir virtual ~BasicCollection(); 321*cdf0e10cSrcweir virtual void SFX_NOTIFY( SfxBroadcaster& rBC, const TypeId& rBCType, 322*cdf0e10cSrcweir const SfxHint& rHint, const TypeId& rHintType ); 323*cdf0e10cSrcweir sal_Int32 implGetIndex( SbxVariable* pIndexVar ); 324*cdf0e10cSrcweir sal_Int32 implGetIndexForName( const String& rName ); 325*cdf0e10cSrcweir void CollAdd( SbxArray* pPar_ ); 326*cdf0e10cSrcweir void CollItem( SbxArray* pPar_ ); 327*cdf0e10cSrcweir void CollRemove( SbxArray* pPar_ ); 328*cdf0e10cSrcweir 329*cdf0e10cSrcweir public: 330*cdf0e10cSrcweir TYPEINFO(); 331*cdf0e10cSrcweir BasicCollection( const String& rClassname ); 332*cdf0e10cSrcweir virtual SbxVariable* Find( const String&, SbxClassType ); 333*cdf0e10cSrcweir virtual void Clear(); 334*cdf0e10cSrcweir }; 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir #endif 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir 339