[GME-commit] GMESRC/Tools/GMEMerge Merge.cpp,1.3,1.4

gme-commit at list.isis.vanderbilt.edu gme-commit at list.isis.vanderbilt.edu
Fri Sep 22 20:36:38 CDT 2006


Update of /project/gme-repository/GMESRC/Tools/GMEMerge
In directory escher:/tmp/cvs-serv12589

Modified Files:
	Merge.cpp 
Log Message:
no message

CVS User: Gyorgy Balogh, ISIS (bogyom)

Index: Merge.cpp
===================================================================
RCS file: /project/gme-repository/GMESRC/Tools/GMEMerge/Merge.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** Merge.cpp	16 Aug 2006 14:50:37 -0000	1.3
--- Merge.cpp	22 Sep 2006 19:36:36 -0000	1.4
***************
*** 14,20 ****
  }
  
! void Merge::doMerge( IMgaProject * act_proj, IMgaProject * mergein_proj )
  {
! 	try
  	{
  		long project_prefs_org;
--- 14,67 ----
  }
  
! void Merge::test1()
  {
! 	ObjMap act;
! 	
! 	addSubTreeToMap( CComPtr<IMgaObject>(act_root), act );
! 
! 	ObjMap::iterator it = act.begin();
! 	while( it!=act.end() )
! 	{	
! 		CComPtr<IMgaObject> o( it->second );
! 
! 		int type = getType(o);
! 		if( type==OBJTYPE_MODEL || type==OBJTYPE_ATOM || type==OBJTYPE_REFERENCE ||
! 			type==OBJTYPE_CONNECTION || type==OBJTYPE_SET )
! 		{
! 			CComPtr<IMgaFCO> fco;
! 			COMTHROW( o->QueryInterface( &fco ) );
! 
! 			CComPtr<IMgaFCO> type;
! 			VARIANT_BOOL     instance;
! 			VARIANT_BOOL     primary;
! 			GUID             guid;
! 			GUID             type_guid;
! 
! 			guid = getGuid(o);
! 
! 			COMTHROW( fco->get_DerivedFrom(&type));
! 			COMTHROW( fco->get_IsInstance(&instance));
! 			COMTHROW( fco->get_IsPrimaryDerived(&primary) );
! 
! 			if( type.p != NULL && primary==VARIANT_TRUE )
! 			{
! 				type_guid = getGuid(CComPtr<IMgaObject>(type));
! 
! 				COMTHROW( fco->DetachFromArcheType() );
! 				fco->AttachToArcheType( type, instance );
! 			}
! 
! 			fco.Release();
! 		}
! 
! 		o.Release();
! 
! 		it++;
! 	}	
! }
! 
! 
! void Merge::doMerge( IMgaProject * act_proj, IMgaProject * mergein_proj )
! {	try
  	{
  		long project_prefs_org;
***************
*** 52,58 ****
  	}
  	catch(...)
! 	{
! 		COMTHROW(act_project->AbortTransaction());
! 		COMTHROW(mergein_project->AbortTransaction());
  		AfxMessageBox("Merge failed!");
  	}
--- 99,105 ----
  	}
  	catch(...)
! 	{		
! 		act_project->AbortTransaction();
! 		mergein_project->AbortTransaction();
  		AfxMessageBox("Merge failed!");
  	}
***************
*** 94,97 ****
--- 141,147 ----
  void Merge::doMerge()
  {
+ 	//test1();
+ 	//return;
+ 
  	deleteObjects();
  
***************
*** 231,239 ****
  		CComPtr<IMgaFCO> fco;
  		CComPtr<IMgaFCO> type_fco;
  
  		COMTHROW( parent->QueryInterface( &fco ) );
  		COMTHROW( fco->get_DerivedFrom(&type_fco));
! 
! 		if( type_fco.p != NULL )
  		{			
  			GUID type_guid = getGuid(CComPtr<IMgaObject>(type_fco));
--- 281,291 ----
  		CComPtr<IMgaFCO> fco;
  		CComPtr<IMgaFCO> type_fco;
+ 		VARIANT_BOOL     primary;
  
  		COMTHROW( parent->QueryInterface( &fco ) );
  		COMTHROW( fco->get_DerivedFrom(&type_fco));
! 		COMTHROW( fco->get_IsPrimaryDerived(&primary) );
! 		
! 		if( type_fco.p != NULL && primary )
  		{			
  			GUID type_guid = getGuid(CComPtr<IMgaObject>(type_fco));
***************
*** 279,284 ****
  		CComPtr<IMgaFCO> type = findFCO(act_root,it->second.type); 
  
! 		if( fco.p != NULL )
! 			COMTHROW( fco->AttachToArcheType( type, it->second.instance ) );
  
  		it++;
--- 331,381 ----
  		CComPtr<IMgaFCO> type = findFCO(act_root,it->second.type); 
  
! 		GUID fco_g = it->first;
! 		GUID type_g = it->second.type;
! 
! 		VARIANT_BOOL writeable;
! 
! 		COMTHROW( fco->get_IsWritable( &writeable ) );
! 
! 		if( fco.p != NULL && writeable )
! 		{
! 			//CComPtr<IMgaFCO> org_type;
! 			//COMTHROW( fco->get_DerivedFrom(&org_type));
! 
! 			//COMTHROW( fco->DetachFromArcheType() );
! 			//COMTHROW( fco->AttachToArcheType( type, it->second.instance ) );
! 			try
! 			{
! 				fco->AttachToArcheType( type, it->second.instance );
! 			}
! 			catch(...)
! 			{
! 			}
! 
! 			/*if( org_type.p != NULL )
! 			{
! 				GUID org_type_g = getGuid( CComPtr<IMgaObject>(org_type) );				
! 				if( !IsEqualGUID( type_g, org_type_g ) )
! 				{
! 					COMTHROW( fco->AttachToArcheType( type, it->second.instance ) );
! 				}				
! 				else
! 					COMTHROW( fco->AttachToArcheType( type, it->second.instance ) );
! 			}
! 			else
! 				COMTHROW( fco->AttachToArcheType( type, it->second.instance ) );*/
! 
! 			/*// hack! AttachToArcheType sometimes throws an exception.
! 			try
! 			{
! 				COMTHROW( fco->AttachToArcheType( type, it->second.instance ) );
! 			}
! 			catch(...)
! 			{				
! 			}*/
! 		}
! 
! 		fco.Release();
! 		type.Release();
  
  		it++;
***************
*** 292,304 ****
  	{		
  		CComPtr<IMgaFCO> fco      = findFCO(act_root,it->first);
! 		CComPtr<IMgaFCO> reffered = findFCO(act_root,it->second);
  
  		if( fco.p != NULL )
  		{
! 			CComPtr<IMgaReference> ref;
  
! 			COMTHROW( fco->QueryInterface( &ref ) );
  
! 			ref->put_Referred( reffered );
  		}
  		it++;
--- 389,407 ----
  	{		
  		CComPtr<IMgaFCO> fco      = findFCO(act_root,it->first);
! 		CComPtr<IMgaFCO> reffered = findFCO(act_root,it->second);		
  
  		if( fco.p != NULL )
  		{
! 			VARIANT_BOOL	 writeable;
! 			COMTHROW( fco->get_IsWritable( &writeable ) );
  
! 			if( writeable )
! 			{
! 				CComPtr<IMgaReference> ref;
  
! 				COMTHROW( fco->QueryInterface( &ref ) );
! 
! 				ref->put_Referred( reffered );
! 			}
  		}
  		it++;
***************
*** 310,343 ****
  	ConnInfoMap::iterator it = conn_info.begin();
  	while( it!=conn_info.end() )
! 	{		
! 		CComPtr<IMgaFCO> fco = findFCO(act_root,it->first);
  		if( fco.p != NULL )
  		{			
  			CComPtr<IMgaConnection> conn;
! 			CComPtr<IMgaConnPoint> conn_point;
  
  			COMTHROW( fco->QueryInterface( &conn) );
  
! 			// check if all targets exist
! 			bool found_all = true;
! 			ConnPointVec::iterator it2 = it->second.begin();
! 			while( it2!=it->second.end() )
  			{
! 				CComPtr<IMgaFCO> target = findFCO(act_root,it2->target);
! 				if( target.p == NULL )
! 				{
! 					found_all = false;
! 					break;
! 				}
! 				else
  				{
! 					COMTHROW( conn->AddConnPoint(it2->role_name,0,target,NULL,&conn_point) );
! 					conn_point.Release();
  				}
- 				it2++;
- 			}
  
! 			if( !found_all )
! 				conn->DestroyObject();
  		}
  		it++;
--- 413,456 ----
  	ConnInfoMap::iterator it = conn_info.begin();
  	while( it!=conn_info.end() )
! 	{				
! 		CComPtr<IMgaFCO> fco = findFCO(act_root,it->first);		
  		if( fco.p != NULL )
  		{			
  			CComPtr<IMgaConnection> conn;
! 			CComPtr<IMgaConnPoint>  conn_point;
! 			VARIANT_BOOL			writeable;
  
  			COMTHROW( fco->QueryInterface( &conn) );
+ 			COMTHROW( fco->get_IsWritable( &writeable ) );
  
! 			if( writeable )
  			{
! 				// check if all targets exist
! 				bool found_all = true;
! 				ConnPointVec::iterator it2 = it->second.begin();
! 				while( it2!=it->second.end() )
  				{
! 					CComPtr<IMgaFCO> target = findFCO(act_root,it2->target);
! 					if( target.p == NULL )
! 					{
! 						found_all = false;
! 						break;
! 					}
! 					else
! 					{
! 						//COMTHROW( conn->AddConnPoint(it2->role_name,0,target,NULL,&conn_point) );
! 						HRESULT hres = conn->AddConnPoint(it2->role_name,0,target,NULL,&conn_point);
! 						if( hres != S_OK )
! 						{
! 							printf("alma");
! 						}
! 						conn_point.Release();
! 					}
! 					it2++;
  				}
  
! 				if( !found_all )
! 					conn->DestroyObject();
! 			}
  		}
  		it++;
***************
*** 376,379 ****
--- 489,506 ----
  }
  
+ bool Merge::shouldFollowLink( CComPtr<IMgaFCO> fco )
+ {
+ 	VARIANT_BOOL	  primary_derived;
+ 	CComPtr<IMgaFCO>  derived_from;
+ 
+ 	//VARIANT_BOOL instance;
+ 	//COMTHROW( act->get_IsInstance(&instance) );
+ 
+ 	COMTHROW( fco->get_IsPrimaryDerived(&primary_derived) );
+ 	COMTHROW( fco->get_DerivedFrom(&derived_from) );
+ 
+ 	return (derived_from.p == NULL || primary_derived == VARIANT_TRUE );
+ }
+ 
  void Merge::mergeFolders( CComPtr<IMgaFolder> act, CComPtr<IMgaFolder> mergein )
  {
***************
*** 395,398 ****
--- 522,532 ----
  		act_fco = findFCOInChildren( act, guid );
  
+ 		if( !shouldFollowLink(mergein_fco) || (act_fco.p!=NULL && !shouldFollowLink(act_fco) ))
+ 		{
+ 			mergein_fco.Release();
+ 			act_fco.Release();
+ 			continue;
+ 		}
+ 
  		if( act_fco.p == NULL )
  		{
***************
*** 426,430 ****
  	CComPtr<IMgaFolders> mergein_subfolders;
  	CComPtr<IMgaFolder>  mergein_folder;
! 	CComPtr<IMgaFCO>	 act_folder;
  
  	COMTHROW( mergein->get_ChildFolders(&mergein_subfolders) );
--- 560,564 ----
  	CComPtr<IMgaFolders> mergein_subfolders;
  	CComPtr<IMgaFolder>  mergein_folder;
! 	CComPtr<IMgaFolder>	 act_folder;
  
  	COMTHROW( mergein->get_ChildFolders(&mergein_subfolders) );
***************
*** 445,454 ****
  
  			// create folder
! 			CComPtr<IMgaFolder> new_folder = copyFolder( mergein_folder, act );
! 
! 			mergeFolders( new_folder, mergein_folder );
! 
! 			COMTHROW( act_folder->QueryInterface(&new_folder) );
  
  			// TODO: copy registry!!
  		}
--- 579,586 ----
  
  			// create folder
! 			CComPtr<IMgaFolder> new_folder = copyFolder( mergein_folder, act );			
  
+ 			COMTHROW( new_folder->QueryInterface(&act_folder) );
+ 			
  			// TODO: copy registry!!
  		}
***************
*** 458,461 ****
--- 590,595 ----
  		}
  
+ 		mergeFolders( act_folder, mergein_folder );
+ 
  		act_folder.Release();
  		mergein_folder.Release();
***************
*** 470,473 ****
--- 604,610 ----
  	CComPtr<IMgaFCO>  act_fco;
  
+ 	if( !shouldFollowLink(CComPtr<IMgaFCO>(act)) || !shouldFollowLink(CComPtr<IMgaFCO>(mergein)) )
+ 		return;	
+ 
  	COMTHROW( mergein->get_ChildFCOs(&mergein_children) );
  	COMTHROW( mergein_children->get_Count(&n) );
***************
*** 475,479 ****
  	{
  		COMTHROW( mergein_children->get_Item(i,&mergein_fco) );
! 
  		GUID guid = getGuid(CComPtr<IMgaObject>(mergein_fco));
  		int  type = getType(CComPtr<IMgaObject>(mergein_fco));
--- 612,616 ----
  	{
  		COMTHROW( mergein_children->get_Item(i,&mergein_fco) );
! 		
  		GUID guid = getGuid(CComPtr<IMgaObject>(mergein_fco));
  		int  type = getType(CComPtr<IMgaObject>(mergein_fco));
***************
*** 481,484 ****
--- 618,628 ----
  		act_fco = findFCOInChildren( act, guid );
  
+ 		if( !shouldFollowLink(mergein_fco) || (act_fco.p!=NULL && !shouldFollowLink(act_fco) ))
+ 		{
+ 			mergein_fco.Release();
+ 			act_fco.Release();
+ 			continue;
+ 		}
+ 
  		if( act_fco.p == NULL )
  		{
***************
*** 684,687 ****
--- 828,833 ----
  	CComPtr<IMgaAttribute>  dest_attrib;
  
+ 	CComPtr<IMgaMetaAttribute> meta_attrib;
+ 
  	COMTHROW( src->get_Attributes(&src_attribs) );
  	COMTHROW( dest->get_Attributes(&dest_attribs) );
***************
*** 691,694 ****
--- 837,842 ----
  		COMTHROW( src_attribs->get_Item(i,&src_attrib) );
  		COMTHROW( dest_attribs->get_Item(i,&dest_attrib) );
+ 
+ 		COMTHROW( src_attrib->get_Meta( &meta_attrib ) );
  		
  		CComVariant val;
***************
*** 698,701 ****
--- 846,850 ----
  		src_attrib.Release();
  		dest_attrib.Release();
+ 		meta_attrib.Release();		
  	}
  }
***************
*** 836,839 ****
--- 985,989 ----
  		COMTHROW( subfolders->get_Item(i,&folder) );
  		CComPtr<IMgaFCO> res = findFCO( folder, g );
+ 		folder.Release();
  		if( res.p != NULL )
  			return res;
***************
*** 916,919 ****
--- 1066,1071 ----
  		if( IsEqualGUID( getGuid(CComPtr<IMgaObject>(folder)), g ))
  			return folder;
+ 
+ 		folder.Release();
  	}
  	return CComPtr<IMgaFolder>();



More information about the GME-commit mailing list