[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