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