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