xref: /aoo41x/main/idl/source/objects/object.cxx (revision 724893d4)
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_idl.hxx"
26 
27 #include <ctype.h>
28 #include <stdio.h>
29 
30 #include <tools/debug.hxx>
31 
32 #include <attrib.hxx>
33 #include <object.hxx>
34 #include <globals.hxx>
35 #include <database.hxx>
36 
37 /******************** class SvClassElement *******************************/
38 SV_IMPL_PERSIST1( SvClassElement, SvPersistBase );
39 
40 /*************************************************************************
41 |*    SvClassElement::SvClassElement()
42 |*
43 |*    Beschreibung
44 *************************************************************************/
45 SvClassElement::SvClassElement()
46 {
47 };
48 
49 /*************************************************************************
50 |*    SvClassElement::Load()
51 |*
52 |*    Beschreibung
53 *************************************************************************/
54 void SvClassElement::Load( SvPersistStream & rStm )
55 {
56     sal_uInt8 nMask;
57     rStm >> nMask;
58     if( nMask >= 0x08 )
59     {
60         rStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
61         DBG_ERROR( "wrong format" );
62         return;
63     }
64     if( nMask & 0x01 ) rStm >> aAutomation;
65     if( nMask & 0x02 ) rStm.ReadByteString( aPrefix );
66     if( nMask & 0x04 )
67 	{
68 		SvMetaClass * p;
69 		rStm >> p;
70     	xClass = p;
71 	}
72 }
73 
74 /*************************************************************************
75 |*    SvClassElement::Save()
76 |*
77 |*    Beschreibung
78 *************************************************************************/
79 void SvClassElement::Save( SvPersistStream & rStm )
80 {
81     // Maske erstellen
82     sal_uInt8 nMask = 0;
83     if( aAutomation.IsSet() ) 		nMask |= 0x1;
84     if( aPrefix.Len() )		  		nMask |= 0x2;
85     if( xClass.Is() )				nMask |= 0x4;
86 
87     // Daten schreiben
88     rStm << nMask;
89 	if( nMask & 0x01 ) rStm << aAutomation;
90     if( nMask & 0x02 ) rStm.WriteByteString( aPrefix );
91     if( nMask & 0x04 ) rStm << xClass;
92 }
93 
94 /****************** SvMetaClass ******************************************/
95 SV_IMPL_META_FACTORY1( SvMetaClass, SvMetaType );
96 /*************************************************************************
97 |*    SvMetaClass::SvMetaClass()
98 |*
99 |*    Beschreibung
100 *************************************************************************/
101 SvMetaClass::SvMetaClass()
102 	: aAutomation( sal_True, sal_False )
103 {
104 }
105 
106 /*************************************************************************
107 |*    SvMetaClass::Load()
108 |*
109 |*    Beschreibung
110 *************************************************************************/
111 void SvMetaClass::Load( SvPersistStream & rStm )
112 {
113     SvMetaType::Load( rStm );
114 
115     sal_uInt8 nMask;
116     rStm >> nMask;
117     if( nMask >= 0x20 )
118     {
119         rStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
120         DBG_ERROR( "wrong format" );
121         return;
122     }
123     if( nMask & 0x01 ) rStm >> aAttrList;
124     if( nMask & 0x02 )
125 	{
126 		SvMetaClass * pSuper;
127 		 rStm >> pSuper;
128     	aSuperClass = pSuper;
129 	}
130     if( nMask & 0x04 ) rStm >> aClassList;
131     if( nMask & 0x8 )
132 	{
133 		SvMetaClass * p;
134 		rStm >> p;
135     	xAutomationInterface = p;
136 	}
137 	if( nMask & 0x10 ) rStm >> aAutomation;
138 }
139 
140 /*************************************************************************
141 |*    SvMetaClass::Save()
142 |*
143 |*    Beschreibung
144 *************************************************************************/
145 void SvMetaClass::Save( SvPersistStream & rStm )
146 {
147     SvMetaType::Save( rStm );
148 
149     // Maske erstellen
150     sal_uInt8 nMask = 0;
151     if( aAttrList.Count() ) 		nMask |= 0x1;
152     if( aSuperClass.Is() )  		nMask |= 0x2;
153     if( aClassList.Count() )		nMask |= 0x4;
154     if( xAutomationInterface.Is() ) nMask |= 0x8;
155 	if( aAutomation.IsSet() )		nMask |= 0x10;
156 
157     // Daten schreiben
158     rStm << nMask;
159     if( nMask & 0x01 ) rStm << aAttrList;
160     if( nMask & 0x02 ) rStm << aSuperClass;
161     if( nMask & 0x04 ) rStm << aClassList;
162     if( nMask & 0x08 ) rStm << xAutomationInterface;
163 	if( nMask & 0x10 ) rStm << aAutomation;
164 }
165 
166 /*************************************************************************
167 |*    SvMetaClass::FillSbxObject()
168 |*
169 |*    Beschreibung
170 *************************************************************************/
171 /*
172 void SvMetaClass::FillSbxMemberObject( SvIdlDataBase & rBase,
173 										SbxObject * pObj,
174 										StringList & rSuperList,
175 										sal_Bool bVariable )
176 {
177 	// alle Attribute der Klasse schreiben
178 	sal_uLong n ;
179 	for( n = 0; n < aAttrList.Count(); n++ )
180 	{
181 		SvMetaAttribute * pAttr = aAttrList.GetObject( n );
182 
183 		ByteString aMangleName = pAttr->GetMangleName( bVariable );
184 		ByteString * pS = SvIdlDataBase::FindName( aMangleName, rSuperList );
185 
186 		if( !pS && pAttr->GetExport() )
187 		{
188 			// nicht doppelt
189 			if( bVariable && pAttr->IsVariable() )
190 			{
191 				rSuperList.Insert( new ByteString( aMangleName ), LIST_APPEND );
192  				pAttr->FillSbxObject( rBase, pObj, bVariable );
193 			}
194 			else if( !bVariable && pAttr->IsMethod() )
195 			{
196 				rSuperList.Insert( new ByteString( aMangleName ), LIST_APPEND );
197 				pAttr->FillSbxObject( rBase, pObj, bVariable );
198 			}
199 		}
200 	}
201 	// alle Attribute der importierten Klassen schreiben
202 	for( n = 0; n < aClassList.Count(); n++ )
203 	{
204 		SvClassElement * pEle = aClassList.GetObject( n );
205 		SvMetaClass * pClass = pEle->GetClass();
206 		pClass->FillSbxMemberObject( rBase, pObj, rSuperList, bVariable );
207 	}
208 	// alle Attribute der Superklassen schreiben
209     if( aSuperClass.Is() )
210 		aSuperClass->FillSbxMemberObject( rBase, pObj, rSuperList, bVariable );
211 }
212 */
213 /*************************************************************************
214 |*    SvMetaClass::FillSbxObject()
215 |*
216 |*    Beschreibung
217 *************************************************************************/
218 /*
219 void SvMetaClass::FillSbxObject( SvIdlDataBase & rBase, SbxObject * pObj )
220 {
221     StringList aSuperList;
222     FillSbxMemberObject( rBase, pObj, aSuperList, sal_True );
223     FillSbxMemberObject( rBase, pObj, aSuperList, sal_False );
224 
225 	ByteString * pStr = aSuperList.First();
226 	while( pStr )
227 	{
228 		delete pStr;
229 		pStr = aSuperList.Next();
230 	}
231 }
232  */
233 #ifdef IDL_COMPILER
234 /*************************************************************************
235 |*    SvMetaClass::ReadAttributesSvIdl()
236 |*
237 |*    Beschreibung
238 *************************************************************************/
239 void SvMetaClass::ReadAttributesSvIdl( SvIdlDataBase & rBase,
240 										SvTokenStream & rInStm )
241 {
242 	SvMetaType::ReadAttributesSvIdl( rBase, rInStm );
243 	aAutomation.ReadSvIdl( SvHash_Automation(), rInStm );
244 }
245 
246 /*************************************************************************
247 |*    SvMetaClass::WriteAttributesSvIdl()
248 |*
249 |*    Beschreibung
250 *************************************************************************/
251 void SvMetaClass::WriteAttributesSvIdl( SvIdlDataBase & rBase,
252 								 SvStream & rOutStm, sal_uInt16 nTab )
253 {
254 	SvMetaType::WriteAttributesSvIdl( rBase, rOutStm, nTab );
255 
256 	if( !aAutomation )
257 	{
258 		WriteTab( rOutStm, nTab );
259 		rOutStm << "//class SvMetaClass" << endl;
260 		if( !aAutomation )
261 		{
262 			WriteTab( rOutStm, nTab );
263 			aAutomation.WriteSvIdl( SvHash_Automation(), rOutStm );
264 			rOutStm << ';' << endl;
265 		}
266 	}
267 }
268 
269 /*************************************************************************
270 |*    SvMetaClass::ReadContextSvIdl()
271 |*
272 |*    Beschreibung
273 *************************************************************************/
274 void SvMetaClass::ReadContextSvIdl( SvIdlDataBase & rBase,
275                                     SvTokenStream & rInStm )
276 {
277     sal_uInt32  nTokPos = rInStm.Tell();
278     SvToken * pTok = rInStm.GetToken_Next();
279 
280 	if( pTok->Is( SvHash_import() ) )
281 	{
282 		SvMetaClass * pClass = rBase.ReadKnownClass( rInStm );
283 		if( pClass )
284 		{
285 			SvClassElementRef xEle = new SvClassElement();
286 			xEle->SetClass( pClass );
287 			aClassList.Append( xEle );
288 
289 		    if( rInStm.Read( '[' ) )
290 		    {
291 			    pTok = rInStm.GetToken_Next();
292 				if( pTok->Is( SvHash_Automation() ) )
293 				{
294 		        	if( rInStm.Read( ']' ) )
295 					{
296 						if( xAutomationInterface.Is() )
297 						{
298 				            // Fehler setzen
299 				            rBase.SetError( "Automation allready set",
300 											rInStm.GetToken() );
301 				            rBase.WriteError( rInStm );
302 						}
303 						xAutomationInterface = pClass;
304 						xEle->SetAutomation( sal_True );
305 					}
306 					else
307 					{
308 			            // Fehler setzen
309 			            rBase.SetError( "missing ]", rInStm.GetToken() );
310 			            rBase.WriteError( rInStm );
311 					}
312 				}
313 				else
314 				{
315 		            // Fehler setzen
316 		            rBase.SetError( "only attribute Automation allowed",
317 									rInStm.GetToken() );
318 		            rBase.WriteError( rInStm );
319 				}
320 		    }
321 			pTok = rInStm.GetToken();
322 			if( pTok->IsString() )
323 			{
324 				xEle->SetPrefix( pTok->GetString() );
325 			    rInStm.GetToken_Next();
326 			}
327 			return;
328 		}
329 		else
330 		{
331 	        // Fehler setzen
332 	        rBase.SetError( "unknown imported interface", rInStm.GetToken() );
333 	        rBase.WriteError( rInStm );
334 		}
335 	}
336 	else
337 	{
338 		rInStm.Seek( nTokPos );
339 		SvMetaType * pType = rBase.ReadKnownType( rInStm );
340 
341 	    sal_Bool bOk = sal_False;
342 		SvMetaAttributeRef xAttr;
343 		if( !pType || pType->IsItem() )
344 		{
345 			xAttr = new SvMetaSlot( pType );
346 		    if( xAttr->ReadSvIdl( rBase, rInStm ) )
347 			    bOk = xAttr->Test( rBase, rInStm );
348 		}
349 		else
350 		{
351 		    xAttr = new SvMetaAttribute( pType );
352 		    if( xAttr->ReadSvIdl( rBase, rInStm ) )
353 			    bOk = xAttr->Test( rBase, rInStm );
354 		}
355 
356 		if( bOk )
357 			bOk = TestAttribute( rBase, rInStm, *xAttr );
358 		if( bOk )
359 		{
360 			if( !xAttr->GetSlotId().IsSet() )
361 			{
362 				SvNumberIdentifier aI;
363 				aI.SetValue( rBase.GetUniqueId() );
364 				xAttr->SetSlotId( aI );
365 			}
366 			aAttrList.Append( xAttr );
367 			return;
368 		}
369 	}
370 	rInStm.Seek( nTokPos );
371 }
372 
373 /*************************************************************************
374 |*    SvMetaClass::WriteContextSvIdl()
375 |*
376 |*    Beschreibung
377 *************************************************************************/
378 void SvMetaClass::WriteContextSvIdl
379 (
380 	SvIdlDataBase & rBase,
381     SvStream & rOutStm,
382     sal_uInt16 nTab
383 )
384 {
385     //SvMetaType::WriteContextSvIdl( rBase, rOutStm, nTab );
386 	sal_uLong n;
387     for( n = 0; n < aAttrList.Count(); n++ )
388     {
389 		WriteTab( rOutStm, nTab );
390         aAttrList.GetObject( n )->WriteSvIdl( rBase, rOutStm, nTab );
391         rOutStm << ';' << endl;
392     }
393     for( n = 0; n < aClassList.Count(); n++ )
394     {
395 		SvClassElement * pEle = aClassList.GetObject( n );
396 		WriteTab( rOutStm, nTab );
397         rOutStm << SvHash_import()->GetName().GetBuffer() << ' '
398                 << pEle->GetPrefix().GetBuffer();
399 		if( pEle->GetAutomation() )
400             rOutStm << " [ " << SvHash_Automation()->GetName().GetBuffer()
401 					<< " ]";
402 		if( pEle->GetPrefix().Len() )
403             rOutStm << ' ' << pEle->GetPrefix().GetBuffer();
404         rOutStm << ';' << endl;
405     }
406 }
407 
408 /*************************************************************************
409 |*    SvMetaClass::ReadSvIdl()
410 |*
411 |*    Beschreibung
412 *************************************************************************/
413 sal_Bool SvMetaClass::ReadSvIdl( SvIdlDataBase & rBase, SvTokenStream & rInStm )
414 {
415 	sal_uLong nTokPos = rInStm.Tell();
416 	if( SvMetaType::ReadHeaderSvIdl( rBase, rInStm ) && GetType() == TYPE_CLASS )
417 	{
418 		sal_Bool bOk = sal_True;
419 		if( rInStm.Read( ':' ) )
420 		{
421 			aSuperClass = rBase.ReadKnownClass( rInStm );
422 			bOk = aSuperClass.Is();
423 			if( !bOk )
424 			{
425 				// Fehler setzen
426 				rBase.SetError( "unknown super class",
427 								rInStm.GetToken() );
428 				rBase.WriteError( rInStm );
429 			}
430 		}
431 		if( bOk )
432 		{
433 			rBase.Write( '.' );
434 			bOk = SvMetaName::ReadSvIdl( rBase, rInStm );
435 		}
436 		if( bOk )
437 			return bOk;
438     }
439     rInStm.Seek( nTokPos );
440     return sal_False;
441 }
442 
443 /*************************************************************************
444 |*    SvMetaClass::TestAttribute()
445 |*
446 |*    Beschreibung
447 *************************************************************************/
448 sal_Bool SvMetaClass::TestAttribute( SvIdlDataBase & rBase, SvTokenStream & rInStm,
449 								 SvMetaAttribute & rAttr ) const
450 {
451 	if ( !rAttr.GetRef() && rAttr.IsA( TYPE( SvMetaSlot ) ) )
452 	{
453 		DBG_ERROR( "Neuer Slot : " );
454         DBG_ERROR( rAttr.GetSlotId().GetBuffer() );
455 	}
456 
457     for( sal_uLong n = 0; n < aAttrList.Count(); n++ )
458     {
459 		SvMetaAttribute * pS = aAttrList.GetObject( n );
460 		if( pS->GetName() == rAttr.GetName() )
461 		{
462 			// Werte muessen uebereinstimmen
463 			if( pS->GetSlotId().GetValue() != rAttr.GetSlotId().GetValue() )
464 			{
465 				DBG_ERROR( "Gleicher Name in MetaClass : " );
466                 DBG_ERROR( pS->GetName().GetBuffer() );
467                 DBG_ERROR( pS->GetSlotId().GetBuffer() );
468                 DBG_ERROR( rAttr.GetSlotId().GetBuffer() );
469 
470 				ByteString aStr( "Attribute's " );
471 				aStr += pS->GetName();
472 				aStr += " with different id's";
473 				rBase.SetError( aStr, rInStm.GetToken() );
474 				rBase.WriteError( rInStm );
475 				return sal_False;
476 		 	}
477 		}
478 		else
479 		{
480 			sal_uInt32 nId1 = pS->GetSlotId().GetValue();
481 			sal_uInt32 nId2 = rAttr.GetSlotId().GetValue();
482 			if( nId1 == nId2 && nId1 != 0 /*&& nId2 != 0 ist ueberfluessig*/ )
483 			{
484 				DBG_ERROR( "Gleiche Id in MetaClass : " );
485                 DBG_ERROR( ByteString::CreateFromInt32( pS->GetSlotId().GetValue() ).GetBuffer() );
486                 DBG_ERROR( pS->GetSlotId().GetBuffer() );
487                 DBG_ERROR( rAttr.GetSlotId().GetBuffer() );
488 
489 				ByteString aStr( "Attribute " );
490 				aStr += pS->GetName();
491 				aStr += " and Attribute ";
492 				aStr += rAttr.GetName();
493 				aStr += " with equal id's";
494 				rBase.SetError( aStr, rInStm.GetToken() );
495 				rBase.WriteError( rInStm );
496 				return sal_False;
497 		 	}
498 		}
499     }
500 	SvMetaClass * pSC = aSuperClass;
501     if( pSC )
502 		return pSC->TestAttribute( rBase, rInStm, rAttr );
503     return sal_True;
504 }
505 
506 /*************************************************************************
507 |*    SvMetaClass::WriteSvIdl()
508 |*
509 |*    Beschreibung
510 *************************************************************************/
511 void SvMetaClass::WriteSvIdl( SvIdlDataBase & rBase, SvStream & rOutStm,
512                               sal_uInt16 nTab )
513 {
514 	WriteHeaderSvIdl( rBase, rOutStm, nTab );
515     if( aSuperClass.Is() )
516         rOutStm << " : " << aSuperClass->GetName().GetBuffer();
517 	rOutStm << endl;
518     SvMetaName::WriteSvIdl( rBase, rOutStm, nTab );
519 	rOutStm << endl;
520 }
521 
522 /*************************************************************************
523 |*    SvMetaClass::WriteOdlMember()
524 |*
525 |*    Beschreibung
526 *************************************************************************/
527 /*
528 void SvMetaClass::WriteOdlMembers( ByteStringList & rSuperList,
529 									sal_Bool bVariable, sal_Bool bWriteTab,
530 				   					SvIdlDataBase & rBase,
531 				   					SvStream & rOutStm, sal_uInt16 nTab )
532 {
533 	// alle Attribute schreiben
534 	sal_uLong n;
535 	for( n = 0; n < aAttrList.Count(); n++ )
536 	{
537 		SvMetaAttribute * pAttr = aAttrList.GetObject( n );
538 
539 		ByteString aMangleName = pAttr->GetMangleName( bVariable );
540 		ByteString * pS = rBase.FindName( aMangleName, rSuperList );
541 
542 		if( !pS && pAttr->GetExport() )
543 		{
544 			// nicht doppelt
545 			if( bVariable && pAttr->IsVariable() )
546 			{
547 				rSuperList.Insert( new ByteString( aMangleName ), LIST_APPEND );
548 				pAttr->Write( rBase, rOutStm, nTab +1, WRITE_ODL,
549 								WA_VARIABLE );
550 				rOutStm << ';' << endl;
551 			}
552 			else if( !bVariable && pAttr->IsMethod() )
553 			{
554 				rSuperList.Insert( new ByteString( aMangleName ), LIST_APPEND );
555 				pAttr->Write( rBase, rOutStm, nTab +1, WRITE_ODL,
556 								WA_METHOD );
557 				rOutStm << ';' << endl;
558 			}
559 		}
560 		else
561 			continue;
562 	}
563 	// alle Attribute der importierten Klassen schreiben
564 	for( n = 0; n < aClassList.Count(); n++ )
565 	{
566 		SvClassElement * pEle = aClassList.GetObject( n );
567 		SvMetaClass * pCl = pEle->GetClass();
568 		pCl->WriteOdlMembers( rSuperList, bVariable, bWriteTab,
569 					 			rBase, rOutStm, nTab );
570 	}
571 	// alle Attribute der Superklassen schreiben
572 	SvMetaClass * pSC = aSuperClass;
573     if( pSC )
574 		pSC->WriteOdlMembers( rSuperList, bVariable, bWriteTab,
575 					 		rBase, rOutStm, nTab );
576 }
577  */
578 
579 /*************************************************************************
580 |*    SvMetaClass::Write()
581 |*
582 |*    Beschreibung
583 *************************************************************************/
584 void SvMetaClass::Write( SvIdlDataBase & rBase, SvStream & rOutStm,
585 			    		sal_uInt16 nTab,
586 		 				WriteType nT, WriteAttribute )
587 {
588 	rBase.aIFaceName = GetName();
589 	switch( nT )
590 	{
591 		case WRITE_ODL:
592 		{
593             DBG_ERROR( "Not supported anymore!" );
594 /*
595 			// Schreibt die Attribute
596 		    SvMetaName::Write( rBase, rOutStm, nTab, nT, nA );
597 
598 		    WriteTab( rOutStm, nTab );
599             rOutStm << "dispinterface " << GetName().GetBuffer() << endl;
600 		    WriteTab( rOutStm, nTab );
601 		    rOutStm << '{' << endl;
602 
603 		    WriteTab( rOutStm, nTab );
604 		    rOutStm << "properties:";
605 		    rOutStm << endl;
606 
607 			StringList aSuperList;
608 		    WriteOdlMembers( aSuperList, sal_True, sal_True, rBase, rOutStm, nTab );
609 
610 		    WriteTab( rOutStm, nTab );
611 		    rOutStm << "methods:";
612 		    rOutStm << endl;
613 
614 		    WriteOdlMembers( aSuperList, sal_False, sal_True, rBase, rOutStm, nTab );
615 
616 			ByteString * pStr = aSuperList.First();
617 			while( pStr )
618 			{
619 				delete pStr;
620 				pStr = aSuperList.Next();
621 			}
622 
623 		    WriteTab( rOutStm, 1 );
624 		    rOutStm << '}' << endl;
625  */
626             break;
627 		}
628 		case WRITE_C_SOURCE:
629 		case WRITE_C_HEADER:
630 		{
631             DBG_ERROR( "Not supported anymore!" );
632 /*
633 			StringList aSuperList;
634 			if( nT == WRITE_C_SOURCE )
635 			{
636                 rOutStm << "#pragma code_seg (\"" << GetName().GetBuffer()
637 					<< "\",\"CODE\")" << endl;
638 			}
639 			WriteCFunctions( aSuperList, rBase, rOutStm, nTab, nT );
640  */
641 			break;
642 		}
643 		case WRITE_DOCU:
644 		{
645 			rOutStm << "<INTERFACE>" << endl
646                     << GetName().GetBuffer();
647 			if ( GetAutomation() )
648 				rOutStm << " ( Automation ) ";
649 			rOutStm << endl;
650 			WriteDescription( rOutStm );
651 			rOutStm	<< "</INTERFACE>" << endl << endl;
652 
653 			// alle Attribute schreiben
654 			sal_uLong n;
655 			for( n = 0; n < aAttrList.Count(); n++ )
656 			{
657 				SvMetaAttribute * pAttr = aAttrList.GetObject( n );
658 				if( !pAttr->GetHidden() )
659 				{
660 					if( pAttr->IsMethod() )
661 						pAttr->Write( rBase, rOutStm, nTab, nT, WA_METHOD );
662 
663 					if( pAttr->IsVariable() )
664 						pAttr->Write( rBase, rOutStm, nTab, nT, WA_VARIABLE );
665 				}
666 			}
667 
668 			break;
669 		}
670         default:
671             break;
672 	}
673 }
674 
675 /*************************************************************************
676 |*    SvMetaClass::WriteSlotParamArray()
677 |*
678 |*    Beschreibung
679 *************************************************************************/
680 sal_uInt16 SvMetaClass::WriteSlotParamArray( SvIdlDataBase & rBase,
681 										SvSlotElementList & rSlotList,
682 										SvStream & rOutStm )
683 {
684 	sal_uInt16 nCount = 0;
685     for( sal_uLong n = 0; n < rSlotList.Count(); n++ )
686     {
687 		SvSlotElement *pEle = rSlotList.GetObject( n );
688 		SvMetaSlot *pAttr = pEle->xSlot;
689 		nCount = nCount + pAttr->WriteSlotParamArray( rBase, rOutStm );
690     }
691 
692 	return nCount;
693 }
694 
695 /*************************************************************************
696 |*    SvMetaClass::WriteSlots()
697 |*
698 |*    Beschreibung
699 *************************************************************************/
700 sal_uInt16 SvMetaClass::WriteSlots( const ByteString & rShellName,
701 								sal_uInt16 nCount, SvSlotElementList & rSlotList,
702 								SvIdlDataBase & rBase,
703 								SvStream & rOutStm )
704 {
705 	sal_uInt16 nSCount = 0;
706     for( sal_uLong n = 0; n < rSlotList.Count(); n++ )
707     {
708 		rSlotList.Seek(n);
709 		SvSlotElement * pEle = rSlotList.GetCurObject();
710 		SvMetaSlot * pAttr = pEle->xSlot;
711 		nSCount = nSCount + pAttr->WriteSlotMap( rShellName, nCount + nSCount,
712 										rSlotList, pEle->aPrefix, rBase,
713 										rOutStm );
714     }
715 
716 	return nSCount;
717 }
718 
719 /*************************************************************************
720 |*    SvMetaClass::InsertSlots()
721 |*
722 |*    Beschreibung
723 *************************************************************************/
724 void SvMetaClass::InsertSlots( SvSlotElementList& rList, SvULongs& rSuperList,
725 							SvMetaClassList &rClassList,
726 							const ByteString & rPrefix, SvIdlDataBase& rBase)
727 {
728 	// Wurde diese Klasse schon geschrieben ?
729 	if ( rClassList.GetPos(this) != LIST_ENTRY_NOTFOUND )
730 		return;
731 
732 	rClassList.Insert(this, LIST_APPEND);
733 
734 	// alle direkten Attribute schreiben
735 	sal_uLong n;
736     for( n = 0; n < aAttrList.Count(); n++ )
737     {
738 		SvMetaAttribute * pAttr = aAttrList.GetObject( n );
739 
740 		sal_uLong nId = pAttr->GetSlotId().GetValue();
741 		sal_uInt16 nPos;
742 		for ( nPos=0; nPos < rSuperList.Count(); nPos++ )
743 		{
744             if ( rSuperList.GetObject(nPos) == nId )
745 				break;
746 		}
747 
748 		if( nPos == rSuperList.Count() )
749 		{
750 			// nur schreiben, wenn nicht schon bei SubClass oder
751 			// importiertem Interface geschrieben
752             rSuperList.Insert( nId, nPos );
753 			pAttr->Insert(rList, rPrefix, rBase);
754 		}
755     }
756 
757 	// Alle schon von SuperShells importierten Interfaces sollen nicht
758 	// mehr geschrieben werden
759 	// Es ist also verboten, da\s Shell und SuperShell die gleiche Klasse
760 	// direkt importieren !
761 	if( IsShell() && aSuperClass.Is() )
762 		aSuperClass->FillClasses( rClassList );
763 
764 	// alle Attribute der importierten Klassen schreiben, sofern diese nicht
765 	// schon von der Superklasse importiert wurden
766 	for( n = 0; n < aClassList.Count(); n++ )
767 	{
768 		SvClassElement * pEle = aClassList.GetObject( n );
769 		SvMetaClass * pCl = pEle->GetClass();
770 		ByteString rPre = rPrefix;
771 		if( rPre.Len() && pEle->GetPrefix().Len() )
772 			rPre += '.';
773 		rPre += pEle->GetPrefix();
774 
775 		// Zun"achst die direkt importierten Interfaces schreiben
776 		pCl->InsertSlots( rList, rSuperList, rClassList, rPre, rBase );
777 	}
778 
779 	// Superklassen nur schreiben, wenn keine Shell und nicht in der Liste
780 	if( !IsShell() && aSuperClass.Is() )
781 	{
782 		aSuperClass->InsertSlots( rList, rSuperList, rClassList, rPrefix, rBase );
783 	}
784 }
785 
786 /*************************************************************************
787 |*    SvMetaClass::FillClasses()
788 |*
789 |*    Beschreibung
790 *************************************************************************/
791 void SvMetaClass::FillClasses( SvMetaClassList & rList )
792 {
793 	// Bin ich noch nicht drin ?
794 	if ( rList.GetPos(this) == LIST_ENTRY_NOTFOUND )
795 	{
796 		rList.Insert(this, LIST_APPEND);
797 
798 		// Meine Imports
799 		for( sal_uLong n = 0; n < aClassList.Count(); n++ )
800 		{
801 			SvClassElement * pEle = aClassList.GetObject( n );
802 			SvMetaClass * pCl = pEle->GetClass();
803 			pCl->FillClasses( rList );
804 		}
805 
806 		// Meine Superklasse
807 		if( aSuperClass.Is() )
808 			aSuperClass->FillClasses( rList );
809 	}
810 }
811 
812 
813 /*************************************************************************
814 |*    SvMetaClass::WriteSlotStubs()
815 |*
816 |*    Beschreibung
817 *************************************************************************/
818 void SvMetaClass::WriteSlotStubs( const ByteString & rShellName,
819 								SvSlotElementList & rSlotList,
820                                 ByteStringList & rList,
821 								SvStream & rOutStm )
822 {
823 	// alle Attribute schreiben
824     for( sal_uLong n = 0; n < rSlotList.Count(); n++ )
825     {
826 		SvSlotElement *pEle = rSlotList.GetObject( n );
827 		SvMetaSlot *pAttr = pEle->xSlot;
828 		pAttr->WriteSlotStubs( rShellName, rList, rOutStm );
829     }
830 }
831 
832 /*************************************************************************
833 |*    SvMetaClass::WriteSfx()
834 |*
835 |*    Beschreibung
836 *************************************************************************/
837 void SvMetaClass::WriteSfx( SvIdlDataBase & rBase, SvStream & rOutStm )
838 {
839 	WriteStars( rOutStm );
840     // Klasse definieren
841     rOutStm << "#ifdef " << GetName().GetBuffer() << endl;
842     rOutStm << "#undef ShellClass" << endl;
843     rOutStm << "#undef " << GetName().GetBuffer() << endl;
844     rOutStm << "#define ShellClass " << GetName().GetBuffer() << endl;
845 
846 //    rOutStm << "SFX_TYPELIB(" << GetName().GetBuffer() << ',' << endl
847 //        << "\t/* library type */"
848 //        << '"' << ByteString( GetModule()->GetUUId().GetHexName(), RTL_TEXTENCODING_UTF8 ).GetBuffer() << "\"," << endl
849 //        << "\t\"" << GetModule()->GetTypeLibFileName().GetBuffer() << "\","
850 //        << ByteString::CreateFromInt32( GetModule()->GetVersion().GetMajorVersion() ).GetBuffer() << ','
851 //        << ByteString::CreateFromInt32( GetModule()->GetVersion().GetMinorVersion() ).GetBuffer() << ',' << endl
852 //        << "\t/* shell type   */"
853 //        << '"';
854 //    if( xAutomationInterface.Is() )
855 //        rOutStm << ByteString( xAutomationInterface->GetUUId().GetHexName(), RTL_TEXTENCODING_UTF8 ).GetBuffer();
856 //    else
857 //        rOutStm << ByteString( GetUUId().GetHexName(), RTL_TEXTENCODING_UTF8 ).GetBuffer();
858 //    rOutStm << "\");" << endl << endl;
859 
860 	// Fuer Interfaces werden kein Slotmaps geschrieben
861 	if( !IsShell() )
862 	{
863 	    rOutStm << "#endif" << endl << endl;
864 		return;
865 	}
866     // Parameter Array schreiben
867     //rOutStm << "SfxArgList " << GetName().GetBuffer() << "ArgMap[] = {" << endl;
868     rOutStm << "SFX_ARGUMENTMAP(" << GetName().GetBuffer() << ')' << endl
869 	    << '{' << endl;
870 
871 	SvULongs aSuperList;
872 	SvMetaClassList classList;
873 	SvSlotElementList aSlotList;
874 	InsertSlots(aSlotList, aSuperList, classList, ByteString(), rBase);
875 	sal_uLong n;
876 	for ( n=0; n<aSlotList.Count(); n++ )
877 	{
878 		SvSlotElement *pEle = aSlotList.GetObject( n );
879 		SvMetaSlot *pSlot = pEle->xSlot;
880 		pSlot->SetListPos(n);
881 	}
882 
883 	sal_uLong nSlotCount = aSlotList.Count();
884 
885 	// alle Attribute schreiben
886 	sal_uInt16 nArgCount = WriteSlotParamArray( rBase, aSlotList, rOutStm );
887     if( nArgCount )
888 		Back2Delemitter( rOutStm );
889 	else
890     {
891 		// mindestens einen dummy
892 		WriteTab( rOutStm, 1 );
893 		rOutStm << "SFX_ARGUMENT( 0, 0, SfxVoidItem )" << endl;
894     }
895     rOutStm << endl << "};" << endl << endl;
896 
897     ByteStringList aStringList;
898 	WriteSlotStubs( GetName(), aSlotList, aStringList, rOutStm );
899 	ByteString * pStr = aStringList.First();
900 	while( pStr )
901 	{
902 		delete pStr;
903 		pStr = aStringList.Next();
904 	}
905 
906     rOutStm << endl;
907 
908     // Slotmap schreiben
909     rOutStm << "SFX_SLOTMAP_ARG(" << GetName().GetBuffer() << ')' << endl
910 	    << '{' << endl;
911 
912 	// alle Attribute schreiben
913 	WriteSlots( GetName(), 0, aSlotList, rBase, rOutStm );
914     if( nSlotCount )
915 		Back2Delemitter( rOutStm );
916 	else
917     {
918 		// mindestens einen dummy
919 		WriteTab( rOutStm, 1 );
920         rOutStm << "SFX_SLOT_ARG(" << GetName().GetBuffer()
921 				<< ", 0, 0, "
922 				<< "SFX_STUB_PTR_EXEC_NONE,"
923 				<< "SFX_STUB_PTR_STATE_NONE,"
924 				<< "0, SfxVoidItem, 0, 0, \"\", 0 )" << endl;
925     }
926     rOutStm << endl << "};" << endl << "#endif" << endl << endl;
927 
928     for( n=0; n<aSlotList.Count(); n++ )
929     {
930 		aSlotList.Seek(n);
931 		SvSlotElement* pEle = aSlotList.GetCurObject();
932 		SvMetaSlot* pAttr = pEle->xSlot;
933 		pAttr->ResetSlotPointer();
934 	}
935 
936 	for ( n=0; n<aSlotList.Count(); n++ )
937 		delete aSlotList.GetObject(n);
938 }
939 
940 void SvMetaClass::WriteHelpIds( SvIdlDataBase & rBase, SvStream & rOutStm,
941 							Table* pTable )
942 {
943     for( sal_uLong n=0; n<aAttrList.Count(); n++ )
944     {
945 		SvMetaAttribute * pAttr = aAttrList.GetObject( n );
946 		pAttr->WriteHelpId( rBase, rOutStm, pTable );
947     }
948 }
949 
950 /*************************************************************************
951 |*    SvMetaShell::WriteSrc()
952 *************************************************************************/
953 void SvMetaClass::WriteSrc( SvIdlDataBase & rBase, SvStream & rOutStm,
954                              Table * pTable )
955 {
956     for( sal_uLong n=0; n<aAttrList.Count(); n++ )
957     {
958 		SvMetaAttribute * pAttr = aAttrList.GetObject( n );
959 		pAttr->WriteSrc( rBase, rOutStm, pTable );
960     }
961 }
962 
963 /*************************************************************************
964 |*    SvMetaClass::WriteHxx()
965 |*
966 |*    Beschreibung
967 *************************************************************************/
968 void SvMetaClass::WriteHxx( SvIdlDataBase &, SvStream & rOutStm, sal_uInt16 )
969 {
970 	ByteString aSuperName( "SvDispatch" );
971 	if( GetSuperClass() )
972 		aSuperName = GetSuperClass()->GetName();
973     const char * pSup = aSuperName.GetBuffer();
974 
975     rOutStm
976     << "class " << GetSvName().GetBuffer()
977 	<< ": public " << pSup << endl
978 	<< '{' << endl
979 	<< "protected:" << endl
980     << "\tvirtual SvGlobalName  GetTypeName() const;" << endl
981     << "\tvirtual sal_Bool          FillTypeLibInfo( SvGlobalName *, sal_uInt16 * pMajor," << endl
982     << "\t                         			     sal_uInt16 * pMinor ) const;" << endl
983     << "\tvirtual sal_Bool          FillTypeLibInfo( ByteString * pName, sal_uInt16 * pMajor," << endl;
984 	rOutStm
985     << "\t			                             sal_uInt16 * pMinor ) const;" << endl
986     << "\tvirtual void 			Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) = 0;" << endl
987 	<< "public:" << endl
988 	<< "\t static SvGlobalName  ClassName()" << endl
989     << "\t                      { return SvGlobalName( " << ByteString( GetUUId().GetctorName(), RTL_TEXTENCODING_UTF8 ).GetBuffer() << " ); }" << endl
990 	<< "};" << endl;
991 }
992 
993 /*************************************************************************
994 |*    SvMetaClass::WriteCxx()
995 |*
996 |*    Beschreibung
997 *************************************************************************/
998 void SvMetaClass::WriteCxx( SvIdlDataBase &, SvStream & rOutStm, sal_uInt16 )
999 {
1000 	ByteString aSuperName( "SvDispatch" );
1001 	if( GetSuperClass() )
1002 		aSuperName = GetSuperClass()->GetName();
1003     const char * pSup = aSuperName.GetBuffer();
1004 
1005 	ByteString name = GetSvName();
1006 	// GetTypeName
1007     rOutStm << "SvGlobalName " << name.GetBuffer() << "::GetTypeName() const" << endl
1008 	<< '{' << endl
1009 	<< "\treturn ClassName();" << endl
1010 	<< '}' << endl;
1011 
1012 	SvMetaModule * pMod = GetModule();
1013 	// FillTypeLibInfo
1014     rOutStm << "sal_Bool " << name.GetBuffer() << "::FillTypeLibInfo( SvGlobalName * pGN," << endl
1015 	<< "\t								 sal_uInt16 * pMajor," << endl
1016 	<< "\t                         		 sal_uInt16 * pMinor ) const" << endl
1017 	<< '{' << endl
1018     << "\tSvGlobalName aN( " << ByteString( pMod->GetUUId().GetctorName(), RTL_TEXTENCODING_UTF8 ).GetBuffer() << " );" << endl;
1019 	rOutStm << "\t*pGN = aN;" << endl
1020     << "\t*pMajor = " << ByteString::CreateFromInt32(pMod->GetVersion().GetMajorVersion()).GetBuffer() << ';' << endl
1021     << "\t*pMinor = " << ByteString::CreateFromInt32(pMod->GetVersion().GetMinorVersion()).GetBuffer() << ';' << endl
1022 	<< "\treturn sal_True;" << endl
1023 	<< '}' << endl;
1024 
1025 	// FillTypeLibInfo
1026     rOutStm << "sal_Bool " << name.GetBuffer() << "::FillTypeLibInfo( ByteString * pName,"
1027 	<< "\t								 sal_uInt16 * pMajor," << endl
1028 	<< "\t                         		 sal_uInt16 * pMinor ) const" << endl;
1029 	rOutStm << '{' << endl
1030     << "\t*pName = \"" << pMod->GetTypeLibFileName().GetBuffer()  << "\";" << endl
1031     << "\t*pMajor = " << ByteString::CreateFromInt32(pMod->GetVersion().GetMajorVersion()).GetBuffer() << ';' << endl
1032     << "\t*pMinor = " << ByteString::CreateFromInt32(pMod->GetVersion().GetMinorVersion()).GetBuffer() << ';' << endl
1033 	<< "\treturn sal_True;" << endl
1034 	<< '}' << endl;
1035 
1036     rOutStm << "void " << name.GetBuffer() << "::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )" << endl
1037 	<< '{' << endl
1038 	<< "\t" << pSup << "::Notify( rBC, rHint );" << endl
1039 	<< '}' << endl;
1040 }
1041 
1042 #endif // IDL_COMPILER
1043 
1044