[commit] r2374 - trunk/GME/Mga

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Tue Oct 1 14:13:56 CDT 2013


Author: ksmyth
Date: Tue Oct  1 14:13:56 2013
New Revision: 2374

Log:
Better ErrorInfo when a connection cant be created (or connpoint set)

Modified:
   trunk/GME/Mga/MgaCheck.cpp
   trunk/GME/Mga/MgaConnection.cpp
   trunk/GME/Mga/MgaFCO.h
   trunk/GME/Mga/MgaProject.cpp

Modified: trunk/GME/Mga/MgaCheck.cpp
==============================================================================
--- trunk/GME/Mga/MgaCheck.cpp	Tue Oct  1 14:13:45 2013	(r2373)
+++ trunk/GME/Mga/MgaCheck.cpp	Tue Oct  1 14:13:56 2013	(r2374)
@@ -58,7 +58,8 @@
 #ifdef DEBUG
 	CComBSTR tname = t[ATTRID_NAME], bname = pathbeg[ATTRID_NAME];
 #endif
-	if(COM_EQUAL(t, pathbeg)) return;
+	if (COM_EQUAL(t, pathbeg))
+		return;
 	metaref_type mr = t[ATTRID_ROLEMETA];
 	CoreObj parent = t[ATTRID_FCOPARENT];
 	if(!mr) {  // == t.IsRootFCO()
@@ -274,130 +275,182 @@
 						mgaproject->deferredchecks.insert(this);
 					}
 				}
-				else COMTHROW(CheckRCS());
+				else
+					CheckRCS();
 			}
 		}
 	} COMCATCH(;);
 }
 
 
