[commit] r2773 - trunk/GME/Parser

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Mon Jul 8 13:30:43 CDT 2019


Author: ksmyth
Date: Mon Jul  8 13:30:43 2019
New Revision: 2773

Log:
XME serialization: support writing mga2.dtd GUID-based xmes. Not yet enabled

Modified:
   trunk/GME/Parser/MgaDumper.cpp
   trunk/GME/Parser/MgaDumper.h

Modified: trunk/GME/Parser/MgaDumper.cpp
==============================================================================
--- trunk/GME/Parser/MgaDumper.cpp	Mon Jul  8 13:30:40 2019	(r2772)
+++ trunk/GME/Parser/MgaDumper.cpp	Mon Jul  8 13:30:43 2019	(r2773)
@@ -142,6 +142,8 @@
 STDMETHODIMP CMgaDumper::DumpProject2(IMgaProject *p, BSTR xmlfile, ULONGLONG hwndParent_)
 {
 	CHECK_IN(p);
+
+	// TODO: m_dtdVersion = version2;
 	m_dumpGuids = true; // dump GUIDs with the whole project
 	m_closureDump = false;
 	m_v2          = false;
@@ -160,7 +162,11 @@
 		}
 		InitDump(p, xmlfile, _bstr_t(L"UTF-8"));
 
-		ofs << L"<!DOCTYPE project SYSTEM \"mga.dtd\">\n\n";
+		ofs << L"<!DOCTYPE project SYSTEM \"mga";
+		if (m_dtdVersion == version2) {
+			ofs << L"2";
+		}
+		ofs << L".dtd\">\n\n";
 
 		Dump(p);
 
@@ -323,6 +329,16 @@
 	ofs << L'<' << name;
 }
 
