00001 #include "stdafx.h"
00002
00003 #include "GMECOM.h"
00004 #include "Exceptions.h"
00005 #include "Builder.h"
00006
00007 #define E_INCONSISTENCY 0x87770100
00008
00009
00010
00012 IMPLEMENT_DYNAMIC(CBuilder,CObject)
00013
00014 CBuilder* CBuilder::theInstance = NULL;
00015
00016 #ifdef _EXE
00017 #define STRONG_LOOKUP
00018 #endif
00019
00020 static const CBuilderConnectionList EmptyList;
00021
00022 CBuilder::CBuilder(IMgaProject* ig, CStringMap *pmap) : parametermap(pmap) {
00023 ASSERT( "Project must not be null" );
00024 ciGme = ig;
00025
00026 ciTerr = NULL;
00027 COMCHECK2(ciGme, ciGme->get_ActiveTerritory(&ciTerr));
00028
00029 COMCHECK2(ciGme, ciGme->get_RootFolder(&ciRootFolder));
00030 ASSERT("Failed to retreive root folder");
00031
00032 ASSERT( theInstance == NULL );
00033 theInstance = this;
00034
00035 objectmap.InitHashTable(733);
00036 connectionmap.InitHashTable(733);
00037
00038 CBuilderFactory::CheckKindNames(ciRootFolder);
00039
00040 ASSERT( folders.IsEmpty() );
00041
00042 rootfolder = new CBuilderFolder(ciRootFolder, NULL);
00043
00044 rootfolder->Resolve();
00045 }
00046
00047 CBuilder::~CBuilder()
00048 {
00049 delete rootfolder;
00050 ASSERT( !folders.GetHeadPosition() );
00051
00052
00053 #ifdef STRONG_LOOKUP
00054 pos = objectmap.GetStartPosition();
00055 while(pos)
00056 {
00057 IUnknown* iunknown = NULL;
00058 CBuilderObject* pobject = NULL;
00059 objectmap.GetNextAssoc(pos, iunknown, pobject);
00060 ASSERT(iunknown);
00061 iunknown->Release();
00062 }
00063
00064 pos = connectionmap.GetStartPosition();
00065 while(pos)
00066 {
00067 IUnknown* iunknown = NULL;
00068 CBuilderConnection* pconnection = NULL;
00069 connectionmap.GetNextAssoc(pos, iunknown, pconnection);
00070 ASSERT(iunknown);
00071 iunknown->Release();
00072 }
00073 #endif
00074
00075 ASSERT( theInstance );
00076 theInstance = NULL;
00077 }
00078
00079 void CBuilder::SetObjectRef(IMgaFCO* i, CBuilderObject* o)
00080 {
00081 ASSERT(i && o);
00082
00083 #ifdef STRONG_LOOKUP
00084 CComPtr<IUnknown> iu;
00085 CComPtr<IMgaFCO> ii = i;
00086 ii.QueryInterface(&iu);
00087 ASSERT(iu);
00088
00089
00090
00091
00092
00093 CBuilderObject* o2;
00094 if( objectmap.Lookup(iu, o2) ) {
00095 ASSERT( o == o2 );
00096 }
00097 else
00098 objectmap.SetAt(iu, o);
00099 #else
00100 objectmap.SetAt(i ,o);
00101 #endif
00102 }
00103
00104
00105 CBuilderObject* CBuilder::FindObject(IMgaFCO* i)
00106 {
00107 ASSERT(i);
00108
00109 #ifdef STRONG_LOOKUP
00110 CComPtr<IUnknown> iu;
00111 CComPtr<IMgaFCO> ii = i;
00112 ii.QueryInterface(&iu);
00113 ASSERT(iu);
00114
00115 CBuilderObject* o = NULL;
00116
00117 if( !objectmap.Lookup(iu, o) )
00118 {
00119 CBstr idstr;
00120 COMCHECK2( i, i->get_ID(idstr) );
00121 ASSERT(false);
00122 }
00123 ASSERT(o);
00124
00125 return o;
00126 #else
00127 CBuilderObject* o = NULL;
00128
00129 if( !objectmap.Lookup(i, o) )
00130 {
00131 CBstr idstr;
00132 COMCHECK2(i, i->get_ID(idstr) );
00133 ASSERT(false);
00134 }
00135 ASSERT(o);
00136
00137 return o;
00138 #endif
00139 }
00140
00141 void CBuilder::ForgetObjectRef(IMgaFCO* i)
00142 {
00143 ASSERT(i);
00144
00145 #ifdef STRONG_LOOKUP
00146 CComPtr<IUnknown> iu;
00147 CComPtr<IMgaFCO> ii = i;
00148 ii.QueryInterface(&iu);
00149 ASSERT(iu);
00150 objectmap.RemoveKey(iu);
00151 #else
00152 objectmap.RemoveKey(i);
00153 #endif
00154 }
00155
00156
00157 CBuilderFolder *CBuilder::GetFolder(CString name) const
00158 {
00159 POSITION pos = folders.GetHeadPosition();
00160 while(pos) {
00161 CBuilderFolder *folder = folders.GetNext(pos);
00162 if(folder->GetName() == name)
00163 return folder;
00164 }
00165 return 0;
00166 }
00167
00168 CString CBuilder::GetProjectName() const
00169 {
00170 CBstr bstr;
00171 COMCHECK2(ciGme, ciGme->get_Name(bstr) );
00172 return bstr;
00173 }
00174
00175
00176 CString CBuilder::GetParameter(CString name) {
00177 CString str;
00178 if(parametermap) parametermap->Lookup(name, str);
00179 return str;
00180 }
00181
00182 bool CBuilder::PutParameter(CString name, CString value) {
00183 if(!parametermap) return false;
00184 parametermap->SetAt(name,value);
00185 return true;
00186 }
00187
00188 EditorModes CBuilder::GetEditorMode() const
00189 {
00190 ASSERT( ciGme != NULL );
00191 EditorModes mode = (EditorModes)0;
00192
00193 return mode;
00194 }
00195
00196 void CBuilder::SetEditorMode(EditorModes mode)
00197 {
00198 ASSERT( ciGme != NULL );
00199
00200 }
00201
00202 bool CBuilder::BeginTransaction(transactiontype_enum mode)
00203 {
00204 ASSERT(ciGme);
00205 ASSERT(ciTerr);
00206 return SUCCEEDED(ciGme->BeginTransaction(ciTerr, mode));
00207 }
00208
00209 bool CBuilder::CommitTransaction()
00210 {
00211 ASSERT(ciGme);
00212 return SUCCEEDED(ciGme->CommitTransaction());
00213 }
00214
00215 void CBuilder::AbortTransaction()
00216 {
00217 ASSERT(ciGme);
00218 COMCHECK2(ciGme, ciGme->AbortTransaction());
00219 }
00220
00222 IMPLEMENT_DYNAMIC(CBuilderFolder,CObject)
00223
00224 CBuilderFolder::CBuilderFolder(IMgaFolder *ic, CBuilderFolder *parent) : ciFolder(ic), parentfolder(parent)
00225 {
00226 ASSERT( ciFolder );
00227 CBuilder::theInstance->folders.AddTail(this);
00228
00229 CComPtr<IMgaFCOs> psa;
00230 COMCHECK2(ciFolder, ciFolder->get_ChildFCOs(&psa));
00231 MGACOLL_ITERATE(IMgaFCO, psa) {
00232 CComPtr<IMgaModel> mm;
00233 CComPtr<IMgaAtom> aa;
00234 CComPtr<IMgaReference> rr;
00235 CComPtr<IMgaSimpleConnection> cc;
00236 CComPtr<IMgaSet> ss;
00237 MGACOLL_ITER.QueryInterface(&mm);
00238 MGACOLL_ITER.QueryInterface(&aa);
00239 MGACOLL_ITER.QueryInterface(&rr);
00240 MGACOLL_ITER.QueryInterface(&cc);
00241 MGACOLL_ITER.QueryInterface(&ss);
00242 if(mm) {
00243 CBuilderModel * bm = CBuilderFactory::Create(mm, NULL);
00244 rootModels.AddTail( bm);
00245 rootObjects.AddTail( bm);
00246 }
00247 else if( aa)
00248 rootObjects.AddTail( CBuilderFactory::Create( aa, NULL));
00249 else if( rr)
00250 rootObjects.AddTail( CBuilderFactory::Create( rr, NULL));
00251 else if( cc)
00252 rootObjects.AddTail( CBuilderFactory::Create( cc, NULL));
00253 else if( ss)
00254 rootObjects.AddTail( CBuilderFactory::Create( ss, NULL));
00255 else
00256 ASSERT(0);
00257 } MGACOLL_ITERATE_END;
00258
00259 {
00260 CBstr bstr;
00261 COMCHECK2(ciFolder, ciFolder->get_Name(bstr) );
00262 name = bstr;
00263 }
00264
00265 {
00266 CBstr bstr;
00267 COMCHECK2(GetMeta(), GetMeta()->get_Name(bstr) );
00268 kindName = bstr;
00269 kindTitle = kindName;
00270 }
00271 {
00272 CBstr bstr;
00273 COMCHECK2(GetMeta(), GetMeta()->get_DisplayedName(bstr) );
00274 kindTitle = bstr;
00275 }
00276
00277 CComPtr<IMgaFolders> sfs;
00278 COMCHECK2(ciFolder, ciFolder->get_ChildFolders(&sfs));
00279 MGACOLL_ITERATE(IMgaFolder, sfs) {
00280 subfolders.AddTail(new CBuilderFolder(MGACOLL_ITER, this));
00281 } MGACOLL_ITERATE_END;
00282 }
00283
00284 CBuilderFolder::~CBuilderFolder() {
00285 POSITION pos = rootModels.GetHeadPosition();
00286 while(pos)
00287 {
00288 delete rootModels.GetNext(pos);
00289 ASSERT( rootModels.GetHeadPosition() == pos );
00290 }
00291
00292 while(!subfolders.IsEmpty()) delete subfolders.RemoveHead();
00293
00294 ASSERT( CBuilder::theInstance );
00295 {
00296 POSITION pos = CBuilder::theInstance->folders.Find(this);
00297 ASSERT( pos );
00298 CBuilder::theInstance->folders.RemoveAt(pos);
00299 }
00300 }
00301
00302 CComPtr<IMgaMetaFolder> CBuilderFolder::GetMeta() const {
00303 CComPtr<IMgaMetaFolder> cmeta;
00304 COMCHECK2(ciFolder, ciFolder->get_MetaFolder(&cmeta) );
00305 return cmeta;
00306 }
00307
00308 void CBuilderFolder::Resolve()
00309 {
00310 POSITION pos = rootModels.GetHeadPosition();
00311 while(pos) {
00312 rootModels.GetNext(pos)->Resolve();
00313 }
00314
00315 pos = subfolders.GetHeadPosition();
00316 while(pos) {
00317 subfolders.GetNext(pos)->Resolve();
00318 }
00319 }
00320
00321 CBuilderModel *CBuilderFolder::GetRootModel(CString name) const
00322 {
00323 POSITION pos = rootModels.GetHeadPosition();
00324 while(pos) {
00325 CBuilderModel *root = rootModels.GetNext(pos);
00326 if(root->GetName() == name)
00327 return root;
00328 }
00329 return 0;
00330 }
00331
00332 void CBuilderFolder::RemoveRootModel(CBuilderModel *model)
00333 {
00334 ASSERT(model);
00335 POSITION pos = rootModels.Find(model);
00336 if(pos)
00337 rootModels.RemoveAt(pos);
00338 }
00339
00340 CBuilderModel *CBuilderFolder::CreateNewModel(CString kindName, CBuilderModel* baseType, bool instance)
00341 {
00342 CComPtr<IMgaMetaFolder> fmeta;
00343 CComPtr<IMgaMetaFCO> cmeta;
00344 COMCHECK2(ciFolder, ciFolder->get_MetaFolder(&fmeta) );
00345 COMCHECK2(fmeta, fmeta->get_LegalRootObjectByName((CBstrIn)kindName, &cmeta) );
00346 ASSERT( cmeta != NULL );
00347 CComPtr<IMgaFCO> i;
00348 if (baseType) {
00349 COMCHECK2(ciFolder, ciFolder->DeriveRootObject(baseType->GetIModel(), instance ? VARIANT_TRUE : VARIANT_FALSE ,&i) );
00350 }
00351 else {
00352 COMCHECK2(ciFolder, ciFolder->CreateRootObject(cmeta ,&i) );
00353 }
00354 ASSERT( i != NULL );
00355
00356 CBuilderModel* o = CBuilderFactory::Create(CComQIPtr<IMgaModel>(i), NULL);
00357 rootModels.AddTail(o);
00358 rootObjects.AddTail(o);
00359
00360 return o;
00361 }
00362
00363 CBuilderFolder *CBuilderFolder::CreateNewFolder(CString kindName)
00364 {
00365 CComPtr<IMgaMetaFolder> fmeta;
00366 CComPtr<IMgaMetaFolder> cmeta;
00367 COMCHECK2(ciFolder, ciFolder->get_MetaFolder(&fmeta) );
00368 COMCHECK2(ciFolder, fmeta->get_LegalChildFolderByName((CBstrIn)kindName, &cmeta) );
00369 ASSERT( cmeta != NULL );
00370 CComPtr<IMgaFolder> i;
00371 COMCHECK2(ciFolder, ciFolder->CreateFolder(cmeta ,&i) );
00372 ASSERT( i != NULL );
00373
00374 CBuilderFolder* o = new CBuilderFolder(i, this);
00375 subfolders.AddTail(o);
00376
00377 return o;
00378 }
00379
00380
00381 CBuilderAtom *CBuilderFolder::CreateNewAtom(CString kindName, CBuilderAtom* baseType, bool instance) {
00382
00383 CComPtr<IMgaMetaFolder> fmeta;
00384 CComPtr<IMgaMetaFCO> cmeta;
00385 COMCHECK2(ciFolder, ciFolder->get_MetaFolder(&fmeta) );
00386 COMCHECK2(fmeta, fmeta->get_LegalRootObjectByName((CBstrIn)kindName, &cmeta) );
00387 ASSERT( cmeta != NULL );
00388 CComPtr<IMgaFCO> i;
00389 if (baseType) {
00390 COMCHECK2(ciFolder, ciFolder->DeriveRootObject(baseType->GetIAtom(), instance ? VARIANT_TRUE : VARIANT_FALSE ,&i) );
00391 }
00392 else {
00393 COMCHECK2(ciFolder, ciFolder->CreateRootObject(cmeta ,&i) );
00394 }
00395 ASSERT( i != NULL );
00396
00397 CBuilderAtom* o = CBuilderFactory::Create(CComQIPtr<IMgaAtom>(i), NULL);
00398
00399
00400 rootObjects.AddTail(o);
00401 return o;
00402 }
00403
00404
00405 CBuilderReference *CBuilderFolder::CreateNewReference(CString kindName, CBuilderObject *refTo, CBuilderReference* baseType, bool instance) {
00406 IMgaFCO *i = NULL;
00407 CComPtr<IMgaMetaFolder> fmeta;
00408 CComPtr<IMgaMetaFCO> cmeta;
00409 COMCHECK2(ciFolder, ciFolder->get_MetaFolder(&fmeta) );
00410 COMCHECK2(fmeta, fmeta->get_LegalRootObjectByName((CBstrIn)kindName, &cmeta) );
00411 ASSERT( cmeta != NULL );
00412 if (baseType) {
00413 COMCHECK2(ciFolder, ciFolder->DeriveRootObject(baseType->GetIRef(), instance ? VARIANT_TRUE : VARIANT_FALSE ,&i) );
00414 }
00415 else {
00416 COMCHECK2(ciFolder, ciFolder->CreateRootObject(cmeta ,&i) );
00417 }
00418 ASSERT( i != NULL );
00419
00420
00421 CBuilderReference* oo = CBuilderFactory::Create(CComQIPtr<IMgaReference>(i), NULL);
00422 oo->PutReferred(refTo);
00423 rootObjects.AddTail(oo);
00424 return oo;
00425 }
00426
00427
00428 CBuilderModelReference *CBuilderFolder::CreateNewModelReference(CString kindName, CBuilderObject *refTo)
00429 {
00430 ASSERT( refTo );
00431 ASSERT( refTo->IsKindOf(RUNTIME_CLASS(CBuilderModel)) ||
00432 refTo->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) );
00433
00434 CBuilderReference *nobj = CreateNewReference(kindName, refTo);
00435 ASSERT( nobj->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) );
00436
00437
00438 return (CBuilderModelReference *)nobj;
00439
00440 }
00441
00442 CBuilderAtomReference *CBuilderFolder::CreateNewAtomReference(CString kindName, CBuilderObject *refTo)
00443 {
00444 ASSERT( refTo );
00445 ASSERT( refTo->IsKindOf(RUNTIME_CLASS(CBuilderAtom)) ||
00446 refTo->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) );
00447
00448 CBuilderReference *nobj = CreateNewReference(kindName, refTo);
00449 ASSERT( nobj->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) );
00450
00451
00452 return (CBuilderAtomReference *)nobj;
00453 }
00454
00455
00456 CBuilderConnection *CBuilderFolder::CreateNewConnection(CString kindName, CBuilderObject *source, CBuilderObject *destination)
00457 {
00458
00459 CComPtr<IMgaFCOs> srcrefs, dstrefs;
00460 CComPtr<IMgaFCO> srcfco, dstfco;
00461 CBuilderObject const *src = source;
00462 if(src->IsKindOf(RUNTIME_CLASS(CBuilderReferencePort))) {
00463 srcfco = src->GetIObject();
00464 src = ((CBuilderReferencePort*)src)->GetOwner();
00465 while(src->IsKindOf(RUNTIME_CLASS(CBuilderModelReference))) {
00466 COMCHECK2(src->GetIObject(), src->GetIObject()->CreateCollection(&srcrefs));
00467 src=((CBuilderModelReference*)src)->GetReferred();
00468 }
00469 if(!src->IsKindOf(RUNTIME_CLASS(CBuilderModel))) BONCOMTHROW(E_INCONSISTENCY);
00470 srcfco = source->GetIObject();
00471 if(src != ((CBuilderReferencePort*)source)->GetPortObject()->GetParent()) BONCOMTHROW(E_INCONSISTENCY);
00472 }
00473 else {
00474 while(src->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference))) {
00475 COMCHECK2(src->GetIObject(), src->GetIObject()->CreateCollection(&srcrefs));
00476 src=((CBuilderAtomReference*)src)->GetReferred();
00477 }
00478
00479 srcfco = src->GetIObject();
00480 }
00481
00482 CBuilderObject const *dst = destination;
00483 if(dst->IsKindOf(RUNTIME_CLASS(CBuilderReferencePort))) {
00484 dstfco = dst->GetIObject();
00485 dst = ((CBuilderReferencePort*)dst)->GetOwner();
00486 while(dst->IsKindOf(RUNTIME_CLASS(CBuilderModelReference))) {
00487 COMCHECK2(dst->GetIObject(), dst->GetIObject()->CreateCollection(&dstrefs));
00488 dst=((CBuilderModelReference*)dst)->GetReferred();
00489 }
00490 if(!dst->IsKindOf(RUNTIME_CLASS(CBuilderModel))) BONCOMTHROW(E_INCONSISTENCY);
00491 dstfco = destination->GetIObject();
00492 if(dst != ((CBuilderReferencePort*)destination)->GetPortObject()->GetParent()) BONCOMTHROW(E_INCONSISTENCY);
00493 }
00494 else {
00495 while(dst->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference))) {
00496 COMCHECK2(dst->GetIObject(), dst->GetIObject()->CreateCollection(&dstrefs));
00497 dst=((CBuilderAtomReference*)dst)->GetReferred();
00498 }
00499
00500 dstfco = dst->GetIObject();
00501 }
00502
00503 CComPtr<IMgaMetaFolder> fmeta;
00504 CComPtr<IMgaMetaFCO> cmeta;
00505 COMCHECK2(ciFolder, ciFolder->get_MetaFolder(&fmeta) );
00506 COMCHECK2(fmeta, fmeta->get_LegalRootObjectByName((CBstrIn)kindName, &cmeta) );
00507 ASSERT( cmeta != NULL );
00508 CComPtr<IMgaFCO> i;
00509 COMCHECK2(ciFolder, ciFolder->CreateRootObject(cmeta ,&i) );
00510 ASSERT( i != NULL );
00511
00512 CBuilderConnection* o = CBuilderFactory::Create(CComQIPtr<IMgaSimpleConnection>(i), NULL);
00513 rootObjects.AddTail(o);
00514 o->Resolve();
00515 return o;
00516 }
00517
00518 CBuilderSet *CBuilderFolder::CreateNewSet(CString kindName, CBuilderSet* baseType, bool instance) {
00519 CComPtr<IMgaMetaFolder> fmeta;
00520 CComPtr<IMgaMetaFCO> cmeta;
00521 COMCHECK2(ciFolder, ciFolder->get_MetaFolder(&fmeta) );
00522 COMCHECK2(fmeta, fmeta->get_LegalRootObjectByName((CBstrIn)kindName, &cmeta) );
00523 ASSERT( cmeta != NULL );
00524 CComPtr<IMgaFCO> i;
00525 if (baseType) {
00526 COMCHECK2(ciFolder, ciFolder->DeriveRootObject(baseType->GetISet(), instance ? VARIANT_TRUE : VARIANT_FALSE ,&i) );
00527 }
00528 else {
00529 COMCHECK2(ciFolder, ciFolder->CreateRootObject(cmeta ,&i) );
00530 }
00531 ASSERT( i != NULL );
00532
00533 CBuilderSet* o = CBuilderFactory::Create(CComQIPtr<IMgaSet>(i), NULL);
00534
00535
00536 rootObjects.AddTail(o);
00537 return o;
00538 }
00539
00540 bool CBuilderFolder::GetRegistryValue(CString &path,CString &val) const
00541 {
00542 CBstr bstr;
00543 COMCHECK2(ciFolder, ciFolder->get_RegistryValue((CBstrIn)path, bstr) );
00544
00545 val = bstr;
00546 return true;
00547 }
00548
00549 bool CBuilderFolder::SetRegistryValue(CString &path,CString &val) const
00550 {
00551 if( !SUCCEEDED( ciFolder->put_RegistryValue((CBstrIn)path, (CBstrIn)val) ) )
00552 return false;
00553
00554 return true;
00555 }
00556
00558 IMPLEMENT_DYNAMIC(CBuilderObject,CObject)
00559
00560
00561 CComPtr<IMgaMetaFCO> CBuilderObject::GetMeta() const {
00562 CComPtr<IMgaMetaFCO> cmeta;
00563 COMCHECK2(ciObject, ciObject->get_Meta(&cmeta) );
00564 return cmeta;
00565 }
00566
00567
00568 CBuilderObject::CBuilderObject(IMgaFCO* io, CBuilderModel *p, bool globalregister)
00569 {
00570 ciObject = io;
00571 parent = p;
00572
00573 ASSERT(ciObject);
00574
00575 {
00576 CBstr bstr;
00577 COMCHECK2(ciObject, ciObject->get_Name(bstr) );
00578 name = bstr;
00579 }
00580
00581 {
00582 CBstr bstr;
00583 COMCHECK2(GetMeta(), GetMeta()->get_Name(bstr) );
00584 kindName = bstr;
00585 kindTitle = kindName;
00586 }
00587
00588 {
00589 CBstr bstr;
00590 CComPtr<IMgaMetaRole> rmeta;
00591 COMCHECK2(ciObject, ciObject->get_MetaRole(&rmeta) );
00592 if(rmeta) {
00593 COMCHECK2(rmeta, rmeta->get_Name(bstr) );
00594 partName = bstr;
00595 } else partName = "";
00596 }
00597
00598 if(globalregister) CBuilder::theInstance->SetObjectRef(io, this);
00599 }
00600
00601 CBuilderObject::~CBuilderObject()
00602 {
00603
00604 POSITION pos = inConnections.GetStartPosition();
00605 CString name;
00606 while(pos) {
00607 CBuilderConnectionList *list;
00608 inConnections.GetNextAssoc(pos,name,list);
00609 POSITION pos2 = list->GetHeadPosition();
00610 while(pos2)
00611 {
00612 delete list->GetNext(pos2);
00613 ASSERT( pos2 == list->GetHeadPosition() );
00614 }
00615 delete list;
00616 }
00617 pos = outConnections.GetStartPosition();
00618 while(pos) {
00619 CBuilderConnectionList *list;
00620 outConnections.GetNextAssoc(pos,name,list);
00621 POSITION pos2 = list->GetHeadPosition();
00622 while(pos2)
00623 {
00624 delete list->GetNext(pos2);
00625 ASSERT( pos2 == list->GetHeadPosition() );
00626 }
00627 delete list;
00628 }
00629
00630 pos = outConnections2.GetStartPosition();
00631 while(pos) {
00632 CBuilderConnectionList *list;
00633 outConnections2.GetNextAssoc(pos,name,list);
00634 delete list;
00635 }
00636 pos = inConnections2.GetStartPosition();
00637 while(pos) {
00638 CBuilderConnectionList *list;
00639 inConnections2.GetNextAssoc(pos,name,list);
00640 delete list;
00641 }
00642
00643
00644 ASSERT( CBuilder::theInstance );
00645 CBuilder::theInstance->ForgetObjectRef(ciObject);
00646 }
00647
00648 void CBuilderObject::Destroy()
00649 {
00650 ASSERT(ciObject);
00651
00652 POSITION pos = inConnections.GetStartPosition();
00653 CString name;
00654 while(pos) {
00655 CBuilderConnectionList *list;
00656 inConnections.GetNextAssoc(pos,name,list);
00657 POSITION pos2 = list->GetHeadPosition();
00658 while(pos2)
00659 list->GetNext(pos2)->Destroy();
00660 }
00661 pos = outConnections.GetStartPosition();
00662 while(pos) {
00663 CBuilderConnectionList *list;
00664 outConnections.GetNextAssoc(pos,name,list);
00665 POSITION pos2 = list->GetHeadPosition();
00666 while(pos2)
00667 list->GetNext(pos2)->Destroy();
00668 }
00669
00670 CComPtr<IMgaFCO> myself = GetIObject();
00671 if(parent)
00672 {
00673 parent->RemoveMemberFromSets(this);
00674
00675 delete this;
00676 }
00677 else
00678 {
00679 ASSERT( this->IsKindOf(RUNTIME_CLASS(CBuilderModel)) );
00680 delete this;
00681 }
00682 COMCHECK2(myself, myself->DestroyObject());
00683 }
00684
00685 CBuilderFolder *CBuilderObject::GetFolder() const
00686 {
00687 if( parent )
00688 return parent->GetFolder();
00689
00690 ASSERT( CBuilder::theInstance );
00691 ASSERT( this->IsKindOf(RUNTIME_CLASS(CBuilderModel)) );
00692
00693 const CBuilderFolderList *folders = CBuilder::theInstance->GetFolders();
00694 ASSERT( folders );
00695
00696 POSITION pos = folders->GetHeadPosition();
00697 while(pos)
00698 {
00699 CBuilderFolder *folder = folders->GetNext(pos);
00700
00701 const CBuilderModelList *models = folder->GetRootModels();
00702 POSITION pos2 = models->GetHeadPosition();
00703 while(pos2)
00704 if( models->GetNext(pos2) == this )
00705 return folder;
00706 }
00707 ASSERT(false);
00708 return NULL;
00709 }
00710
00711 void CBuilderObject::GetNamePath(CString &namePath) const
00712 {
00713 GetExtendedName(namePath, _T("__"),true);
00714 }
00715
00716 void CBuilderObject::GetExtendedName(CString &extName,CString separator,bool startWithRoot) const
00717 {
00718 if(!startWithRoot)
00719 extName += GetName();
00720 const CBuilderObject *parent = GetParent();
00721 if(parent) {
00722 if(!startWithRoot)
00723 extName += separator;
00724 parent->GetExtendedName(extName,separator,startWithRoot);
00725 if(startWithRoot)
00726 extName += separator;
00727 }
00728 if(startWithRoot)
00729 extName += GetName();
00730 }
00731
00732 bool CBuilderObject::GetLocation(CString &aspectName,CRect &loc)
00733 {
00734 if(!parent)
00735 return false;
00736
00737 CComPtr<IMgaMetaAspect> asp;
00738 CComQIPtr<IMgaMetaModel> pmetam = parent->GetMeta();
00739 COMCHECK2(pmetam, pmetam->get_AspectByName((CBstrIn)aspectName, &asp));
00740 CComPtr<IMgaPart> part;
00741 COMCHECK2(this->GetIObject(), this->GetIObject()->get_Part(asp, &part));
00742
00743 long x, y;
00744 COMCHECK2(part, part->GetGmeAttrs(NULL, &x, &y));
00745 loc.left = x, loc.top = y, loc.right = x + 100, loc.bottom = y + 100;
00746 return true;
00747 }
00748
00749 bool CBuilderObject::SetLocation(CString aspectName,CPoint loc)
00750 {
00751 if(!parent)
00752 return false;
00753
00754 CComPtr<IMgaMetaAspect> asp;
00755 CComQIPtr<IMgaMetaModel> pmetam = parent->GetMeta();
00756 COMCHECK2(pmetam, pmetam->get_AspectByName((CBstrIn)aspectName, &asp));
00757 CComPtr<IMgaPart> part;
00758 COMCHECK2(this->GetIObject(), this->GetIObject()->get_Part(asp, &part));
00759
00760 COMCHECK2(part, part->SetGmeAttrs(NULL, loc.x, loc.y));
00761 return true;
00762 }
00763
00764 short CBuilderObject::GetNamePosition()
00765 {
00766 ASSERT( ciObject );
00767
00768 short pos = 0;
00769
00770
00771
00772 return pos;
00773 }
00774
00775 void CBuilderObject::SetNamePosition(short pos)
00776 {
00777 ASSERT( ciObject );
00778
00779
00780
00781 }
00782
00783 void CBuilderObject::DisplayMessage(CString &msg,bool error) const
00784 {
00785 CString namePath;
00786 GetNamePath(namePath);
00787 AfxMessageBox(msg + _T("\n") + namePath,error ? MB_OK | MB_ICONSTOP : MB_OK);
00788 }
00789
00790
00791 bool CBuilderObject::GetRegistryValue(CString &path,CString &val) const
00792 {
00793 CBstr bstr;
00794 COMCHECK2(ciObject, ciObject->get_RegistryValue((CBstrIn)path, bstr) );
00795
00796 val = bstr;
00797 return true;
00798 }
00799
00800 bool CBuilderObject::SetRegistryValue(CString &path,CString &val) const
00801 {
00802 if( !SUCCEEDED( ciObject->put_RegistryValue((CBstrIn)path, (CBstrIn)val) ) )
00803 return false;
00804
00805 return true;
00806 }
00807
00808
00809 bool CBuilderObject::GetAttribute(CString &name,CString &val) const
00810 {
00811 CBstr bstr;
00812 if ( ! SUCCEEDED( ciObject->get_StrAttrByName((CBstrIn)name, bstr) ) )
00813 return false;
00814
00815 val = bstr;
00816 return true;
00817 }
00818
00819 bool CBuilderObject::GetAttribute(CString &name,int &val) const
00820 {
00821 long l;
00822 if(! SUCCEEDED( ciObject->get_IntAttrByName((CBstrIn)name, &l) ) ) return false;
00823 val = l;
00824 return true;
00825 }
00826
00827 bool CBuilderObject::GetAttribute(CString &name,bool &val) const
00828 {
00829 VARIANT_BOOL vb;
00830
00831 if( !SUCCEEDED( ciObject->get_BoolAttrByName((CBstrIn)name, &vb) ) )
00832 return false;
00833
00834 val = (vb != 0);
00835 return true;
00836 }
00837
00838 bool CBuilderObject::GetAttribute(CString &name,double &val) const
00839 {
00840
00841 if( !SUCCEEDED( ciObject->get_FloatAttrByName((CBstrIn)name, &val) ) )
00842 return false;
00843
00844 return true;
00845 }
00846
00847 bool CBuilderObject::GetAttribute(CString &name,CBuilderObject *&val) const
00848 {
00849
00850 CComPtr<IMgaFCO> valp;
00851 if( !SUCCEEDED( ciObject->get_RefAttrByName((CBstrIn)name, &valp) ) )
00852 return false;
00853
00854 if(!valp) val = NULL;
00855 else val = CBuilder::theInstance->FindObject(valp);
00856 return true;
00857 }
00858
00859
00860 int CBuilderObject::GetAttributeStatus(CString attrName) {
00861 CComPtr<IMgaMetaAttribute> mattr;
00862 CComPtr<IMgaAttribute> attr;
00863 COMCHECK2(GetMeta(), GetMeta()->get_AttributeByName(CComBSTR(attrName), &mattr));
00864 COMCHECK2(ciObject, ciObject->get_Attribute(mattr, &attr));
00865
00866 long status;
00867 COMCHECK2(attr, attr->get_Status(&status));
00868 return((int) status);
00869 }
00870
00871 bool CBuilderObject::SetAttribute(CString &name, CString &val)
00872 {
00873 if( !SUCCEEDED( ciObject->put_StrAttrByName((CBstrIn)name, (CBstrIn)val) ) )
00874 return false;
00875
00876 return true;
00877 }
00878
00879 bool CBuilderObject::SetAttribute(CString &name, int val)
00880 {
00881 if( !SUCCEEDED( ciObject->put_IntAttrByName((CBstrIn)name, val) ) )
00882 return false;
00883
00884 return true;
00885 }
00886
00887 bool CBuilderObject::SetAttribute(CString &name, bool val)
00888 {
00889 if( !SUCCEEDED( ciObject->put_BoolAttrByName((CBstrIn)name, val ? -1 : 0) ) )
00890 return false;
00891
00892 return true;
00893 }
00894
00895 bool CBuilderObject::SetAttribute(CString &name, double val)
00896 {
00897 if( !SUCCEEDED( ciObject->put_FloatAttrByName((CBstrIn)name, val) ) )
00898 return false;
00899
00900 return true;
00901 }
00902
00903 bool CBuilderObject::SetAttribute(CString &name, CBuilderObject *val)
00904 {
00905 CComPtr<IMgaFCO> valp;
00906 if(val) valp = val->GetIObject();
00907 if( !SUCCEEDED( ciObject->put_RefAttrByName((CBstrIn)name, valp) ) )
00908 return false;
00909
00910 return true;
00911 }
00912
00913 void CBuilderObject::GetAttributeNames(CStringList &list, attval_enum type, attval_enum sectype) const
00914 {
00915 ASSERT( list.IsEmpty() );
00916
00917 CComPtr<IMgaMetaAttributes> mattrs;
00918 COMCHECK2(GetMeta(), GetMeta()->get_Attributes(&mattrs));
00919 MGACOLL_ITERATE(IMgaMetaAttribute, mattrs) {
00920 attval_enum t;
00921 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ValueType(&t) );
00922 if(t == type || t == sectype) {
00923 CBstr n;
00924 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Name(n) );
00925 list.AddTail(n);
00926 }
00927
00928 } MGACOLL_ITERATE_END;
00929 }
00930
00931 void CBuilderObject::GetStrAttributeNames(CStringList &list) const
00932 {
00933 GetAttributeNames(list, ATTVAL_STRING, ATTVAL_ENUM);
00934 }
00935
00936 void CBuilderObject::GetIntAttributeNames(CStringList &list) const
00937 {
00938 GetAttributeNames(list, ATTVAL_INTEGER);
00939 }
00940
00941 void CBuilderObject::GetBoolAttributeNames(CStringList &list) const
00942 {
00943 GetAttributeNames(list, ATTVAL_BOOLEAN);
00944 }
00945
00946 void CBuilderObject::GetFloatAttributeNames(CStringList &list) const
00947 {
00948 GetAttributeNames(list, ATTVAL_DOUBLE);
00949 }
00950
00951 void CBuilderObject::GetRefAttributeNames(CStringList &list) const
00952 {
00953 GetAttributeNames(list, ATTVAL_REFERENCE);
00954 }
00955
00956 void CBuilderObject::GetReferencedBy(CBuilderObjectList &list) const
00957 {
00958 ASSERT( list.IsEmpty() );
00959
00960 CComPtr<IMgaFCOs> reflist;
00961 COMCHECK2(GetIObject(), GetIObject()->get_ReferencedBy(&reflist));
00962 MGACOLL_ITERATE(IMgaFCO, reflist) {
00963 CBuilderObject* object = CBuilder::theInstance->FindObject(MGACOLL_ITER);
00964 ASSERT( object != NULL );
00965
00966 list.AddTail(object);
00967 } MGACOLL_ITERATE_END;
00968
00969 }
00970
00971 void CBuilderObject::GetMemberOfSets(CBuilderObjectList &list) const
00972 {
00973 ASSERT( list.IsEmpty() );
00974
00975 CComPtr<IMgaFCOs> setlist;
00976 COMCHECK2(GetIObject(), GetIObject()->get_MemberOfSets(&setlist));
00977 MGACOLL_ITERATE(IMgaFCO, setlist) {
00978 CBuilderObject* object = CBuilder::theInstance->FindObject(MGACOLL_ITER);
00979 ASSERT( object != NULL );
00980
00981 list.AddTail(object);
00982 } MGACOLL_ITERATE_END;
00983
00984 }
00985
00986
00987 bool CBuilderObject::SetName(CString newname)
00988 {
00989 bool ret = SUCCEEDED( ciObject->put_Name((CBstrIn)newname));
00990 if( ret )
00991 name = newname;
00992
00993 return ret;
00994 }
00995
00996 bool CBuilderObject::IsInstance()
00997 {
00998 VARIANT_BOOL ret = 0;
00999 COMCHECK2(ciObject, ciObject->get_IsInstance(&ret) );
01000 return ret != 0;
01001
01002 }
01003
01004
01005 CBuilderObject* CBuilderObject::GetType()
01006 {
01007 if(!IsInstance()) return 0;
01008 CComPtr<IMgaFCO> pp;
01009 COMCHECK2(ciObject, ciObject->get_Type(&pp) );
01010 return CBuilder::theInstance->FindObject(pp);
01011
01012 }
01013
01014 CBuilderObject *CBuilderObject::GetDerivedFrom()
01015 {
01016 if(!IsInstance()) return 0;
01017 CComPtr<IMgaFCO> pp;
01018 COMCHECK2(ciObject, ciObject->get_DerivedFrom(&pp) );
01019 return CBuilder::theInstance->FindObject(pp);
01020 }
01021
01022 void CBuilderObject::GetDerivedObjects(CBuilderObjectList &l, int mode) {
01023 CComPtr<IMgaFCOs> pps;
01024 COMCHECK2(ciObject, ciObject->get_DerivedObjects(&pps));
01025 MGACOLL_ITERATE(IMgaFCO, pps) {
01026 if(mode) {
01027 VARIANT_BOOL inst;
01028 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_IsInstance(&inst));
01029 if(mode == 1 && inst) continue;
01030 if(mode == 2 && !inst) continue;
01031 }
01032 l.AddTail(CBuilder::theInstance->FindObject(MGACOLL_ITER));
01033 } MGACOLL_ITERATE_END;
01034 }
01035
01036 bool CBuilderObject::IsMarked()
01037 {
01038 VARIANT_BOOL ret = 0;
01039
01040
01041 return ret != 0;
01042 }
01043
01044 void CBuilderObject::Mark(bool marked)
01045 {
01046
01047
01048 }
01049
01050 const CBuilderConnectionList *CBuilderObject::GetInConnections(const CString &name, bool bPorts ) const {
01051 CBuilderConnectionList *list = NULL;
01052 if ( ! bPorts )
01053 list = FindInConnections(name);
01054 else
01055 inConnections2.Lookup(name,list);
01056 if( ! list )
01057 return &EmptyList;
01058 return list;
01059 }
01060
01061 const CBuilderConnectionList *CBuilderObject::GetOutConnections(const CString &name, bool bPorts ) const {
01062 CBuilderConnectionList *list = NULL;
01063 if ( ! bPorts )
01064 list = FindOutConnections(name);
01065 else
01066 outConnections2.Lookup(name,list);
01067 if( ! list )
01068 return &EmptyList;
01069 return list;
01070 }
01071
01072
01073 void CBuilderObject::AddInConnection(CString &name,CBuilderConnection *conn)
01074 {
01075 CBuilderConnectionList *list = FindInConnections(name);
01076 if(list == 0) {
01077 list = new CBuilderConnectionList();
01078 inConnections[name] = list;
01079 }
01080 list->AddTail(conn);
01081 AddPortInConnection( name, conn );
01082 }
01083
01084 void CBuilderObject::AddOutConnection(CString &name,CBuilderConnection *conn)
01085 {
01086 CBuilderConnectionList *list = FindOutConnections(name);
01087 if(list == 0) {
01088 list = new CBuilderConnectionList();
01089 outConnections[name] = list;
01090 }
01091 list->AddTail(conn);
01092 AddPortOutConnection( name, conn );
01093 }
01094
01095 void CBuilderObject::AddPortInConnection(CString &name,CBuilderConnection *conn)
01096 {
01097 CBuilderConnectionList *list = NULL;
01098 inConnections2.Lookup(name,list);
01099 if(list == 0) {
01100 list = new CBuilderConnectionList();
01101 inConnections2[name] = list;
01102 }
01103 list->AddTail(conn);
01104 }
01105
01106 void CBuilderObject::AddPortOutConnection(CString &name,CBuilderConnection *conn)
01107 {
01108 CBuilderConnectionList *list = NULL;
01109 outConnections2.Lookup(name,list);
01110 if(list == 0) {
01111 list = new CBuilderConnectionList();
01112 outConnections2[name] = list;
01113 }
01114 list->AddTail(conn);
01115 }
01116
01117 CBuilderConnectionList *CBuilderObject::FindInConnections(const CString &name) const
01118 {
01119 CBuilderConnectionList *list = NULL;
01120 inConnections.Lookup(name,list);
01121 return list;
01122 }
01123
01124 CBuilderConnectionList *CBuilderObject::FindOutConnections(const CString &name) const
01125 {
01126 CBuilderConnectionList *list = NULL;
01127 outConnections.Lookup(name,list);
01128 return list;
01129 }
01130
01131 void CBuilderObject::RemoveInConnection(CBuilderConnection *conn)
01132 {
01133 ASSERT(conn);
01134 CBuilderConnectionList *list;
01135 VERIFY( inConnections.Lookup(conn->GetKindName(),list) );
01136 ASSERT(list);
01137
01138 POSITION pos = list->Find(conn);
01139 if(pos)
01140 list->RemoveAt(pos);
01141 }
01142
01143 void CBuilderObject::RemoveOutConnection(CBuilderConnection *conn)
01144 {
01145 ASSERT(conn);
01146 CBuilderConnectionList *list;
01147 VERIFY( outConnections.Lookup(conn->GetKindName(),list) );
01148 ASSERT(list);
01149 POSITION pos = list->Find(conn);
01150 if(pos)
01151 list->RemoveAt(pos);
01152 }
01153
01154 bool CBuilderObject::GetDirectConnections(const CString &name, CBuilderObjectList &list, bool in)
01155 {
01156 if(list.GetCount() != 0)
01157 {
01158 DisplayError("Connection list must be empty in CBuilderObject::GetDirectInConnections");
01159 return false;
01160 }
01161
01162
01163
01164 const CBuilderConnectionList *conns = in ? GetInConnections(name) : GetOutConnections(name);
01165 if( conns == NULL )
01166 return parent != NULL && parent->FindConnections(name) != NULL;
01167
01168 CMap<const CBuilderObject*, const CBuilderObject*, int, int> visited;
01169 CBuilderObjectList processing;
01170
01171 visited.SetAt(this,0);
01172 processing.AddTail(this);
01173
01174 while( !processing.IsEmpty() )
01175 {
01176 CBuilderObject *object = processing.RemoveHead();
01177 ASSERT( object != NULL );
01178
01179 conns = in ? object->GetInConnections(name) : object->GetOutConnections(name);
01180
01181 if( conns == NULL || conns->IsEmpty() )
01182 list.AddTail(object);
01183 else
01184 {
01185 POSITION pos = conns->GetHeadPosition();
01186 while( pos != NULL )
01187 {
01188 CBuilderObject *next;
01189 if( in )
01190 {
01191 ASSERT( conns->GetAt(pos)->GetDestination() == object );
01192 next = conns->GetNext(pos)->GetSource();
01193 }
01194 else
01195 {
01196 ASSERT( conns->GetAt(pos)->GetSource() == object );
01197 next = conns->GetNext(pos)->GetDestination();
01198 }
01199
01200 int k;
01201 if( !visited.Lookup(next, k) )
01202 {
01203 visited.SetAt(next,0);
01204 processing.AddHead(next);
01205 }
01206 }
01207 }
01208 }
01209
01210 return true;
01211 }
01212
01213 bool CBuilderObject::GetInConnectedObjects(const CString &name, CBuilderObjectList &list, bool bPorts )
01214 {
01215
01216
01217 const CBuilderConnectionList *conns = GetInConnections(name, bPorts );
01218 if( conns == NULL )
01219 return parent != NULL && parent->FindConnections(name) != NULL;
01220
01221 POSITION pos = conns->GetHeadPosition();
01222 while( pos != NULL )
01223 list.AddTail( conns->GetNext(pos)->GetSource() );
01224
01225 return true;
01226 };
01227
01228 bool CBuilderObject::GetOutConnectedObjects(const CString &name, CBuilderObjectList &list, bool bPorts )
01229 {
01230
01231
01232 const CBuilderConnectionList *conns = GetOutConnections(name, bPorts );
01233 if( conns == NULL )
01234 return parent != NULL && parent->FindConnections(name) != NULL;
01235
01236 POSITION pos = conns->GetHeadPosition();
01237 while( pos != NULL )
01238 list.AddTail( conns->GetNext(pos)->GetDestination() );
01239
01240 return true;
01241 };
01242
01243 long CBuilderObject::GetObjId() const
01244 {
01245 long ret = -1;
01246 CBstr rret;
01247 COMCHECK2( ciObject, ciObject->get_ID(rret) );
01248 long mm, ss;
01249 if(swscanf(*rret, OLESTR("id-%04lx-%08lx"), &mm, &ss) == 2 && mm > 100 && mm < 110) {
01250 ASSERT(ss < 100000000);
01251 ret = 100000000 * (mm-100) + ss;
01252 }
01253 return ret;
01254 }
01255
01256 CBuilderObject::objtype CBuilderObject::GetObjType() const {
01257 objtype_enum rret;
01258 COMCHECK2( ciObject, ciObject->get_ObjType( &rret) );
01259 return (objtype)rret;
01260 }
01261
01263 IMPLEMENT_DYNAMIC(CBuilderModel,CBuilderObject)
01264
01265 CBuilderModel::CBuilderModel(IMgaModel *iModel, CBuilderModel *aparent) : CBuilderObject(iModel,aparent)
01266 {
01267 {
01268 CBstr bstr;
01269 COMCHECK2( GetMeta(), GetMeta()->get_DisplayedName(bstr) );
01270 kindTitle = bstr;
01271 }
01272
01273 CreateModels();
01274 CreateAtoms();
01275 CreateReferences();
01276 CreateConnections();
01277 CreateSets();
01278 }
01279
01280 CBuilderModel::~CBuilderModel()
01281 {
01282 POSITION pos2;
01283 POSITION pos = modelLists.GetStartPosition();
01284 CString name;
01285 while(pos) {
01286 CBuilderModelList *list;
01287 modelLists.GetNextAssoc(pos,name,list);
01288 pos2 = list->GetHeadPosition();
01289 while(pos2)
01290 {
01291 delete list->GetNext(pos2);
01292 ASSERT( pos2 == list->GetHeadPosition() );
01293 }
01294 delete list;
01295 }
01296 pos = atomLists.GetStartPosition();
01297 while(pos) {
01298 CBuilderAtomList *list;
01299 atomLists.GetNextAssoc(pos,name,list);
01300 pos2 = list->GetHeadPosition();
01301 while(pos2)
01302 {
01303 delete list->GetNext(pos2);
01304 ASSERT( pos2 == list->GetHeadPosition() );
01305 }
01306 delete list;
01307 }
01308 pos = referenceLists.GetStartPosition();
01309 while(pos) {
01310 CBuilderReferenceList *list;
01311 referenceLists.GetNextAssoc(pos,name,list);
01312 pos2 = list->GetHeadPosition();
01313 while(pos2)
01314 {
01315 delete list->GetNext(pos2);
01316 ASSERT( pos2 == list->GetHeadPosition() );
01317 }
01318 delete list;
01319 }
01320 pos = modelReferenceLists.GetStartPosition();
01321 while(pos) {
01322 CBuilderModelReferenceList *list;
01323 modelReferenceLists.GetNextAssoc(pos,name,list);
01324 pos2 = list->GetHeadPosition();
01325 while(pos2)
01326 {
01327 delete list->GetNext(pos2);
01328 ASSERT( pos2 == list->GetHeadPosition() );
01329 }
01330 delete list;
01331 }
01332 pos = atomReferenceLists.GetStartPosition();
01333 while(pos) {
01334 CBuilderAtomReferenceList *list;
01335 atomReferenceLists.GetNextAssoc(pos,name,list);
01336 pos2 = list->GetHeadPosition();
01337 while(pos2)
01338 {
01339 delete list->GetNext(pos2);
01340 ASSERT( pos2 == list->GetHeadPosition() );
01341 }
01342 delete list;
01343 }
01344 pos = setLists.GetStartPosition();
01345 while(pos) {
01346 CBuilderSetList *list;
01347 setLists.GetNextAssoc(pos,name,list);
01348 pos2 = list->GetHeadPosition();
01349 while(pos2)
01350 {
01351 delete list->GetNext(pos2);
01352 ASSERT( pos2 == list->GetHeadPosition() );
01353 }
01354 delete list;
01355 }
01356 pos = connectionLists.GetStartPosition();
01357 while(pos) {
01358 CBuilderConnectionList *list;
01359 connectionLists.GetNextAssoc(pos,name,list);
01360 ASSERT( list->IsEmpty() );
01361 delete list;
01362 }
01363
01364 if(parent)
01365 parent->RemoveModel(this);
01366 else
01367 GetFolder()->RemoveRootModel(this);
01368 }
01369
01370 void CBuilderModel::Resolve()
01371 {
01372 {
01373 POSITION pos = children.GetHeadPosition();
01374 while(pos)
01375 children.GetNext(pos)->Resolve();
01376 }
01377 {
01378 POSITION pos = connchildren.GetHeadPosition();
01379 while(pos)
01380 connchildren.GetNext(pos)->Resolve();
01381 }
01382 {
01383 POSITION pos = sets.GetHeadPosition();
01384 while(pos)
01385 sets.GetNext(pos)->Resolve();
01386 }
01387 }
01388
01389 void CBuilderModel::CreateModels()
01390 {
01391 CBuilderModelList *objectlist;
01392
01393 CComPtr<IMgaMetaRoles> roles;
01394 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_Roles(&roles) );
01395
01396 modelLists.InitHashTable(17);
01397 MGACOLL_ITERATE(IMgaMetaRole, roles) {
01398 CComPtr<IMgaMetaFCO> kind;
01399 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Kind(&kind));
01400 objtype_enum type;
01401 COMCHECK2(kind, kind->get_ObjType(&type));
01402 if( type == OBJTYPE_MODEL) {
01403 CBstr part;
01404 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Name(part) );
01405 ASSERT( !modelLists.Lookup(CString(part), objectlist) );
01406
01407 objectlist = new CBuilderModelList;
01408 ASSERT(objectlist);
01409
01410 modelLists[CString(part)] = objectlist;
01411 }
01412 } MGACOLL_ITERATE_END;
01413
01414 CComPtr<IMgaFCOs> chds;
01415 COMCHECK2(GetIModel(), GetIModel()->get_ChildFCOs(&chds) );
01416 MGACOLL_ITERATE(IMgaFCO, chds) {
01417 objtype_enum ot;
01418 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ObjType(&ot));
01419 if(ot != OBJTYPE_MODEL) continue;
01420 CBuilderModel* o = CBuilderFactory::Create(CComQIPtr<IMgaModel>(MGACOLL_ITER), this);
01421
01422 VERIFY( modelLists.Lookup(o->GetPartName(), objectlist) );
01423 ASSERT( objectlist );
01424
01425 objectlist->AddTail(o);
01426 children.AddTail(o);
01427 models.AddTail(o);
01428 } MGACOLL_ITERATE_END;
01429 }
01430
01431 void CBuilderModel::CreateAtoms()
01432 {
01433 CBuilderAtomList *objectlist;
01434
01435 CComPtr<IMgaMetaRoles> roles;
01436 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_Roles(&roles) );
01437
01438 atomLists.InitHashTable(17);
01439 MGACOLL_ITERATE(IMgaMetaRole, roles) {
01440 CComPtr<IMgaMetaFCO> kind;
01441 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Kind(&kind));
01442 objtype_enum type;
01443 COMCHECK2(kind, kind->get_ObjType(&type));
01444 if( type == OBJTYPE_ATOM) {
01445 CBstr part;
01446 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Name(part) );
01447 ASSERT( !atomLists.Lookup(CString(part), objectlist) );
01448
01449 objectlist = new CBuilderAtomList;
01450 ASSERT(objectlist);
01451
01452 atomLists[CString(part)] = objectlist;
01453 }
01454 } MGACOLL_ITERATE_END;
01455
01456 CComPtr<IMgaFCOs> chds;
01457 COMCHECK2(GetIModel(), GetIModel()->get_ChildFCOs(&chds) );
01458 MGACOLL_ITERATE(IMgaFCO, chds) {
01459 objtype_enum ot;
01460 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ObjType(&ot));
01461 if(ot != OBJTYPE_ATOM) continue;
01462
01463 CBuilderAtom* o = CBuilderFactory::Create(CComQIPtr<IMgaAtom>(MGACOLL_ITER), this);
01464
01465 VERIFY( atomLists.Lookup(o->GetPartName(), objectlist) );
01466 ASSERT( objectlist );
01467
01468 objectlist->AddTail(o);
01469 children.AddTail(o);
01470 } MGACOLL_ITERATE_END;
01471 }
01472
01473 void CBuilderModel::CreateReferences()
01474 {
01475 CBuilderReferenceList *objectlist;
01476
01477 CComPtr<IMgaMetaRoles> roles;
01478 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_Roles(&roles) );
01479
01480 referenceLists.InitHashTable(17);
01481 modelReferenceLists.InitHashTable(17);
01482 atomReferenceLists.InitHashTable(17);
01483 MGACOLL_ITERATE(IMgaMetaRole, roles) {
01484 CComPtr<IMgaMetaFCO> kind;
01485 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Kind(&kind));
01486 objtype_enum type;
01487 COMCHECK2(kind, kind->get_ObjType(&type));
01488 if( type == OBJTYPE_REFERENCE) {
01489 CBstr part;
01490 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Name(part) );
01491 ASSERT( !referenceLists.Lookup(CString(part), objectlist) );
01492
01493 referenceLists[CString(part)] = new CBuilderReferenceList;
01494 modelReferenceLists[CString(part)] = new CBuilderModelReferenceList;
01495 atomReferenceLists[CString(part)] = new CBuilderAtomReferenceList;
01496 }
01497 } MGACOLL_ITERATE_END;
01498
01499 CComPtr<IMgaFCOs> chds;
01500 COMCHECK2(GetIModel(), GetIModel()->get_ChildFCOs(&chds) );
01501 MGACOLL_ITERATE(IMgaFCO, chds) {
01502
01503 objtype_enum ot;
01504 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ObjType(&ot));
01505 if(ot != OBJTYPE_REFERENCE) continue;
01506 {
01507 CComPtr<IMgaFCO> r = MGACOLL_ITER;
01508 while(ot == OBJTYPE_REFERENCE) {
01509 CComPtr<IMgaFCO> rr;
01510 COMCHECK2(CComQIPtr<IMgaReference>(r), CComQIPtr<IMgaReference>(r)->get_Referred(&rr));
01511 r = rr;
01512 if(!r) {
01513 ot = OBJTYPE_NULL;
01514 break;
01515 }
01516 COMCHECK2(r, r->get_ObjType(&ot));
01517 }
01518 }
01519 CBuilderReference* oo = CBuilderFactory::Create(CComQIPtr<IMgaReference>(MGACOLL_ITER), this);
01520 VERIFY( referenceLists.Lookup(oo->GetPartName(), objectlist) );
01521 ASSERT( objectlist );
01522 objectlist->AddTail(oo);
01523 children.AddTail(oo);
01524
01525 if(oo->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) ) {
01526 CBuilderModelReferenceList *mobjectlist;
01527 VERIFY( modelReferenceLists.Lookup(oo->GetPartName(), mobjectlist) );
01528 mobjectlist->AddTail((CBuilderModelReference *)oo);
01529 }
01530 else if(oo->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) ) {
01531 CBuilderAtomReferenceList *aobjectlist;
01532 VERIFY( atomReferenceLists.Lookup(oo->GetPartName(), aobjectlist) );
01533 aobjectlist->AddTail((CBuilderAtomReference *)oo);
01534 }
01535
01536 } MGACOLL_ITERATE_END;
01537 }
01538
01539
01540 void CBuilderModel::CreateSets()
01541 {
01542 CBuilderSetList *objectlist;
01543
01544 CComPtr<IMgaMetaRoles> roles;
01545 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_Roles(&roles) );
01546
01547 setLists.InitHashTable(17);
01548 MGACOLL_ITERATE(IMgaMetaRole, roles) {
01549 CComPtr<IMgaMetaFCO> kind;
01550 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Kind(&kind));
01551 objtype_enum type;
01552 COMCHECK2(kind, kind->get_ObjType(&type));
01553 if( type == OBJTYPE_SET) {
01554 CBstr part;
01555 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Name(part) );
01556 ASSERT( !setLists.Lookup(CString(part), objectlist) );
01557
01558 objectlist = new CBuilderSetList;
01559 ASSERT(objectlist);
01560
01561 setLists[CString(part)] = objectlist;
01562 }
01563 } MGACOLL_ITERATE_END;
01564
01565 CComPtr<IMgaFCOs> chds;
01566 COMCHECK2(GetIModel(), GetIModel()->get_ChildFCOs(&chds) );
01567 MGACOLL_ITERATE(IMgaFCO, chds) {
01568 objtype_enum ot;
01569 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ObjType(&ot));
01570 if(ot != OBJTYPE_SET) continue;
01571 AddSet(CComQIPtr<IMgaSet>(MGACOLL_ITER));
01572 } MGACOLL_ITERATE_END;
01573
01574 }
01575
01576 void CBuilderModel::CreateConnections()
01577 {
01578 CBuilderConnectionList *objectlist;
01579
01580
01581 CComPtr<IMgaMetaRoles> roles;
01582 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_Roles(&roles) );
01583
01584 connectionLists.InitHashTable(17);
01585 MGACOLL_ITERATE(IMgaMetaRole, roles) {
01586 CComPtr<IMgaMetaFCO> kind;
01587 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Kind(&kind));
01588 objtype_enum type;
01589 COMCHECK2(kind, kind->get_ObjType(&type));
01590 if( type == OBJTYPE_CONNECTION) {
01591 CBstr kname;
01592 COMCHECK2(kind, kind->get_Name(kname) );
01593 ASSERT( !connectionLists.Lookup(CString(kname), objectlist) );
01594
01595 objectlist = new CBuilderConnectionList;
01596 ASSERT(objectlist);
01597
01598 connectionLists[CString(kname)] = objectlist;
01599 }
01600 } MGACOLL_ITERATE_END;
01601
01602 CComPtr<IMgaFCOs> chds;
01603 COMCHECK2(GetIModel(), GetIModel()->get_ChildFCOs(&chds) );
01604 MGACOLL_ITERATE(IMgaFCO, chds) {
01605 objtype_enum ot;
01606 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ObjType(&ot));
01607 if(ot != OBJTYPE_CONNECTION) continue;
01608
01609 CBuilderConnection* o = AddConnection(CComQIPtr<IMgaSimpleConnection>(MGACOLL_ITER));
01610 } MGACOLL_ITERATE_END;
01611 }
01612
01613 void CBuilderModel::Destroy()
01614 {
01615 POSITION pos = children.GetHeadPosition();
01616 while(pos)
01617 children.GetNext(pos)->Destroy();
01618
01619 CBuilderObject::Destroy();
01620 }
01621
01622 void CBuilderModel::RemoveMemberFromSets(CBuilderObject *member)
01623 {
01624 ASSERT(member && member->GetParent() == this );
01625
01626 POSITION pos = sets.GetHeadPosition();
01627 while(pos)
01628 sets.GetNext(pos)->RemoveMember(member);
01629 }
01630
01631 CBuilderConnection *CBuilderModel::AddConnection(IMgaSimpleConnection *iConnection)
01632 {
01633
01634 CBuilderConnection *conn = CBuilderFactory::Create(iConnection, this);
01635
01636 FindConnections(conn->GetKindName())->AddTail(conn);
01637 connchildren.AddTail(conn);
01638
01639 return conn;
01640 }
01641
01642
01643
01644 CBuilderSet *CBuilderModel::AddSet(IMgaSet *iSet)
01645 {
01646 CBuilderSet* cond = CBuilderFactory::Create(iSet, this);
01647
01648 FindSets(cond->GetPartName())->AddTail(cond);
01649 sets.AddTail(cond);
01650 children.AddTail(cond);
01651
01652 return cond;
01653 }
01654
01655
01656
01657
01658
01659 const CBuilderModelList *CBuilderModel::GetModels(CString name) const
01660 {
01661 CBuilderModelList *modelList;
01662 if(!(modelLists.Lookup(name,modelList)))
01663 modelList = 0;
01664 return modelList;
01665 }
01666
01667 const CBuilderAtomList *CBuilderModel::GetAtoms(CString name) const
01668 {
01669 CBuilderAtomList *atomList;
01670 if(!(atomLists.Lookup(name,atomList)))
01671 atomList = 0;
01672 return atomList;
01673 }
01674
01675 const CBuilderReferenceList *CBuilderModel::GetReferences(CString name) const
01676 {
01677 CBuilderReferenceList *referenceList;
01678 if(!(referenceLists.Lookup(name,referenceList)))
01679 referenceList = 0;
01680 return referenceList;
01681 }
01682
01683 const CBuilderModelReferenceList *CBuilderModel::GetModelReferences(CString name) const
01684 {
01685 CBuilderModelReferenceList *modelReferenceList;
01686 if(!(modelReferenceLists.Lookup(name,modelReferenceList)))
01687 modelReferenceList = 0;
01688 return modelReferenceList;
01689 }
01690
01691 const CBuilderAtomReferenceList *CBuilderModel::GetAtomReferences(CString name) const
01692 {
01693 CBuilderAtomReferenceList *atomReferenceList;
01694 if(!(atomReferenceLists.Lookup(name,atomReferenceList)))
01695 atomReferenceList = 0;
01696 return atomReferenceList;
01697 }
01698
01699 void CBuilderModel::RemoveModel(CBuilderModel *model)
01700 {
01701 ASSERT(model);
01702 CBuilderModelList *list;
01703 VERIFY( modelLists.Lookup(model->GetPartName(),list) );
01704 ASSERT(list);
01705
01706 POSITION pos = list->Find(model);
01707 if(pos)
01708 list->RemoveAt(pos);
01709 }
01710
01711 void CBuilderModel::RemoveModelReference(CBuilderModelReference *modelref)
01712 {
01713 ASSERT(modelref);
01714 CBuilderModelReferenceList *list;
01715 VERIFY( modelReferenceLists.Lookup(modelref->GetPartName(),list) );
01716 ASSERT(list);
01717
01718 POSITION pos = list->Find(modelref);
01719 if(pos)
01720 list->RemoveAt(pos);
01721 }
01722
01723 void CBuilderModel::RemoveAtom(CBuilderAtom *atom)
01724 {
01725 ASSERT(atom);
01726 CBuilderAtomList *list;
01727 VERIFY( atomLists.Lookup(atom->GetPartName(),list) );
01728 ASSERT(list);
01729
01730 POSITION pos = list->Find(atom);
01731 if(pos)
01732 list->RemoveAt(pos);
01733 }
01734
01735 void CBuilderModel::RemoveReference(CBuilderReference *ref)
01736 {
01737 ASSERT(ref);
01738 CBuilderReferenceList *list;
01739 VERIFY( referenceLists.Lookup(ref->GetPartName(),list) );
01740 ASSERT(list);
01741
01742 POSITION pos = list->Find(ref);
01743 if(pos)
01744 list->RemoveAt(pos);
01745 }
01746
01747 void CBuilderModel::RemoveAtomReference(CBuilderAtomReference *atomref)
01748 {
01749 ASSERT(atomref);
01750 CBuilderAtomReferenceList *list;
01751 VERIFY( atomReferenceLists.Lookup(atomref->GetPartName(),list) );
01752 ASSERT(list);
01753
01754 POSITION pos = list->Find(atomref);
01755 if(pos)
01756 list->RemoveAt(pos);
01757 }
01758
01759 void CBuilderModel::RemoveConnection(CBuilderConnection *conn)
01760 {
01761 ASSERT(conn);
01762 CBuilderConnectionList *list;
01763 VERIFY( connectionLists.Lookup(conn->GetKindName(),list) );
01764 ASSERT(list);
01765
01766 POSITION pos = list->Find(conn);
01767 ASSERT( pos );
01768 list->RemoveAt(pos);
01769 }
01770
01771 void CBuilderModel::RemoveSet(CBuilderSet *cond)
01772 {
01773 ASSERT(cond);
01774 CBuilderSetList *list;
01775 VERIFY( setLists.Lookup(cond->GetPartName(),list) );
01776 ASSERT(list);
01777
01778 POSITION pos = list->Find(cond);
01779 ASSERT( pos );
01780 list->RemoveAt(pos);
01781 }
01782
01783 CBuilderConnectionList *CBuilderModel::FindConnections(CString name) const
01784 {
01785 CBuilderConnectionList *list = NULL;
01786 connectionLists.Lookup(name,list);
01787 return list;
01788 }
01789
01790 CBuilderSetList *CBuilderModel::FindSets(CString name) const
01791 {
01792 CBuilderSetList *list = NULL;
01793 setLists.Lookup(name,list);
01794 return list;
01795 }
01796
01797 void CBuilderModel::TraverseModels(void *pointer)
01798 {
01799 POSITION pos = models.GetHeadPosition();
01800 while(pos)
01801 models.GetNext(pos)->TraverseModels();
01802 }
01803
01804 void CBuilderModel::TraverseChildren(void *pointer)
01805 {
01806 POSITION pos = children.GetHeadPosition();
01807 while(pos)
01808 children.GetNext(pos)->TraverseChildren(pointer);
01809 }
01810
01811 void CBuilderModel::Open()
01812 {
01813 COMCHECK2(GetIModel(), GetIModel()->Open() );
01814 }
01815
01816 bool CBuilderModel::IsOpened()
01817 {
01818 VARIANT_BOOL b = VARIANT_FALSE;
01819
01820
01821 return b != 0;
01822 }
01823
01824 bool CBuilderModel::Close(bool withchildren)
01825 {
01826 HRESULT hr = S_OK;
01827
01828
01829 COMASSERT( hr );
01830
01831 return hr == S_OK;
01832 }
01833
01834 void CBuilderModel::GetSelection(CBuilderObjectList &list)
01835 {
01836 ASSERT( list.IsEmpty() );
01837
01838
01839
01840
01841
01842
01843
01844
01845
01846
01847
01848
01849
01850
01851 }
01852
01853 void CBuilderModel::SelectionRemoveAll() const
01854 {
01855
01856
01857 }
01858
01859 void CBuilderModel::SelectionAdd(CBuilderObjectList& list) const
01860 {
01861
01862
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873 }
01874
01875 void CBuilderModel::SelectionRemove(CBuilderObjectList& list) const
01876 {
01877
01878
01879
01880
01881
01882
01883
01884
01885
01886
01887
01888
01889 }
01890
01891 void CBuilderModel::SelectionAdd(CBuilderObject* object) const
01892 {
01893
01894
01895
01896
01897
01898
01899
01900 }
01901
01902 void CBuilderModel::SelectionRemove(CBuilderObject* object) const
01903 {
01904
01905
01906
01907
01908
01909
01910
01911 }
01912
01913 void CBuilderModel::SetCurrentAspect(CString& aspect)
01914 {
01915
01916
01917
01918 }
01919
01920 CString CBuilderModel::GetCurrentAspect()
01921 {
01922 CBstr ret;
01923 CComPtr<IMgaMetaAspects> asps;
01924 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_Aspects(&asps));
01925 CComPtr<IMgaMetaAspect> asp;
01926 COMCHECK2(asps, asps->get_Item(1, &asp));
01927
01928 COMCHECK2(asp, asp->get_Name(ret));
01929
01930 return ret;
01931 }
01932
01933 void CBuilderModel::GetAspectNames(CStringList &list)
01934 {
01935 ASSERT( list.IsEmpty() );
01936
01937 CComPtr<IMgaMetaAspects> asps;
01938 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_Aspects(&asps));
01939
01940 MGACOLL_ITERATE(IMgaMetaAspect, asps) {
01941 CBstr ret;
01942 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Name(ret));
01943 list.AddTail(ret);
01944 } MGACOLL_ITERATE_END;
01945 }
01946
01947 CBuilderObject *CBuilderModel::CloneHere( CBuilderObject* orig)
01948 {
01949 CComPtr<IMgaFCO> src_obj = orig->GetIObject();
01950 CComPtr<IMgaModel> par_obj = GetIModel();
01951
01952 CComPtr<IMgaFCOs> fco_coll;
01953 CComPtr<IMgaMetaRoles> rol_coll;
01954 fco_coll.CoCreateInstance( L"Mga.MgaFCOs");
01955 rol_coll.CoCreateInstance( L"Mga.MgaMetaRoles");
01956
01957
01958 fco_coll->Append( src_obj);
01959
01960 CComPtr<IMgaMetaRole> role;
01961 src_obj->get_MetaRole(&role);
01962
01963
01964 rol_coll->Append( role);
01965
01966 CComPtr<IMgaFCOs> dst_coll;
01967 par_obj->CopyFCOs( fco_coll, rol_coll, &dst_coll);
01968
01969
01970 long l = 0;
01971 if( dst_coll) dst_coll->get_Count( &l);
01972
01973 CBuilderObject *return_value = 0;
01974 for( int i = 1; i <= l; ++i)
01975 {
01976 CComPtr<IMgaFCO> dst;
01977 dst_coll->get_Item( i, &dst);
01978
01979 objtype_enum ot;
01980 if( dst) dst->get_ObjType( &ot);
01981 if( ot == OBJTYPE_ATOM)
01982 {
01983 CBuilderAtom* o = CBuilderFactory::Create(CComQIPtr<IMgaAtom>(dst), this);
01984
01985 children.AddTail(o);
01986
01987 CBuilderAtomList *objectlist;
01988 VERIFY( atomLists.Lookup( o->GetPartName(), objectlist) );
01989 objectlist->AddTail(o);
01990
01991 return_value = o;
01992 }
01993 else if( ot == OBJTYPE_MODEL)
01994 {
01995 CBuilderModel* o = CBuilderFactory::Create( CComQIPtr<IMgaModel>(dst), this);
01996 o->Resolve();
01997
01998 children.AddTail(o);
01999 models.AddTail(o);
02000
02001 CBuilderModelList *objectlist;
02002 VERIFY( modelLists.Lookup( o->GetPartName(), objectlist) );
02003 objectlist->AddTail(o);
02004
02005 return_value = o;
02006 }
02007 else if( ot == OBJTYPE_SET)
02008 {
02009 CBuilderSet* o = CBuilderFactory::Create( CComQIPtr<IMgaSet>(dst), this);
02010
02011 FindSets( o->GetPartName())->AddTail( o);
02012 sets.AddTail(o);
02013 children.AddTail(o);
02014
02015 return_value = o;
02016 }
02017 else if( ot == OBJTYPE_REFERENCE)
02018 {
02019 CBuilderReference* oo = CBuilderFactory::Create(CComQIPtr<IMgaReference>(dst), this);
02020
02021 CBuilderReferenceList *objectlist;
02022 VERIFY( referenceLists.Lookup( oo->GetPartName(), objectlist) );
02023 objectlist->AddTail(oo);
02024
02025 children.AddTail(oo);
02026
02027 if(oo->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) ) {
02028 CBuilderModelReferenceList *mobjectlist;
02029 VERIFY( modelReferenceLists.Lookup(oo->GetPartName(), mobjectlist) );
02030 mobjectlist->AddTail((CBuilderModelReference *)oo);
02031 }
02032 else if(oo->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) ) {
02033 CBuilderAtomReferenceList *aobjectlist;
02034 VERIFY( atomReferenceLists.Lookup(oo->GetPartName(), aobjectlist) );
02035 aobjectlist->AddTail((CBuilderAtomReference *)oo);
02036 }
02037
02038 return_value = oo;
02039 }
02040 }
02041
02042 return return_value;
02043 }
02044
02045 CBuilderModel *CBuilderModel::CreateNewModel(CString partName, CBuilderModel *baseType, bool instance)
02046 {
02047 CBuilderModelList *objectlist;
02048 VERIFY( modelLists.Lookup(partName, objectlist) );
02049
02050 CBstr rname(partName);
02051 CComPtr<IMgaMetaRole> role;
02052 COMCHECK2( CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_RoleByName((CBstrIn)rname, &role) );
02053 ASSERT(role);
02054 CComPtr<IMgaFCO> i = NULL;
02055 if (baseType) {
02056 COMCHECK2(GetIModel(), GetIModel()->DeriveChildObject(baseType->GetIModel(), role,
02057 instance ? VARIANT_TRUE : VARIANT_FALSE, &i));
02058 }
02059 else {
02060 COMCHECK2(GetIModel(), GetIModel()->CreateChildObject(role, &i) );
02061 }
02062 ASSERT( i != NULL );
02063
02064
02065 CBuilderModel* o = CBuilderFactory::Create(CComQIPtr<IMgaModel>(i), this);
02066 o->Resolve();
02067 objectlist->AddTail(o);
02068 children.AddTail(o);
02069 models.AddTail(o);
02070
02071 return o;
02072 }
02073
02074 CBuilderAtom *CBuilderModel::CreateNewAtom(CString partName, CBuilderAtom *baseType, bool instance)
02075 {
02076 CBuilderAtomList *objectlist;
02077 VERIFY( atomLists.Lookup(partName, objectlist) );
02078
02079 CBstr rname(partName);
02080 CComPtr<IMgaMetaRole> role;
02081 COMCHECK2( CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_RoleByName((CBstrIn)rname, &role) );
02082 ASSERT(role);
02083 CComPtr<IMgaFCO> i = NULL;
02084 if (baseType) {
02085 COMCHECK2(GetIModel(), GetIModel()->DeriveChildObject(baseType->GetIAtom(), role,
02086 instance ? VARIANT_TRUE : VARIANT_FALSE, &i));
02087 }
02088 else {
02089 COMCHECK2(GetIModel(), GetIModel()->CreateChildObject(role, &i) );
02090 }
02091 ASSERT( i != NULL );
02092
02093
02094 CBuilderAtom* o = CBuilderFactory::Create(CComQIPtr<IMgaAtom>(i), this);
02095
02096
02097 objectlist->AddTail(o);
02098 children.AddTail(o);
02099 return o;
02100 }
02101
02102
02103 CBuilderReference *CBuilderModel::CreateNewReference(CString refPartName, CBuilderObject *refTo, CBuilderReference *baseType, bool instance) {
02104 CBuilderReferenceList *objectlist;
02105 VERIFY( referenceLists.Lookup(refPartName, objectlist) );
02106
02107 CBstr rname(refPartName);
02108 CComPtr<IMgaMetaRole> role;
02109 COMCHECK2( CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_RoleByName((CBstrIn)rname, &role) );
02110 ASSERT(role);
02111 CComPtr<IMgaFCO> i = NULL;
02112 if (baseType) {
02113 ASSERT(refTo == NULL);
02114 COMCHECK2(GetIModel(), GetIModel()->DeriveChildObject(baseType->GetIRef(), role,
02115 instance ? VARIANT_TRUE : VARIANT_FALSE, &i));
02116 }
02117 else {
02118 COMCHECK2( GetIModel(), GetIModel()->CreateReference(role, refTo ? refTo->GetIObject() : NULL, &i) );
02119 }
02120
02121 ASSERT( i != NULL );
02122 CBuilderReference* oo = CBuilderFactory::Create(CComQIPtr<IMgaReference>(i), this);
02123 oo->PutReferred(refTo);
02124 objectlist->AddTail(oo);
02125 children.AddTail(oo);
02126
02127 if(oo->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) ) {
02128 CBuilderModelReferenceList *mobjectlist;
02129 VERIFY( modelReferenceLists.Lookup(refPartName, mobjectlist) );
02130 mobjectlist->AddTail((CBuilderModelReference *)oo);
02131 }
02132 else if(oo->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) ) {
02133 CBuilderAtomReferenceList *aobjectlist;
02134 VERIFY( atomReferenceLists.Lookup(refPartName, aobjectlist) );
02135 aobjectlist->AddTail((CBuilderAtomReference *)oo);
02136 }
02137
02138 return oo;
02139 }
02140
02141
02142 CBuilderModelReference *CBuilderModel::CreateNewModelReference(CString refPartName, CBuilderObject *refTo)
02143 {
02144 ASSERT( refTo );
02145 ASSERT( refTo->IsKindOf(RUNTIME_CLASS(CBuilderModel)) ||
02146 refTo->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) );
02147
02148 CBuilderReference *nobj = CreateNewReference(refPartName, refTo);
02149 ASSERT( nobj->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) );
02150
02151
02152 return (CBuilderModelReference *)nobj;
02153
02154 }
02155
02156 CBuilderAtomReference *CBuilderModel::CreateNewAtomReference(CString refPartName, CBuilderObject *refTo)
02157 {
02158 ASSERT( refTo );
02159 ASSERT( refTo->IsKindOf(RUNTIME_CLASS(CBuilderAtom)) ||
02160 refTo->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) );
02161
02162 CBuilderReference *nobj = CreateNewReference(refPartName, refTo);
02163 ASSERT( nobj->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) );
02164
02165
02166 return (CBuilderAtomReference *)nobj;
02167 }
02168
02169
02170 CBuilderConnection *CBuilderModel::CreateNewConnection(CString connName, CBuilderObject *source, CBuilderObject *destination)
02171 {
02172
02173 CComPtr<IMgaFCOs> srcrefs, dstrefs;
02174 CComPtr<IMgaFCO> srcfco, dstfco;
02175 CBuilderObject const *src = source;
02176 if(src->IsKindOf(RUNTIME_CLASS(CBuilderReferencePort))) {
02177 srcfco = src->GetIObject();
02178 src = ((CBuilderReferencePort*)src)->GetOwner();
02179 while(src->IsKindOf(RUNTIME_CLASS(CBuilderModelReference))) {
02180 COMCHECK2(src->GetIObject(), src->GetIObject()->CreateCollection(&srcrefs));
02181 src=((CBuilderModelReference*)src)->GetReferred();
02182 }
02183 if(!src->IsKindOf(RUNTIME_CLASS(CBuilderModel))) BONCOMTHROW(E_INCONSISTENCY);
02184 srcfco = source->GetIObject();
02185 if(src != ((CBuilderReferencePort*)source)->GetPortObject()->GetParent()) BONCOMTHROW(E_INCONSISTENCY);
02186 }
02187 else {
02188 while(src->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference))) {
02189 COMCHECK2(src->GetIObject(), src->GetIObject()->CreateCollection(&srcrefs));
02190 src=((CBuilderAtomReference*)src)->GetReferred();
02191 }
02192
02193 srcfco = src->GetIObject();
02194 }
02195
02196 CBuilderObject const *dst = destination;
02197 if(dst->IsKindOf(RUNTIME_CLASS(CBuilderReferencePort))) {
02198 dstfco = dst->GetIObject();
02199 dst = ((CBuilderReferencePort*)dst)->GetOwner();
02200 while(dst->IsKindOf(RUNTIME_CLASS(CBuilderModelReference))) {
02201 COMCHECK2(dst->GetIObject(), dst->GetIObject()->CreateCollection(&dstrefs));
02202 dst=((CBuilderModelReference*)dst)->GetReferred();
02203 }
02204 if(!dst->IsKindOf(RUNTIME_CLASS(CBuilderModel))) BONCOMTHROW(E_INCONSISTENCY);
02205 dstfco = destination->GetIObject();
02206 if(dst != ((CBuilderReferencePort*)destination)->GetPortObject()->GetParent()) BONCOMTHROW(E_INCONSISTENCY);
02207 }
02208 else {
02209 while(dst->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference))) {
02210 COMCHECK2(dst->GetIObject(), dst->GetIObject()->CreateCollection(&dstrefs));
02211 dst=((CBuilderAtomReference*)dst)->GetReferred();
02212 }
02213
02214 dstfco = dst->GetIObject();
02215 }
02216
02217 CComPtr<IMgaMetaRole> role;
02218 COMCHECK2(CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_RoleByName((CBstrIn)connName, &role));
02219 VERIFY(role);
02220 CComPtr<IMgaFCO> iconn;
02221 CComPtr<IMgaSimpleConnection> sconn;
02222 COMCHECK2( GetIModel(), GetIModel()->CreateSimpleConn(role, srcfco, dstfco, srcrefs, dstrefs, &iconn) );
02223 COMCHECK2(iconn, iconn.QueryInterface(&sconn));
02224 VERIFY( sconn );
02225
02226 CBuilderConnection *conn = AddConnection(sconn);
02227 conn->Resolve();
02228
02229 return conn;
02230 }
02231
02232 CBuilderSet *CBuilderModel::CreateNewSet(CString condPartName, CBuilderSet *baseType, bool instance) {
02233 CBuilderSetList *objectlist;
02234 VERIFY( setLists.Lookup(condPartName, objectlist) );
02235
02236 CBstr rname(condPartName);
02237 CComPtr<IMgaMetaRole> role;
02238 COMCHECK2( CComQIPtr<IMgaMetaModel>(GetMeta()), CComQIPtr<IMgaMetaModel>(GetMeta())->get_RoleByName((CBstrIn)rname, &role) );
02239
02240 ASSERT(role);
02241
02242 CComPtr<IMgaFCO> i;
02243 HRESULT hr;
02244 if (baseType) {
02245 hr = GetIModel()->DeriveChildObject(baseType->GetISet(), role,
02246 instance ? VARIANT_TRUE : VARIANT_FALSE, &i);
02247 }
02248 else {
02249 hr = GetIModel()->CreateChildObject(role, &i);
02250 }
02251
02252 CComQIPtr<IMgaSet> icond = i;
02253
02254 if( !SUCCEEDED(hr) )
02255 {
02256 ASSERT( icond == NULL );
02257 return NULL;
02258 }
02259
02260 CBuilderSet *cond = AddSet(icond);
02261 ASSERT(cond);
02262
02263 return cond;
02264 }
02265
02267 IMPLEMENT_DYNAMIC(CBuilderAtom,CBuilderObject)
02268
02269 CBuilderAtom::CBuilderAtom(IMgaAtom *iAtom,CBuilderModel *aparent) : CBuilderObject(iAtom,aparent)
02270 {
02271 CBstr bbstr;
02272 COMCHECK2( iAtom, iAtom->get_ID(bbstr));
02273 CString aaa = bbstr;
02274 CBstr bstr;
02275 COMCHECK2( GetMeta(), GetMeta()->get_DisplayedName(bstr) );
02276 kindTitle = bstr;
02277 }
02278
02279 CBuilderAtom::~CBuilderAtom()
02280 {
02281 ASSERT(parent);
02282 parent->RemoveAtom(this);
02283 }
02284
02285 void CBuilderAtom::Resolve() {
02286 }
02287
02289 IMPLEMENT_DYNAMIC(CBuilderReference,CBuilderObject)
02290
02291 CBuilderReference::CBuilderReference(IMgaReference *iRef,CBuilderModel *aparent) : CBuilderObject(iRef,aparent)
02292 {
02293 ref = NULL;
02294 }
02295
02296 CBuilderReference::~CBuilderReference()
02297 {
02298 ASSERT(parent);
02299 parent->RemoveReference(this);
02300 }
02301
02302 void CBuilderReference::Resolve() {
02303 CComPtr<IMgaFCO> i;
02304 COMCHECK2( GetIRef(), GetIRef()->get_Referred(&i) );
02305 if(i) ref = CBuilder::theInstance->FindObject(i);
02306 else ref = NULL;
02307 }
02308
02309 const CBuilderObject::objtype CBuilderReference::GetReferredType() const {
02310 if(ref == NULL) return CBuilderObject::OBJNULL;
02311 return ref->GetObjType();
02312 }
02313
02314 bool CBuilderReference::PutReferred(CBuilderObject *nref) {
02315 ref = nref;
02316 COMCHECK2( GetIRef(), GetIRef()->put_Referred(ref->ciObject) );
02317 return false;
02318 }
02319
02321 IMPLEMENT_DYNAMIC(CBuilderAtomReference,CBuilderReference)
02322
02323 CBuilderAtomReference::CBuilderAtomReference(IMgaReference *iAtomRef,CBuilderModel *aparent) : CBuilderReference(iAtomRef,aparent)
02324 {
02325 }
02326
02327 CBuilderAtomReference::~CBuilderAtomReference()
02328 {
02329 ASSERT(parent);
02330 parent->RemoveAtomReference(this);
02331 }
02332
02333 void CBuilderAtomReference::Resolve()
02334 {
02335 CBuilderReference::Resolve();
02336 ASSERT( ref->IsKindOf(RUNTIME_CLASS(CBuilderAtom)) ||
02337 ref->IsKindOf(RUNTIME_CLASS(CBuilderAtomReference)) );
02338 }
02339
02341 IMPLEMENT_DYNAMIC(CBuilderReferencePort,CBuilderObject)
02342
02343 CBuilderReferencePort::CBuilderReferencePort(IMgaFCO *iPort,CBuilderModelReference *o) :
02344 CBuilderObject(iPort,o->parent, false), owner(o)
02345 {
02346
02347 o->SetPortRef(iPort, this);
02348 }
02349
02350 void CBuilderReferencePort::Resolve()
02351 {
02352
02353
02354 CBuilderObject* o = CBuilder::theInstance->FindObject(GetIObject());
02355
02356 portobj = o;
02357
02358 }
02359
02361 IMPLEMENT_DYNAMIC(CBuilderModelReference,CBuilderReference)
02362
02363 CBuilderModelReference::CBuilderModelReference(IMgaReference *iModelRef,CBuilderModel *aparent) : CBuilderReference(iModelRef,aparent) {
02364 CreateReferencePorts();
02365 }
02366
02367 CBuilderModelReference::~CBuilderModelReference()
02368 {
02369 POSITION pos = refPorts.GetHeadPosition();
02370 while(pos) {
02371 CBuilderReferencePort *o = refPorts.GetNext(pos);
02372 ForgetPortRef(o->GetIObject());
02373 delete o;
02374 }
02375 ASSERT(parent);
02376 parent->RemoveModelReference(this);
02377 }
02378
02379 void CBuilderModelReference::CreateReferencePorts()
02380 {
02381 CComPtr<IMgaFCOs> children;
02382 CComPtr<IMgaFCO> r = GetIModelRef();
02383 while(1) {
02384 CComPtr<IMgaFCO> rr;
02385 COMCHECK2(CComQIPtr<IMgaReference>(r), CComQIPtr<IMgaReference>(r)->get_Referred(&rr));
02386 r = rr;
02387 if(!r) break;
02388 objtype_enum o;
02389 COMCHECK2(r, r->get_ObjType(&o));
02390 if(o == OBJTYPE_MODEL) break;
02391 ASSERT(o == OBJTYPE_REFERENCE);
02392 }
02393 if(r) {
02394 COMCHECK2(CComQIPtr<IMgaModel>(r), CComQIPtr<IMgaModel>(r)->get_ChildFCOs(&children));
02395 MGACOLL_ITERATE(IMgaFCO, children) {
02396 objtype_enum o;
02397 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ObjType(&o));
02398 {
02399 CComPtr<IMgaFCO> &iportobj=MGACOLL_ITER;
02400 CComPtr<IMgaMetaRole> role;
02401 CComPtr<IMgaMetaParts> parts;
02402 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_MetaRole(&role));
02403 COMCHECK2(role, role->get_Parts(&parts));
02404 MGACOLL_ITERATE(IMgaMetaPart, parts) {
02405 VARIANT_BOOL vv;
02406 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_IsLinked(&vv));
02407 if(vv) break;
02408 }
02409 if(!MGACOLL_AT_END) {
02410 CBuilderReferencePort *bport = new CBuilderReferencePort(iportobj,this);
02411 refPorts.AddTail(bport);
02412 }
02413 MGACOLL_ITERATE_END;
02414 }
02415 } MGACOLL_ITERATE_END;
02416 }
02417 }
02418
02419 void CBuilderModelReference::Destroy() {
02420 POSITION pos = refPorts.GetHeadPosition();
02421 while(pos)
02422 refPorts.GetNext(pos)->Destroy();
02423
02424 CBuilderObject::Destroy();
02425 }
02426
02427 void CBuilderModelReference::Resolve() {
02428 CBuilderReference::Resolve();
02429 ASSERT( ref->IsKindOf(RUNTIME_CLASS(CBuilderModel)) ||
02430 ref->IsKindOf(RUNTIME_CLASS(CBuilderModelReference)) );
02431
02432 POSITION pos = refPorts.GetHeadPosition();
02433 while(pos)
02434 refPorts.GetNext(pos)->Resolve();
02435
02436 }
02437
02438 IMgaObject *CBuilderModelReference::GetPort(CString aspectName,CBuilderReferencePort *port) const
02439 {
02440 return port->GetIObject();
02441 }
02442
02443 CBuilderReferencePort *CBuilderModelReference::FindPortRef(IMgaFCO *i) const {
02444 ASSERT(i);
02445 #ifdef STRONG_LOOKUP
02446 CComPtr<IUnknown> iu;
02447 CComPtr<IMgaFCO> ii = i;
02448 ii.QueryInterface(&iu);
02449 ASSERT(iu);
02450
02451 CBuilderReferencePort* o = NULL;
02452
02453 if( !objectmap.Lookup(iu, o) )
02454 {
02455 CBstr idstr;
02456 COMCHECK2( i, i->get_ID(idstr) );
02457 ASSERT(false);
02458 }
02459 ASSERT(o);
02460
02461 return o;
02462 #else
02463 CBuilderReferencePort* o = NULL;
02464
02465 if( !objectmap.Lookup(i, o) )
02466 {
02467 CBstr idstr;
02468 COMCHECK2( i, i->get_ID(idstr) );
02469 ASSERT(false);
02470 }
02471 ASSERT(o);
02472
02473 return o;
02474 #endif
02475 }
02476
02477 void CBuilderModelReference::SetPortRef(IMgaFCO *i, CBuilderReferencePort *o) {
02478 ASSERT(i && o);
02479
02480 #ifdef STRONG_LOOKUP
02481 CComPtr<IUnknown> iu;
02482 CComPtr<IMgaFCO> ii = i;
02483 ii.QueryInterface(&iu);
02484 ASSERT(iu);
02485
02486
02487
02488
02489
02490 CBuilderReferencePort* o2;
02491 if( objectmap.Lookup(iu, o2) ) {
02492 ASSERT( o == o2 );
02493 }
02494 else
02495 objectmap.SetAt(iu, o);
02496 #else
02497 objectmap.SetAt(i ,o);
02498 #endif
02499 }
02500
02501 void CBuilderModelReference::ForgetPortRef(IMgaFCO* i) {
02502 ASSERT(i);
02503
02504 #ifdef STRONG_LOOKUP
02505 CComPtr<IUnknown> iu;
02506 CComPtr<IMgaFCO> ii = i;
02507 ii.QueryInterface(&iu);
02508 ASSERT(iu);
02509 objectmap.RemoveKey(iu);
02510 #else
02511 objectmap.RemoveKey(i);
02512 #endif
02513 }
02514
02516 IMPLEMENT_DYNAMIC(CBuilderConnection,CBuilderObject)
02517
02518 CBuilderConnection::CBuilderConnection(IMgaSimpleConnection *c,CBuilderModel *o) :
02519 CBuilderObject(c,o), owner(parent)
02520 {
02521 ASSERT(ciConnection && owner);
02522 }
02523
02524 CBuilderConnection::~CBuilderConnection()
02525 {
02526
02527 src->RemoveOutConnection(this);
02528 dst->RemoveInConnection(this);
02529 owner->RemoveConnection(this);
02530
02531 ASSERT( CBuilder::theInstance );
02532 CBuilder::theInstance->ForgetObjectRef(ciConnection);
02533 }
02534
02535 void CBuilderConnection::Destroy()
02536 {
02537 ASSERT(ciConnection);
02538 COMCHECK2(ciConnection, ciConnection->DestroyObject());
02539
02540 ASSERT(owner);
02541 owner->RemoveMemberFromSets(this);
02542
02543 delete this;
02544 }
02545
02546 void CBuilderConnection::Resolve() {
02547 ASSERT(ciConnection);
02548
02549 CComPtr<IMgaFCO> isrc;
02550 CComPtr<IMgaFCO> idst;
02551 CComPtr<IMgaFCOs> isrcrefs;
02552 CComPtr<IMgaFCOs> idstrefs;
02553
02554 COMCHECK2(CComQIPtr<IMgaSimpleConnection>(ciConnection), CComQIPtr<IMgaSimpleConnection>(ciConnection)->get_Src(&isrc) );
02555 COMCHECK2(CComQIPtr<IMgaSimpleConnection>(ciConnection), CComQIPtr<IMgaSimpleConnection>(ciConnection)->get_SrcReferences(&isrcrefs) );
02556
02557 long isrcrcnt;
02558 COMCHECK2(isrcrefs, isrcrefs->get_Count(&isrcrcnt));
02559 CBuilderObject *endobj = CBuilder::theInstance->FindObject(isrc);
02560 if(isrcrcnt) {
02561 CComPtr<IMgaFCO> frTemp;
02562 COMCHECK2( isrcrefs, isrcrefs->get_Item( 1, &frTemp ) );
02563 CComPtr<IMgaFCO> lrTemp;
02564 COMCHECK2( isrcrefs, isrcrefs->get_Item( isrcrcnt, &lrTemp ) );
02565 CBuilderReference* frRef = (CBuilderReference*) CBuilder::theInstance->FindObject( frTemp );
02566 CBuilderReference* lrRef = (CBuilderReference*) CBuilder::theInstance->FindObject( lrTemp );
02567 if ( lrRef->GetReferred() == endobj )
02568 src = frRef;
02569 else
02570 src = ( (CBuilderModelReference*) frRef )->FindPortRef( isrc );
02571 }
02572 else {
02573 src = endobj;
02574 }
02575
02576 COMCHECK2(CComQIPtr<IMgaSimpleConnection>(ciConnection), CComQIPtr<IMgaSimpleConnection>(ciConnection)->get_Dst(&idst) );
02577 COMCHECK2(CComQIPtr<IMgaSimpleConnection>(ciConnection), CComQIPtr<IMgaSimpleConnection>(ciConnection)->get_DstReferences(&idstrefs) );
02578
02579 endobj = CBuilder::theInstance->FindObject(idst);
02580 long dstrcnt;
02581 COMCHECK2(idstrefs, idstrefs->get_Count(&dstrcnt));
02582 if(dstrcnt) {
02583 CComPtr<IMgaFCO> frTemp;
02584 COMCHECK2( idstrefs, idstrefs->get_Item( 1, &frTemp ) );
02585 CComPtr<IMgaFCO> lrTemp;
02586 COMCHECK2( idstrefs, idstrefs->get_Item( dstrcnt, &lrTemp ) );
02587 CBuilderReference* frRef = (CBuilderReference*) CBuilder::theInstance->FindObject( frTemp );
02588 CBuilderReference* lrRef = (CBuilderReference*) CBuilder::theInstance->FindObject( lrTemp );
02589 if ( lrRef->GetReferred() == endobj )
02590 dst = frRef;
02591 else
02592 dst = ( (CBuilderModelReference*) frRef )->FindPortRef( idst );
02593 }
02594 else {
02595 dst = endobj;
02596 }
02597
02598 CBuilderObject* srcParent = NULL;
02599 CBuilderObject* dstParent = NULL;
02600 if ( src->IsKindOf( RUNTIME_CLASS( CBuilderReferencePort ) ) )
02601 srcParent = (CBuilderObject*) ( ( CBuilderReferencePort*) src )->GetOwner();
02602 else
02603 srcParent = (CBuilderObject*) src->GetParent();
02604 if ( dst->IsKindOf( RUNTIME_CLASS( CBuilderReferencePort ) ) )
02605 dstParent = (CBuilderObject*) ( ( CBuilderReferencePort*) dst )->GetOwner();
02606 else
02607 dstParent = (CBuilderObject*) dst->GetParent();
02608
02609 CBuilderObject* srcParent2 = ( srcParent) ? (CBuilderObject*) srcParent->GetParent() : NULL;
02610 CBuilderObject* dstParent2 = ( dstParent) ? (CBuilderObject*) dstParent->GetParent() : NULL;
02611
02612 if ( srcParent ) {
02613 if ( srcParent->IsKindOf( RUNTIME_CLASS( CBuilderModelReference ) ) )
02614 srcParent->AddPortOutConnection( kindName,this );
02615 else if ( srcParent2 && ( srcParent2 == dstParent || dstParent2 && srcParent2 == dstParent2 ) )
02616 srcParent->AddPortOutConnection( kindName,this );
02617 }
02618 if ( dstParent ) {
02619 if ( dstParent->IsKindOf( RUNTIME_CLASS( CBuilderModelReference ) ) )
02620 dstParent->AddPortInConnection( kindName,this );
02621 else if ( dstParent2 && ( dstParent2 == srcParent || srcParent2 && dstParent2 == srcParent2 ) )
02622 dstParent->AddPortInConnection( kindName,this );
02623 }
02624
02625 src->AddOutConnection(kindName,this);
02626 dst->AddInConnection(kindName,this);
02627 }
02628
02630 IMPLEMENT_DYNAMIC(CBuilderSet,CBuilderObject)
02631
02632 CBuilderSet::CBuilderSet(IMgaSet *iCond,CBuilderModel *own)
02633 : CBuilderObject(iCond, own) {
02634 ASSERT(iSet);
02635 }
02636
02637
02638
02639 void CBuilderSet::Resolve() {
02640
02641
02642
02643
02644
02645
02646
02647
02648
02649
02650
02651
02652
02653
02654
02655
02656
02657
02658
02659
02660
02661
02662
02663
02664
02665
02666
02667
02668
02669
02670 {
02671 CComPtr<IMgaFCOs> psa;
02672 COMCHECK2( CComQIPtr<IMgaSet>(iSet), CComQIPtr<IMgaSet>(iSet)->get_Members(&psa) );
02673
02674 MGACOLL_ITERATE(IMgaFCO, psa) {
02675 InsertMember(CBuilder::theInstance->FindObject(MGACOLL_ITER));
02676
02677
02678
02679
02680
02681
02682
02683
02684
02685
02686 } MGACOLL_ITERATE_END;
02687 }
02688 }
02689
02690
02691
02692 CBuilderSet::~CBuilderSet()
02693 {
02694 ASSERT(iSet);
02695
02696 parent->RemoveSet(this);
02697 }
02698
02699
02700
02701
02702
02703
02704
02705
02706
02707
02708
02709
02710
02711
02712
02713
02714 bool CBuilderSet::AddMember(CBuilderObject *member)
02715 {
02716 ASSERT( member && member->GetParent() == parent );
02717
02718 if( members.Find(member) )
02719 return false;
02720
02721 COMCHECK2( CComQIPtr<IMgaSet>(iSet), CComQIPtr<IMgaSet>(iSet)->AddMember(member->GetIObject()) );
02722
02723 members.AddTail(member);
02724 return true;
02725 }
02726
02727 bool CBuilderSet::RemoveMember(CBuilderObject *member)
02728 {
02729 ASSERT( member && member->GetParent() == parent );
02730
02731 POSITION pos = members.Find(member);
02732 if( !pos )
02733 return false;
02734
02735 COMCHECK2( CComQIPtr<IMgaSet>(iSet), CComQIPtr<IMgaSet>(iSet)->RemoveMember(member->GetIObject()) );
02736
02737 members.RemoveAt(pos);
02738 return true;
02739 }
02740
02741
02742
02743
02744 int MyMessageBox(LPCTSTR lpszText, UINT nType = MB_OK)
02745 {
02746 return ::MessageBox(NULL, lpszText, _T("Builder Factory Error"), nType);
02747 }
02748
02749 CBuilderFactory::~CBuilderFactory()
02750 {
02751 if( connectionBuildFunctions )
02752 {
02753 delete connectionBuildFunctions;
02754 connectionBuildFunctions = NULL;
02755 }
02756 if( modelBuildFunctions )
02757 {
02758 delete modelBuildFunctions;
02759 modelBuildFunctions = NULL;
02760 }
02761 if( atomBuildFunctions )
02762 {
02763 delete atomBuildFunctions;
02764 atomBuildFunctions = NULL;
02765 }
02766 if( modelRefBuildFunctions )
02767 {
02768 delete modelRefBuildFunctions;
02769 modelRefBuildFunctions = NULL;
02770 }
02771 if( atomRefBuildFunctions )
02772 {
02773 delete atomRefBuildFunctions;
02774 atomRefBuildFunctions = NULL;
02775 }
02776 }
02777
02778 CBuilderModelCreateFunctionTable* CBuilderFactory::modelBuildFunctions = NULL;
02779 CBuilderAtomCreateFunctionTable* CBuilderFactory::atomBuildFunctions = NULL;
02780
02781 CBuilderRefCreateFunctionTable* CBuilderFactory::refBuildFunctions = NULL;
02782 CBuilderModelRefCreateFunctionTable* CBuilderFactory::modelRefBuildFunctions = NULL;
02783 CBuilderAtomRefCreateFunctionTable* CBuilderFactory::atomRefBuildFunctions = NULL;
02784
02785 CBuilderConnectionCreateFunctionTable* CBuilderFactory::connectionBuildFunctions = NULL;
02786 CBuilderSetCreateFunctionTable* CBuilderFactory::setBuildFunctions = NULL;
02787
02788 CStringList CBuilderFactory::modelkindnames;
02789 CStringList CBuilderFactory::atomkindnames;
02790 CStringList CBuilderFactory::refkindnames;
02791 CStringList CBuilderFactory::connectionkindnames;
02792 CStringList CBuilderFactory::setkindnames;
02793
02794 CBuilderFactory::CBuilderFactory(CString kindnames, CBuilderModelCreateFunction createFn)
02795 {
02796 if(modelBuildFunctions == NULL) {
02797 modelBuildFunctions = new CBuilderModelCreateFunctionTable;
02798 modelBuildFunctions->InitHashTable(29);
02799 }
02800 while( !kindnames.IsEmpty() )
02801 {
02802 CString trash = kindnames.SpanIncluding(_T(",;"));
02803 kindnames = kindnames.Mid(trash.GetLength());
02804 if( kindnames.IsEmpty() )
02805 break;
02806 CString kindname = kindnames.SpanExcluding(_T(",;"));
02807 kindnames = kindnames.Mid(kindname.GetLength());
02808 ASSERT(!kindname.IsEmpty());
02809
02810 CBuilderModelCreateFunction fn;
02811 if(modelBuildFunctions->Lookup(kindname,fn)) {
02812 CString msg = _T("Create function already exists for object type ") + kindname;
02813 MyMessageBox(msg,MB_OK | MB_ICONSTOP);
02814 return;
02815 }
02816 (*modelBuildFunctions)[kindname] = createFn;
02817 }
02818 }
02819
02820 CBuilderModel *CBuilderFactory::Create(IMgaModel* iModel, CBuilderModel *aparent)
02821 {
02822 if( modelBuildFunctions )
02823 {
02824 CBstr bstr;
02825 {
02826 CComPtr<IMgaMetaFCO> meta;
02827 COMCHECK2(iModel, iModel->get_Meta(&meta));
02828 COMCHECK2(meta, meta->get_Name(bstr));
02829 }
02830 CString kindname(bstr);
02831
02832 if( modelkindnames.Find(kindname) == NULL )
02833 {
02834 CString msg;
02835 msg.Format(_T("Model kindname \"%s\" was not found in paradigm."), kindname);
02836 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
02837 }
02838
02839 CBuilderModelCreateFunction fn;
02840
02841 if(modelBuildFunctions->Lookup(kindname,fn))
02842 return fn(iModel,aparent);
02843
02844 if(modelBuildFunctions->Lookup(_T("*"),fn))
02845 return fn(iModel,aparent);
02846 }
02847
02848 CBuilderModel *ret = new CBuilderModel(iModel, aparent);
02849 ASSERT(ret);
02850 return ret;
02851 }
02852
02853 CBuilderFactory::CBuilderFactory(CString kindnames, CBuilderAtomCreateFunction createFn)
02854 {
02855 if(atomBuildFunctions == NULL) {
02856 atomBuildFunctions = new CBuilderAtomCreateFunctionTable;
02857 atomBuildFunctions->InitHashTable(29);
02858 }
02859 while( !kindnames.IsEmpty() )
02860 {
02861 CString trash = kindnames.SpanIncluding(_T(",;"));
02862 kindnames = kindnames.Mid(trash.GetLength());
02863 if( kindnames.IsEmpty() )
02864 break;
02865 CString kindname = kindnames.SpanExcluding(_T(",;"));
02866 kindnames = kindnames.Mid(kindname.GetLength());
02867 ASSERT(!kindname.IsEmpty());
02868
02869 CBuilderAtomCreateFunction fn;
02870 if(atomBuildFunctions->Lookup(kindname,fn)) {
02871 CString msg = "Create function already exists for object type " + kindname;
02872 MyMessageBox(msg,MB_OK | MB_ICONSTOP);
02873 return;
02874 }
02875 (*atomBuildFunctions)[kindname] = createFn;
02876 }
02877 }
02878
02879 CBuilderAtom *CBuilderFactory::Create(IMgaAtom* iAtom, CBuilderModel *aparent)
02880 {
02881 if( atomBuildFunctions )
02882 {
02883 CBstr bstr;
02884 {
02885 CComPtr<IMgaMetaFCO> meta;
02886 COMCHECK2(iAtom, iAtom->get_Meta(&meta));
02887 COMCHECK2(meta, meta->get_Name(bstr));
02888 }
02889 CString kindname(bstr);
02890
02891 if( atomkindnames.Find(kindname) == NULL )
02892 {
02893 CString msg;
02894 msg.Format(_T("Atom kindname \"%s\" was not found in paradigm."), kindname);
02895 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
02896 }
02897
02898 CBuilderAtomCreateFunction fn;
02899
02900 if(atomBuildFunctions->Lookup(kindname,fn))
02901 return fn(iAtom,aparent);
02902
02903 if(atomBuildFunctions->Lookup(_T("*"),fn))
02904 return fn(iAtom,aparent);
02905 }
02906
02907 CBuilderAtom *ret = new CBuilderAtom(iAtom, aparent);
02908 ASSERT(ret);
02909 return ret;
02910 }
02911
02912
02913
02914 CBuilderFactory::CBuilderFactory(CString kindnames, CBuilderRefCreateFunction createFn)
02915 {
02916 if(refBuildFunctions == NULL) {
02917 refBuildFunctions = new CBuilderRefCreateFunctionTable;
02918 refBuildFunctions->InitHashTable(29);
02919 }
02920 while( !kindnames.IsEmpty() )
02921 {
02922 CString trash = kindnames.SpanIncluding(_T(",;"));
02923 kindnames = kindnames.Mid(trash.GetLength());
02924 if( kindnames.IsEmpty() )
02925 break;
02926 CString kindname = kindnames.SpanExcluding(_T(",;"));
02927 kindnames = kindnames.Mid(kindname.GetLength());
02928 ASSERT(!kindname.IsEmpty());
02929
02930 CBuilderRefCreateFunction fn;
02931 CBuilderModelRefCreateFunction fnm;
02932 CBuilderAtomRefCreateFunction fna;
02933 if(refBuildFunctions && refBuildFunctions->Lookup(kindname,fn) ||
02934 modelRefBuildFunctions && modelRefBuildFunctions->Lookup(kindname,fnm) ||
02935 atomRefBuildFunctions && atomRefBuildFunctions->Lookup(kindname,fna)) {
02936 CString msg = "Create function already exists for object type " + kindname;
02937 MyMessageBox(msg,MB_OK | MB_ICONSTOP);
02938 return;
02939
02940 }
02941 (*refBuildFunctions)[kindname] = createFn;
02942 }
02943 }
02944
02945
02946 CBuilderFactory::CBuilderFactory(CString kindnames, CBuilderModelRefCreateFunction createFn) {
02947 if(modelRefBuildFunctions == NULL) {
02948 modelRefBuildFunctions = new CBuilderModelRefCreateFunctionTable;
02949 modelRefBuildFunctions->InitHashTable(29);
02950 }
02951 while( !kindnames.IsEmpty() )
02952 {
02953 CString trash = kindnames.SpanIncluding(_T(",;"));
02954 kindnames = kindnames.Mid(trash.GetLength());
02955 if( kindnames.IsEmpty() )
02956 break;
02957 CString kindname = kindnames.SpanExcluding(_T(",;"));
02958 kindnames = kindnames.Mid(kindname.GetLength());
02959 ASSERT(!kindname.IsEmpty());
02960
02961 CBuilderRefCreateFunction fn;
02962 CBuilderModelRefCreateFunction fnm;
02963 if(refBuildFunctions && refBuildFunctions->Lookup(kindname,fn) ||
02964 modelRefBuildFunctions && modelRefBuildFunctions->Lookup(kindname,fnm)) {
02965 CString msg = "Create function already exists for object type " + kindname;
02966 MyMessageBox(msg,MB_OK | MB_ICONSTOP);
02967 return;
02968 }
02969 (*modelRefBuildFunctions)[kindname] = createFn;
02970 }
02971 }
02972
02973
02974 CBuilderFactory::CBuilderFactory(CString kindnames, CBuilderAtomRefCreateFunction createFn) {
02975 if(atomRefBuildFunctions == NULL) {
02976 atomRefBuildFunctions = new CBuilderAtomRefCreateFunctionTable;
02977 atomRefBuildFunctions->InitHashTable(29);
02978 }
02979 while( !kindnames.IsEmpty() )
02980 {
02981 CString trash = kindnames.SpanIncluding(_T(",;"));
02982 kindnames = kindnames.Mid(trash.GetLength());
02983 if( kindnames.IsEmpty() )
02984 break;
02985 CString kindname = kindnames.SpanExcluding(_T(",;"));
02986 kindnames = kindnames.Mid(kindname.GetLength());
02987 ASSERT(!kindname.IsEmpty());
02988
02989 CBuilderRefCreateFunction fn;
02990 CBuilderAtomRefCreateFunction fna;
02991 if(refBuildFunctions && refBuildFunctions->Lookup(kindname,fn) ||
02992 atomRefBuildFunctions && atomRefBuildFunctions->Lookup(kindname,fna)) {
02993 CString msg = "Create function already exists for object type " + kindname;
02994 MyMessageBox(msg,MB_OK | MB_ICONSTOP);
02995 return;
02996 }
02997 (*atomRefBuildFunctions)[kindname] = createFn;
02998 }
02999 }
03000
03001
03002
03003
03004
03005
03006
03007
03008
03009
03010
03011
03012
03013
03014
03015
03016 CBuilderReference *CBuilderFactory::Create(IMgaReference* iRef, CBuilderModel *aparent) {
03017 CBstr bstr;
03018 objtype_enum ot;
03019 {
03020 CComPtr<IMgaMetaFCO> meta;
03021 COMCHECK2(iRef, iRef->get_Meta(&meta));
03022 COMCHECK2(meta, meta->get_Name(bstr));
03023
03024 CComPtr<IMgaFCO> fco;
03025 COMCHECK2(iRef, iRef->get_Referred(&fco));
03026 if(fco) COMCHECK2(fco, fco->get_ObjType(&ot));
03027 else ot = OBJTYPE_NULL;
03028 }
03029 CString kindname(bstr);
03030
03031 if( refkindnames.Find(kindname) == NULL )
03032 {
03033 CString msg;
03034 msg.Format(_T("Ref kindname \"%s\" was not found in paradigm."), kindname);
03035 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
03036 }
03037
03038
03039 CBuilderRefCreateFunction fn;
03040 if(refBuildFunctions && (refBuildFunctions->Lookup(kindname,fn) || refBuildFunctions->Lookup(_T("*"),fn)))
03041 return fn(iRef,aparent);
03042
03043 if(ot == OBJTYPE_MODEL) {
03044 CBuilderModelRefCreateFunction fn;
03045 if(modelRefBuildFunctions && (modelRefBuildFunctions->Lookup(kindname,fn) || modelRefBuildFunctions->Lookup(_T("*"),fn))) {
03046 return fn(iRef,aparent);
03047 }
03048 return new CBuilderModelReference(iRef, aparent);
03049 }
03050 else if (ot == OBJTYPE_ATOM) {
03051 CBuilderAtomRefCreateFunction fn;
03052 if(atomRefBuildFunctions && (atomRefBuildFunctions->Lookup(kindname,fn) || atomRefBuildFunctions->Lookup(_T("*"),fn))) {
03053 return fn(iRef,aparent);
03054 }
03055 return new CBuilderAtomReference(iRef, aparent);
03056 }
03057
03058 return new CBuilderReference(iRef, aparent);
03059 }
03060
03061
03062
03063
03064 CBuilderFactory::CBuilderFactory(CString kindnames, CBuilderConnectionCreateFunction createFn)
03065 {
03066 if(connectionBuildFunctions == NULL) {
03067 connectionBuildFunctions = new CBuilderConnectionCreateFunctionTable;
03068 connectionBuildFunctions->InitHashTable(29);
03069 }
03070 while( !kindnames.IsEmpty() )
03071 {
03072 CString trash = kindnames.SpanIncluding(_T(",;"));
03073 kindnames = kindnames.Mid(trash.GetLength());
03074 if( kindnames.IsEmpty() )
03075 break;
03076 CString kindname = kindnames.SpanExcluding(_T(",;"));
03077 kindnames = kindnames.Mid(kindname.GetLength());
03078 ASSERT(!kindname.IsEmpty());
03079
03080 CBuilderConnectionCreateFunction fn;
03081 if(connectionBuildFunctions->Lookup(kindname,fn)) {
03082 CString msg = "Create function already exists for object type " + kindname;
03083 MyMessageBox(msg,MB_OK | MB_ICONSTOP);
03084 return;
03085 }
03086 (*connectionBuildFunctions)[kindname] = createFn;
03087 }
03088 }
03089
03090 CBuilderConnection *CBuilderFactory::Create(IMgaSimpleConnection* iConnection, CBuilderModel *aparent)
03091 {
03092 if( connectionBuildFunctions )
03093 {
03094 CBstr bstr;
03095 {
03096 CComPtr<IMgaMetaFCO> meta;
03097 COMCHECK2(iConnection, iConnection->get_Meta(&meta));
03098 COMCHECK2(meta, meta->get_Name(bstr));
03099 }
03100 CString kindname(bstr);
03101
03102 if( connectionkindnames.Find(kindname) == NULL )
03103 {
03104 CString msg;
03105 msg.Format(_T("Connection kindname \"%s\" was not found in paradigm."), kindname);
03106 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
03107 }
03108
03109 CBuilderConnectionCreateFunction fn;
03110
03111 if(connectionBuildFunctions->Lookup(kindname,fn))
03112 return fn(iConnection,aparent);
03113
03114 if(connectionBuildFunctions->Lookup(_T("*"),fn))
03115 return fn(iConnection,aparent);
03116 }
03117
03118 CBuilderConnection *ret = new CBuilderConnection(iConnection, aparent);
03119 ASSERT(ret);
03120 return ret;
03121 }
03122
03123
03124
03125
03126
03127 CBuilderFactory::CBuilderFactory(CString kindnames, CBuilderSetCreateFunction createFn)
03128 {
03129 if(setBuildFunctions == NULL) {
03130 setBuildFunctions = new CBuilderSetCreateFunctionTable;
03131 setBuildFunctions->InitHashTable(29);
03132 }
03133 while( !kindnames.IsEmpty() )
03134 {
03135 CString trash = kindnames.SpanIncluding(_T(",;"));
03136 kindnames = kindnames.Mid(trash.GetLength());
03137 if( kindnames.IsEmpty() )
03138 break;
03139 CString kindname = kindnames.SpanExcluding(_T(",;"));
03140 kindnames = kindnames.Mid(kindname.GetLength());
03141 ASSERT(!kindname.IsEmpty());
03142
03143 CBuilderSetCreateFunction fn;
03144 if(setBuildFunctions->Lookup(kindname,fn)) {
03145 CString msg = "Create function already exists for object type " + kindname;
03146 MyMessageBox(msg,MB_OK | MB_ICONSTOP);
03147 return;
03148 }
03149 (*setBuildFunctions)[kindname] = createFn;
03150 }
03151 }
03152
03153 CBuilderSet *CBuilderFactory::Create(IMgaSet* iSet, CBuilderModel *aparent)
03154 {
03155 if( setBuildFunctions )
03156 {
03157 CBstr bstr;
03158 {
03159 CComPtr<IMgaMetaFCO> meta;
03160 COMCHECK2(iSet, iSet->get_Meta(&meta));
03161 COMCHECK2(meta, meta->get_Name(bstr));
03162 }
03163 CString kindname(bstr);
03164
03165 if( setkindnames.Find(kindname) == NULL )
03166 {
03167 CString msg;
03168 msg.Format(_T("Set kindname \"%s\" was not found in paradigm."), kindname);
03169 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
03170 }
03171
03172 CBuilderSetCreateFunction fn;
03173
03174 if(setBuildFunctions->Lookup(kindname,fn))
03175 return fn(iSet,aparent);
03176
03177 if(setBuildFunctions->Lookup(_T("*"),fn))
03178 return fn(iSet,aparent);
03179 }
03180
03181 CBuilderSet *ret = new CBuilderSet(iSet, aparent);
03182 ASSERT(ret);
03183 return ret;
03184 }
03185
03186
03187
03188 void CBuilderFactory::CollectFolderKindNames(IMgaMetaFolder* mf) {
03189
03190 CComPtr<IMgaMetaFCOs> psa;
03191 COMCHECK2( mf, mf->get_DefinedFCOs(&psa) );
03192 CollectFCOKindNames(psa);
03193 CComPtr<IMgaMetaFolders> folds;
03194 COMCHECK2( mf, mf->get_DefinedFolders(&folds) );
03195 MGACOLL_ITERATE(IMgaMetaFolder, folds) {
03196 CollectFolderKindNames(MGACOLL_ITER);
03197 } MGACOLL_ITERATE_END;
03198 }
03199
03200 void CBuilderFactory::CollectFCOKindNames(IMgaMetaFCOs * psa) {
03201 MGACOLL_ITERATE(IMgaMetaFCO, psa) {
03202 CComBSTR name;
03203 objtype_enum o;
03204 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_Name(&name));
03205 CString n = name;
03206 COMCHECK2(MGACOLL_ITER, MGACOLL_ITER->get_ObjType(&o));
03207 switch(o) {
03208 case OBJTYPE_MODEL: modelkindnames.AddTail(n);
03209 {
03210 CComPtr<IMgaMetaFCOs> psa2;
03211 CComQIPtr<IMgaMetaModel> mm = MGACOLL_ITER;
03212 COMCHECK2(mm, mm->get_DefinedFCOs(&psa2) );
03213 CollectFCOKindNames(psa2);
03214 }
03215 break;
03216 case OBJTYPE_ATOM: atomkindnames.AddTail(n); break;
03217 case OBJTYPE_REFERENCE: refkindnames.AddTail(n); break;
03218 case OBJTYPE_CONNECTION: connectionkindnames.AddTail(n); break;
03219 case OBJTYPE_SET: setkindnames.AddTail(n); break;
03220 }
03221 } MGACOLL_ITERATE_END;
03222 }
03223
03224 void CBuilderFactory::CheckKindNames(IMgaFolder* rf)
03225 {
03226 ASSERT(rf);
03227
03228 modelkindnames.RemoveAll();
03229 atomkindnames.RemoveAll();
03230 refkindnames.RemoveAll();
03231 CComPtr<IMgaMetaFolder> mf;
03232
03233 COMCHECK2( rf, rf->get_MetaFolder(&mf) );
03234 CollectFolderKindNames(mf);
03235
03236 if( modelBuildFunctions )
03237 {
03238
03239 POSITION pos = modelBuildFunctions->GetStartPosition();
03240 while(pos)
03241 {
03242 CString kindname;
03243 CBuilderModelCreateFunction fn;
03244 modelBuildFunctions->GetNextAssoc(pos, kindname, fn);
03245 if( modelkindnames.Find(kindname) == NULL && kindname != "*" )
03246 {
03247 CString msg;
03248 msg.Format(_T("Model kindname \"%s\" was not found in paradigm."), kindname);
03249 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
03250 }
03251 }
03252 }
03253
03254 if( atomBuildFunctions )
03255 {
03256 POSITION pos = atomBuildFunctions->GetStartPosition();
03257 while(pos)
03258 {
03259 CString kindname;
03260 CBuilderAtomCreateFunction fn;
03261 atomBuildFunctions->GetNextAssoc(pos, kindname, fn);
03262 if( atomkindnames.Find(kindname) == NULL && kindname != "*" )
03263 {
03264 CString msg;
03265 msg.Format(_T("Atom kindname \"%s\" was not found in paradigm."), kindname);
03266 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
03267 }
03268 }
03269 }
03270
03271 if( modelRefBuildFunctions || atomRefBuildFunctions )
03272 {
03273 if( modelRefBuildFunctions )
03274 {
03275 POSITION pos = modelRefBuildFunctions->GetStartPosition();
03276 while(pos)
03277 {
03278 CString kindname;
03279 CBuilderModelRefCreateFunction fn;
03280 modelRefBuildFunctions->GetNextAssoc(pos, kindname, fn);
03281 if( refkindnames.Find(kindname) == NULL && kindname != "*" )
03282 {
03283 CString msg;
03284 msg.Format(_T("ModelRef kindname \"%s\" was not found in paradigm."), kindname);
03285 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
03286 }
03287 }
03288 }
03289
03290 if( atomRefBuildFunctions )
03291 {
03292 POSITION pos = atomRefBuildFunctions->GetStartPosition();
03293 while(pos)
03294 {
03295 CString kindname;
03296 CBuilderAtomRefCreateFunction fn;
03297 atomRefBuildFunctions->GetNextAssoc(pos, kindname, fn);
03298 if( refkindnames.Find(kindname) == NULL && kindname != "*" )
03299 {
03300 CString msg;
03301 msg.Format(_T("AtomRef kindname \"%s\" was not found in paradigm."), kindname);
03302 MyMessageBox(msg, MB_OK | MB_ICONSTOP);
03303 }
03304 }
03305 }
03306
03307 }
03308 }