-HRESULT FCO::CheckRCS() {
-	COMTRY {
-		objtype_enum typ;
-		CComPtr<IMgaMetaFCO> meta;
-		COMTHROW(get_Meta(&meta));
-
-		COMTHROW(get_ObjType(&typ));
-		if(typ == OBJTYPE_REFERENCE) {
-			CComQIPtr<IMgaMetaReference> refmeta = meta;
-			CoreObj target = self[ATTRID_REFERENCE];
-			if(target) {
-				CComBSTR abspath = "";
-				get_absmetapath(target, abspath);
-				VARIANT_BOOL good;
-				COMTHROW(refmeta->CheckPath(abspath, &good));
-				if(!good)
-					COMTHROW(E_MGA_META_VIOLATION);
-			}
-			// inherited ref can only refer to a derived instance of the target
-			// of its base. (Derived null ref is also rejected, but null ref in archetype is accepted)
-			CoreObj basetype = self[ATTRID_DERIVED];
-			if (basetype && !(mgaproject->preferences & MGAPREF_FREEINSTANCEREFS))
+void FCO::CheckRCS() {
+	objtype_enum typ;
+	CComPtr<IMgaMetaFCO> meta;
+	COMTHROW(get_Meta(&meta));
+
+	COMTHROW(get_ObjType(&typ));
+	if(typ == OBJTYPE_REFERENCE) {
+		CComQIPtr<IMgaMetaReference> refmeta = meta;
+		CoreObj target = self[ATTRID_REFERENCE];
+		if(target) {
+			CComBSTR abspath = "";
+			get_absmetapath(target, abspath);
+			VARIANT_BOOL good;
+			COMTHROW(refmeta->CheckPath(abspath, &good));
+			if(!good)
+				COMTHROW(E_MGA_META_VIOLATION);
+		}
+		// inherited ref can only refer to a derived instance of the target
+		// of its base. (Derived null ref is also rejected, but null ref in archetype is accepted)
+		CoreObj basetype = self[ATTRID_DERIVED];
+		if (basetype && !(mgaproject->preferences & MGAPREF_FREEINSTANCEREFS))
+		{
+			CoreObj base_target = basetype[ATTRID_REFERENCE];
+			if (base_target)
 			{
-				CoreObj base_target = basetype[ATTRID_REFERENCE];
-				if (base_target)
-				{
-					for ( ; target; target = target[ATTRID_DERIVED]) {
-						if (COM_EQUAL(base_target, target))
-							break;
-					}
-					if (!target)
-						COMTHROW(E_MGA_INVALID_TARGET);
+				for ( ; target; target = target[ATTRID_DERIVED]) {
+					if (COM_EQUAL(base_target, target))
+						break;
 				}
+				if (!target)
+					COMTHROW(E_MGA_INVALID_TARGET);
 			}
 		}
-		else if(typ == OBJTYPE_SET) {
-			CComQIPtr<IMgaMetaSet> setmeta = meta;
-			CComPtr<IMgaFCOs> members;
-			COMTHROW(get_Members(&members));
-			MGACOLL_ITERATE(IMgaFCO, members) {
-				CComBSTR relpath = "";
-				get_relmetapath(CoreObj(MGACOLL_ITER), relpath, CoreObj(self[ATTRID_FCOPARENT]));
-				VARIANT_BOOL good;
-				COMTHROW(setmeta->CheckPath(relpath, &good));
-				if(!good)
-					COMTHROW(E_MGA_META_VIOLATION);
-			} MGACOLL_ITERATE_END;
-		}
-		else if(typ == OBJTYPE_CONNECTION) {
-			CComQIPtr<IMgaMetaConnection> connmeta = meta;
-			CComBSTR relpath;
-			CComBSTR separator = "";
-			CoreObjs roles = self[ATTRID_CONNROLE+ATTRID_COLLECTION];
-			long c;
-			COMTHROW(roles->get_Count(&c));
-			if( simpleconn() && 
-				!(mgaproject->preferences & MGAPREF_IGNORECONNCHECKS) &&
-				c != 2)
+	}
+	else if(typ == OBJTYPE_SET) {
+		CComQIPtr<IMgaMetaSet> setmeta = meta;
+		CComPtr<IMgaFCOs> members;
+		COMTHROW(get_Members(&members));
+		MGACOLL_ITERATE(IMgaFCO, members) {
+			CComBSTR relpath = "";
+			get_relmetapath(CoreObj(MGACOLL_ITER), relpath, CoreObj(self[ATTRID_FCOPARENT]));
+			VARIANT_BOOL good;
+			COMTHROW(setmeta->CheckPath(relpath, &good));
+			if(!good)
+				COMTHROW(E_MGA_META_VIOLATION);
+		} MGACOLL_ITERATE_END;
+	}
+	else if(typ == OBJTYPE_CONNECTION) {
+		auto error_gen = [this]() -> _bstr_t {
+			IMgaSimpleConnectionPtr simpleConn;
+			getinterface(&simpleConn, 0);
+			if (!simpleConn)
 			{
-				CComBSTR msg;
-				msg += "The connection named \"";
-				CComBSTR name;
-				get_Name(&name);
-				msg += name;
-				if (c == 0)
-					msg += "\" doesn't have endpoints!";
-				else if (c == 1)
-					msg += "\" has only one endpoint!";
-				else
-					msg += "\" has more than two endpoints!";
-				msg += "\nProperties:\n";
-				CComBSTR relpath2;
-				CComBSTR separator2 = "";
-				COMTRY {
-					ITERATE_THROUGH(roles) {
-						CComBSTR n = ITER[ATTRID_NAME];
-						COMTHROW(relpath2.Append(separator2));
-						COMTHROW(relpath2.Append("Connection role and id: "));
-						COMTHROW(relpath2.Append(n));
-						CoreObj curp(self[ATTRID_FCOPARENT]);
-						CoreObjs segs = ITER[ATTRID_CONNSEG+ATTRID_COLLECTION];
-						segs.Sort();
-						{
-							ITERATE_THROUGH(segs) {
-							   CoreObj seg = ITER[ATTRID_SEGREF];
-							   ASSERT(seg && GetMetaID(seg) == DTID_REFERENCE);
-							   get_relmetapath(seg, relpath2, curp);
-							   curp = seg[ATTRID_REFERENCE];
-							   if(!curp) COMTHROW(E_MGA_META_VIOLATION);;
-							}
+				throw;
+			}
+			_bstr_t err = L"Illegal connection ";
+			err += simpleConn->Name;
+			err += " (";
+			err += simpleConn->Meta->Name;
+			err += ")";
+			if (simpleConn->Src)
+			{
+				err += L" from ";
+				err += simpleConn->Src->Name;
+				err += L" (";
+				err += simpleConn->Src->Meta->Name;
+				err += L") ";
+				if (simpleConn->SrcReferences && simpleConn->SrcReferences->Count > 0)
+				{
+					err += L" through refport ";
+					err += simpleConn->SrcReferences->GetItem(1)->Name;
+					err += "->";
+					IMgaReferencePtr ref = simpleConn->SrcReferences->GetItem(1);
+					err += ref->Referred->Name;
+					err += L" (";
+					err += simpleConn->SrcReferences->GetItem(1)->Meta->Name;
+					err += L")";
+				}
+			}
+			if (simpleConn->Dst)
+			{
+				err += L" to ";
+				err += simpleConn->Dst->Name;
+				err += L" (";
+				err += simpleConn->Dst->Meta->Name;
+				err += L")";
+				if (simpleConn->DstReferences && simpleConn->DstReferences->Count > 0)
+				{
+					err += L" through refport ";
+					err += simpleConn->DstReferences->GetItem(1)->Name;
+					err += "->";
+					IMgaReferencePtr ref = simpleConn->DstReferences->GetItem(1);
+					err += ref->Referred->Name;
+					err += L" (";
+					err += simpleConn->DstReferences->GetItem(1)->Meta->Name;
+					err += L")";
+				}
+			}
+			return err;
+		};
+		CComQIPtr<IMgaMetaConnection> connmeta = meta;
+		CComBSTR relpath;
+		CComBSTR separator = "";
+		CoreObjs roles = self[ATTRID_CONNROLE+ATTRID_COLLECTION];
+		long c;
+		COMTHROW(roles->get_Count(&c));
+		if( simpleconn() && 
+			!(mgaproject->preferences & MGAPREF_IGNORECONNCHECKS) &&
+			c != 2)
+		{
+			CComBSTR msg;
+			msg += "The connection named \"";
+			CComBSTR name;
+			get_Name(&name);
+			msg += name;
+			if (c == 0)
+				msg += "\" doesn't have endpoints!";
+			else if (c == 1)
+				msg += "\" has only one endpoint!";
+			else
+				msg += "\" has more than two endpoints!";
+			msg += "\nProperties:\n";
+			CComBSTR relpath2;
+			CComBSTR separator2 = "";
+			COMTRY {
+				ITERATE_THROUGH(roles) {
+					CComBSTR n = ITER[ATTRID_NAME];
+					COMTHROW(relpath2.Append(separator2));
+					COMTHROW(relpath2.Append("Connection role and id: "));
+					COMTHROW(relpath2.Append(n));
+					CoreObj curp(self[ATTRID_FCOPARENT]);
+					CoreObjs segs = ITER[ATTRID_CONNSEG+ATTRID_COLLECTION];
+					segs.Sort();
+					{
+						ITERATE_THROUGH(segs) {
+							CoreObj seg = ITER[ATTRID_SEGREF];
+							ASSERT(seg && GetMetaID(seg) == DTID_REFERENCE);
+							get_relmetapath(seg, relpath2, curp);
+							curp = seg[ATTRID_REFERENCE];
+							if (!curp)
+								COMTHROW(E_MGA_META_VIOLATION);;
 						}
-						CoreObj end = ITER[ATTRID_XREF];
-						CComPtr<IMgaFCO> endfco;
-						ObjForCore(end)->getinterface(&endfco);
-						get_relmetapath(end, relpath2, curp);
-						COMTHROW(relpath2.Append(", FCO name: "));
-						CComBSTR fcoName;
-						COMTHROW(endfco->get_Name(&fcoName));
-						COMTHROW(relpath2.Append(fcoName));
-						COMTHROW(relpath2.Append(", FCO ID: "));
-						CComBSTR fcoID;
-						COMTHROW(endfco->get_ID(&fcoID));
-						COMTHROW(relpath2.Append(fcoID));
-						separator2 = "\n";
 					}
+					CoreObj end = ITER[ATTRID_XREF];
+					CComPtr<IMgaFCO> endfco;
+					ObjForCore(end)->getinterface(&endfco);
+					get_relmetapath(end, relpath2, curp);
+					COMTHROW(relpath2.Append(", FCO name: "));
+					CComBSTR fcoName;
+					COMTHROW(endfco->get_Name(&fcoName));
+					COMTHROW(relpath2.Append(fcoName));
+					COMTHROW(relpath2.Append(", FCO ID: "));
+					CComBSTR fcoID;
+					COMTHROW(endfco->get_ID(&fcoID));
+					COMTHROW(relpath2.Append(fcoID));
+					separator2 = "\n";
 				}
-				catch(hresult_exception &e)
-				{
-					ASSERT(FAILED(e.hr));
-					SetErrorInfo(e.hr);
-					return e.hr;
-				}
-				msg += relpath2;
-				msg += "\nMissing endpoints sometimes can be generated by UDM based interpreters.";
-				::MessageBox(NULL, msg, _T("Connection endpoint error") , MB_OK | MB_ICONERROR);
-				COMTHROW(E_MGA_META_VIOLATION);
 			}
+			catch(hresult_exception &e)
+			{
+				throw_com_error(e.hr, error_gen());
+			}
+			msg += relpath2;
+			msg += "\nMissing endpoints sometimes can be generated by UDM based interpreters.";
+			throw_com_error(E_MGA_META_VIOLATION, msg);
+		}
+		try
+		{
 			ITERATE_THROUGH(roles) {
 				CComBSTR n = ITER[ATTRID_NAME];
 				COMTHROW(relpath.Append(separator));
@@ -407,26 +460,32 @@
 				segs.Sort();
 				{
 					ITERATE_THROUGH(segs) {
-				       CoreObj seg = ITER[ATTRID_SEGREF];
- 					   ASSERT(seg && GetMetaID(seg) == DTID_REFERENCE);
-					   get_relmetapath(seg, relpath, curp);
-					   curp = seg[ATTRID_REFERENCE];
-					   if(!curp) COMTHROW(E_MGA_META_VIOLATION);;
+						CoreObj seg = ITER[ATTRID_SEGREF];
+ 						ASSERT(seg && GetMetaID(seg) == DTID_REFERENCE);
+						get_relmetapath(seg, relpath, curp);
+						curp = seg[ATTRID_REFERENCE];
+						if (!curp)
+							COMTHROW(E_MGA_META_VIOLATION);;
 					}
 				}
-			    CoreObj end = ITER[ATTRID_XREF];
-			    CComPtr<IMgaFCO> endfco;
-			    ObjForCore(end)->getinterface(&endfco);
-			    get_relmetapath(end, relpath, curp);
+				CoreObj end = ITER[ATTRID_XREF];
+				CComPtr<IMgaFCO> endfco;
+				ObjForCore(end)->getinterface(&endfco);
+				get_relmetapath(end, relpath, curp);
 				separator = ", ";
 			}
-			VARIANT_BOOL good;
-			COMTHROW(connmeta->CheckPaths(relpath, &good));
-			if(!good) COMTHROW(E_MGA_META_VIOLATION);
-
 		}
-	} COMCATCH(;);
-	
+		catch (const hresult_exception& e)
+		{
+			_bstr_t err = error_gen();
+			throw_com_error(E_MGA_NOT_CONNECTIBLE, err);
+		}
+		VARIANT_BOOL good;
+		COMTHROW(connmeta->CheckPaths(relpath, &good));
+		if (!good)
+			throw_com_error(E_MGA_META_VIOLATION, error_gen() + L": meta violation");
+
+	}
 }
 
 

Modified: trunk/GME/Mga/MgaConnection.cpp
==============================================================================
--- trunk/GME/Mga/MgaConnection.cpp	Tue Oct  1 14:13:45 2013	(r2373)
+++ trunk/GME/Mga/MgaConnection.cpp	Tue Oct  1 14:13:56 2013	(r2374)
@@ -211,7 +211,9 @@
 		}
 	}
 
-	COMTHROW(ObjForCore(self)->Check());
+	IMgaObjectPtr iObject;
+	ObjForCore(self)->getinterface(&iObject, 0);
+	iObject->__Check();
 	ObjForCore((*peers)[0])->SelfMark(OBJEVENT_CONNECTED);
 	ObjForCore(self)->SelfMark(OBJEVENT_RELATION);
 	(*peers)[peercnt-1] = role;

Modified: trunk/GME/Mga/MgaFCO.h
==============================================================================
--- trunk/GME/Mga/MgaFCO.h	Tue Oct  1 14:13:45 2013	(r2373)
+++ trunk/GME/Mga/MgaFCO.h	Tue Oct  1 14:13:56 2013	(r2374)
@@ -385,7 +385,7 @@
 	HRESULT CheckTree();
 
 	// check the relations in refs, conns and sets
-		HRESULT CheckRCS();
+		void CheckRCS();
 		// Get a list of basetypes this object is derived from
 		HRESULT FCO::get_AllBaseTypes(IMgaFCOs **bases);
 		// Get root parent of object

Modified: trunk/GME/Mga/MgaProject.cpp
==============================================================================
--- trunk/GME/Mga/MgaProject.cpp	Tue Oct  1 14:13:45 2013	(r2373)
+++ trunk/GME/Mga/MgaProject.cpp	Tue Oct  1 14:13:56 2013	(r2374)
@@ -1463,11 +1463,15 @@
 
 STDMETHODIMP CMgaProject::CheckSupress(VARIANT_BOOL s) {
 	COMTRY_IN_TRANSACTION {
-		if(s) checkoff = true;
-		else { 
+		if (s)
+			checkoff = true;
+		else
+		{ 
 			for(objhash::iterator i = deferredchecks.begin(); i != deferredchecks.end(); ++i) {
-				if(GetMetaID((*i)->self) == DTID_FOLDER) COMTHROW((*i)->Check());
-				else COMTHROW((*i)->CheckRCS());
+				if (GetMetaID((*i)->self) == DTID_FOLDER)
+					COMTHROW((*i)->Check());
+				else
+					(*i)->CheckRCS();
 			}
 			deferredchecks.clear();
 			checkoff = false;


More information about the gme-commit mailing list