+inline void CMgaDumper::AttrId(const TCHAR *name, IMgaObject *o)
+{
+	if (m_dtdVersion == version1) {
+		Attr(name, o, &IMgaFCO::get_ID);
+	}
+	else {
+		Attr(name, o, &IMgaFCO::GetGuidDisp);
+	}
+}
+
 inline void CMgaDumper::Attr(const TCHAR *name, const TCHAR *value)
 {
 	ASSERT( name != NULL );
@@ -554,7 +570,9 @@
 
 	StartElem(_T("folder"));
 
-	Attr(_T("id"), folder, &IMgaFolder::get_ID);
+	if (m_dtdVersion == version1) {
+		Attr(_T("id"), folder, &IMgaFolder::get_ID);
+	}
 
 	if( m_closureDump && m_v2)
 	{
@@ -598,16 +616,10 @@
 
 	if( m_dumpGuids) // this is true if Project is dumped and mgaversion of project is 2
 	{
-		try 
-		{
-			CComBstrObj bs;
-			HRESULT hr = folder->GetGuidDisp( PutOut( bs));
-			if( SUCCEEDED( hr) && bs && bs.Length() == 38) // {%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X} <-- dumping that form (38 chars long including braces)
-				Attr( _T("guid"), bs);//Attr( _T("guid"), IMgaObject::GetGuidDisp);
-
-		} catch( hresult_exception& )
-		{
-		}
+		CComBstrObj bs;
+		HRESULT hr = folder->GetGuidDisp( PutOut( bs));
+		ASSERT(SUCCEEDED(hr) && bs && bs.Length() == 38); // {%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X} <-- dumping that form (38 chars long including braces)
+		Attr(_T("guid"), bs);//Attr( _T("guid"), IMgaObject::GetGuidDisp);
 	}
 
 	StartElem(_T("name"));
@@ -768,7 +780,9 @@
 
 	if( dump_attrs )
 	{
-		Attr(_T("id"), fco, &IMgaFCO::get_ID);
+		if (m_dtdVersion == version1) {
+			Attr(_T("id"), fco, &IMgaFCO::get_ID);
+		}
 
 		CComObjPtr<IMgaMetaFCO> metafco;
 		COMTHROW( fco->get_Meta(PutOut(metafco)) );
@@ -781,16 +795,10 @@
 
 		if( m_dumpGuids) // this is true if Project is dumped and mgaversion of project is 2
 		{
-			try 
-			{
-				CComBstrObj bs;
-				HRESULT hr = fco->GetGuidDisp( PutOut( bs));
-				if( SUCCEEDED( hr) && bs && bs.Length() == 38) // {%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X} <-- dumping that form (38 chars long including braces)
-					Attr( _T("guid"), bs);//Attr( _T("guid"), IMgaFCO::GetGuidDisp);
-
-			} catch( hresult_exception& )
-			{
-			}
+			CComBstrObj bs;
+			HRESULT hr = fco->GetGuidDisp( PutOut( bs));
+			ASSERT(SUCCEEDED(hr) && bs && bs.Length() == 38); // {%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X} <-- dumping that form (38 chars long including braces)
+			Attr(_T("guid"), bs);//Attr( _T("guid"), IMgaFCO::GetGuidDisp);
 		}
 
 		if( m_closureDump && m_v2)
@@ -812,7 +820,7 @@
 		if(derivedfrom != NULL )
 		{
 			if (CheckInClosure(derivedfrom)) {
-				Attr(_T("derivedfrom"), derivedfrom, &IMgaFCO::get_ID);
+				AttrId(_T("derivedfrom"), derivedfrom);
 
 				VARIANT_BOOL b;
 
@@ -1049,7 +1057,13 @@
 			if( (fco != NULL) && (CheckInClosure(fco)) )
 			{
 				CComBstrObj bstr;
-				COMTHROW( fco->get_ID(PutOut(bstr)) );
+				if (m_dtdVersion == version1) {
+					COMTHROW(fco->get_ID(PutOut(bstr)));
+				}
+				else {
+					COMTHROW(fco->GetGuidDisp(&bstr.p));
+				}
+				
 				CopyTo(bstr, data);
 			}
 			break;
@@ -1092,7 +1106,7 @@
 	if( fco != NULL)
 	{
 		if( CheckInClosure( fco)) // regular dump or the fco is really in the closure
-			Attr(_T("referred"), fco, &IMgaFCO::get_ID);
+			AttrId(_T("referred"), fco);
 		
 		if( m_closureDump)
 		{
@@ -1263,7 +1277,7 @@
 		}
 	}
 
-	Attr(_T("target"), target, &IMgaFCO::get_ID);
+	AttrId(_T("target"), target);
 
 	if( m_closureDump)
 	{
@@ -1329,7 +1343,13 @@
 				continue;
 			}
 			CComBstrObj bstr;
-			COMTHROW( (*i)->get_ID(PutOut(bstr)) );
+			if (m_dtdVersion == version1) {
+				COMTHROW((*i)->get_ID(PutOut(bstr)));
+			}
+			else {
+				COMTHROW((*i)->GetGuidDisp(&bstr.p));
+			}
+
 
 			std::tstring id;
 			CopyTo(bstr, id);
@@ -1543,7 +1563,7 @@
 	
 	//small speed up, build a vector of strings first, then sort the strings
 	//while doing the sort operations on the original vector, so we don't have
-	//to call the get_ID function each time we look at a Folder
+	//to call the GetGuidDisp function each time we look at a Folder
 	std::vector<std::tstring> vPrime;
 	for (int i=0; i<n; i++)
 	{
@@ -1583,7 +1603,7 @@
 	
 	//small speed up, build a vector of strings first, then sort the strings
 	//while doing the sort operations on the original vector, so we don't have
-	//to call the get_ID function each time we look at an FCO
+	//to call the GetGuidDisp function each time we look at an FCO
 	std::vector<std::tstring> vPrime;
 	for (int i=0; i<n; i++)
 	{

Modified: trunk/GME/Parser/MgaDumper.h
==============================================================================
--- trunk/GME/Parser/MgaDumper.h	Mon Jul  8 13:30:40 2019	(r2772)
+++ trunk/GME/Parser/MgaDumper.h	Mon Jul  8 13:30:43 2019	(r2773)
@@ -48,6 +48,7 @@
 		, m_dumpRelids( true)
 		, m_dumpLibraryStubs(false) 
 		, m_dumpGuids( false)
+		, m_dtdVersion(version1)
 	{ }
 
 DECLARE_REGISTRY_RESOURCEID(IDR_MGADUMPER)
@@ -78,6 +79,7 @@
 	void StartElem(const TCHAR *name);
 	void Attr(const TCHAR *name, const TCHAR *value);
 	void Attr(const TCHAR *name, const TCHAR *value, int len);
+	void AttrId(const TCHAR *name, IMgaObject *o);
 	static bool HasMarkup(const TCHAR *value, int len);
 	void Data(const TCHAR *value, int len);
 	void EndElem();
@@ -231,6 +233,10 @@
 	long fco_count;
 	int dumpversion;// >=1 means new xme format, ==2 means do not dump relids
 	bool m_dumpGuids;
+	enum dtdVersion {
+		version1,
+		version2
+	} m_dtdVersion;
 
 	bool m_closureDump;
 	bool m_dumpRelids;


More information about the gme-commit mailing list