[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