[commit] r1722 - in trunk: GME/Core GME/XmlBackEnd Tests/GPyUnit

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Fri Dec 2 12:13:07 CST 2011


Author: ksmyth
Date: Fri Dec  2 12:13:07 2011
New Revision: 1722

Log:
Support Dict Core attributes in MU Backend (used for regnodes now). Dont chdir; it locks the directory. Fix crash under MU without SVN

Modified:
   trunk/GME/Core/CoreDictionaryAttributeValue.h
   trunk/GME/XmlBackEnd/CoreXmlFile.cpp
   trunk/GME/XmlBackEnd/CoreXmlFile.h
   trunk/GME/XmlBackEnd/StdAfx.h
   trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj
   trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj.filters
   trunk/Tests/GPyUnit/test_registry.py

Modified: trunk/GME/Core/CoreDictionaryAttributeValue.h
==============================================================================
--- trunk/GME/Core/CoreDictionaryAttributeValue.h	Fri Dec  2 12:12:47 2011	(r1721)
+++ trunk/GME/Core/CoreDictionaryAttributeValue.h	Fri Dec  2 12:13:07 2011	(r1722)
@@ -1,7 +1,5 @@
 #pragma once
 
-#include "StdAfx.h"
-
 #include <unordered_map>
 
 struct CComBSTR_Length {

Modified: trunk/GME/XmlBackEnd/CoreXmlFile.cpp
==============================================================================
--- trunk/GME/XmlBackEnd/CoreXmlFile.cpp	Fri Dec  2 12:12:47 2011	(r1721)
+++ trunk/GME/XmlBackEnd/CoreXmlFile.cpp	Fri Dec  2 12:13:07 2011	(r1722)
@@ -271,6 +271,10 @@
         xmlattr = new XmlAttrReal();
         break;
 
+	case VALTYPE_DICT:
+		xmlattr = new XmlAttrDict();
+		break;
+
     default:
         HR_THROW(E_METAPROJECT);
     }
@@ -289,6 +293,39 @@
 { 
 }
 
+XmlAttrDict::XmlAttrDict()
+{
+	CCoreDictionaryAttributeValue *val = NULL;
+	typedef CComObject< CCoreDictionaryAttributeValue > COMTYPE;
+	HRESULT hr = COMTYPE::CreateInstance((COMTYPE **)&val);
+	COMTHROW(hr);
+	m_value = val;
+}
+
+void XmlAttrDict::fromVariant(VARIANT v)
+{
+	ASSERT(v.vt = VT_DISPATCH);
+	m_value = 0;
+	v.pdispVal->QueryInterface(&m_value);
+}
+
+void XmlAttrDict::toVariant(VARIANT* v) const
+{
+	CComVariant ret = m_value;
+	COMTHROW(ret.Detach(v));
+}
+
+void XmlAttrDict::fromString(const char* str)
+{
+	DebugBreak();
+}
+
+void XmlAttrDict::toString(std::string& str) const
+{
+	DebugBreak();
+}
+
+
 ////////////////////////////////////////////////////////////////////////////////
 // XmlAttrLong class
 ////////////////////////////////////////////////////////////////////////////////
@@ -1333,7 +1370,7 @@
 
 			//TODO: if locks go down to 0 it could be written out to the file
 		}
-		else // VALTYPE_BIN, VALTYPE_STR, VALTYPE_LONG, VALTYPE_REAL
+		else // VALTYPE_BIN, VALTYPE_STR, VALTYPE_LONG, VALTYPE_REAL, VALTYPE_DICT
 		{
 #ifdef _DEBUG
 #if(DETAILS_ABOUT_XMLBACKEND)
@@ -1578,7 +1615,8 @@
 				HR_THROW(E_FILEOPEN);
 			}
 			// add to server
-			succ = addSVN( sessionFolder, true /*=recursive*/); 
+			if (m_sourceControl == SC_SUBVERSION)
+				succ = addSVN( sessionFolder, true /*=recursive*/); 
 			if( !succ) {
 				sendMsg( "Exception: Could not add session folder to server.", MSG_ERROR);
 				AfxMessageBox( "Could not add session folder to server.");
@@ -1586,7 +1624,8 @@
 			}
 
 			// initial commit
-			succ = commitSVN( m_contentPath, std::string("auto: OpenProject()"), true);
+			if (m_sourceControl == SC_SUBVERSION)
+				succ = commitSVN( m_contentPath, std::string("auto: OpenProject()"), true);
 			if( !succ) {
 				sendMsg( "Exception: Could not commit session folder.", MSG_ERROR);
 				AfxMessageBox( "Could not commit session folder.");
@@ -3297,15 +3336,11 @@
 
 		// upon Open, the connection string might not have the full URL in it, so 
 		// that information is only available after readProjectFile (m_svnUrl)
-
-		_chdir( m_folderPath.c_str()); // change to the newly created local dir
 	}
 }
 
 void CCoreXmlFile::writeAll()
 {
-	chdir( m_folderPath.c_str()); // change to the local main dir (a file dialog may have changed the local dir)
-
 	for( XmlObjVecIter it=m_objects.begin(); it!=m_objects.end(); ++it )
 	{
 		XmlObject * obj = (*it);
@@ -3486,7 +3521,8 @@
 					guid2str( pointer->m_parent->m_guid, attrVal );
 			}
 		}
-		else if( attr->getType() != VALTYPE_COLLECTION && attr->getType() != VALTYPE_LOCK )
+		else if( attr->getType() != VALTYPE_COLLECTION && attr->getType() != VALTYPE_LOCK
+			&& attr->getType() != VALTYPE_DICT)
 		{
 			XmlAttrBase * attr = it->second;
 			attr->toString(attrVal);
@@ -3546,7 +3582,30 @@
 						writeObject( obj2, ofs, false, newPrefix.c_str(), lastWriteTime );
 				}
 			}
+		} 
+		else if (attr->getType() == VALTYPE_DICT)
+		{
+			CComObjPtr<ICoreMetaAttribute> metaAttrib;
+			CComBSTR attribToken;
+			std::string attrVal;
+
+			COMTHROW( metaobject->get_Attribute( it->first, PutOut(metaAttrib) ) );
+			metaAttrib->get_Token( &attribToken );
+			XmlAttrDict* dict = (XmlAttrDict*)it->second;
+			CCoreDictionaryAttributeValue* dictValue = (CCoreDictionaryAttributeValue*)(ICoreDictionaryAttributeValue*)dict->m_value;
+			ofs << Transcoder::NoEscape << "<Dict token=\"" << attribToken << "\">";
+			for (auto i = dictValue->m_dict.begin(); i != dictValue->m_dict.end(); i++)
+			{
+				ofs << Transcoder::NoEscape << "<Key>";
+				ofs << Transcoder::StdEscape << static_cast<const char*>(_bstr_t(i->first));
+				ofs << Transcoder::NoEscape << "</Key>";
+				ofs << Transcoder::NoEscape << "<Value>";
+				ofs << Transcoder::StdEscape << static_cast<const char*>(_bstr_t(i->second));
+				ofs << Transcoder::NoEscape << "</Value>";
+			}
+			ofs << Transcoder::NoEscape << "</Dict>";
 		}
+
 	}
 
 	ofs << Transcoder::NoEscape << prefix << "</" << metaToken << ">\n";
@@ -3781,7 +3840,8 @@
 				p.m_pointedObjGuid = str2guid( attrVal );
 			pointers.push_back( p );
 		}
-		else if( attr->getType() != VALTYPE_LOCK && attr->getType() != VALTYPE_COLLECTION )
+		else if( attr->getType() != VALTYPE_LOCK && attr->getType() != VALTYPE_COLLECTION
+			&& attr->getType() != VALTYPE_DICT)
 		{
 			it2->second->fromString(attrVal);
 
@@ -3820,7 +3880,41 @@
 		DOMNode * node = children->item(i);
 		//if spec_care was true the first child was CDATA, but we process anyway the ELEMENTs only
 		if( node->getNodeType() == DOMNode::ELEMENT_NODE )
-			readObject( (DOMElement*)node, pointers, obj, fullLoad, lastWriteTime );
+		{
+			if (wcscmp(node->getLocalName(), L"Dict") == 0)
+			{
+				// TODO: read token attribute (but only regnodes are stored in Dict for now)
+				auto it = obj->m_attributes.find(ATTRID_REGNODE);
+				if (it == obj->m_attributes.end())
+					COMTHROW(E_FILEOPEN);
+				XmlAttrDict* dict = (XmlAttrDict*)it->second;
+				CCoreDictionaryAttributeValue* dictValue = (CCoreDictionaryAttributeValue*)(ICoreDictionaryAttributeValue*)dict->m_value;
+				DOMNodeList* dictEntries = node->getChildNodes();
+				for (XMLSize_t i = 0; i+1 < dictEntries->getLength(); i += 2)
+				{
+					if (dictEntries->item(i)->getNodeType() != DOMNode::ELEMENT_NODE)
+						COMTHROW(E_FILEOPEN);
+					if (dictEntries->item(i+1)->getNodeType() != DOMNode::ELEMENT_NODE)
+						COMTHROW(E_FILEOPEN);
+					if (((DOMElement*)dictEntries->item(i))->getChildNodes()->getLength() != 1)
+						COMTHROW(E_FILEOPEN);
+					CComBSTR value;
+					if (((DOMElement*)dictEntries->item(i+1))->getChildNodes()->getLength() == 1)
+					{
+						if (((DOMElement*)dictEntries->item(i+1))->getChildNodes()->item(0)->getNodeType() != DOMNode::TEXT_NODE)
+							COMTHROW(E_FILEOPEN);
+						DOMText* valueText = (DOMText*)((DOMElement*)dictEntries->item(i+1))->getChildNodes()->item(0);
+						value = valueText->getData();
+					}
+					if (((DOMElement*)dictEntries->item(i))->getChildNodes()->item(0)->getNodeType() != DOMNode::TEXT_NODE)
+						COMTHROW(E_FILEOPEN);
+					DOMText* key = (DOMText*)((DOMElement*)dictEntries->item(i))->getChildNodes()->item(0);
+					dictValue->m_dict.insert(CCoreDictionaryAttributeValue::map_type::value_type(key->getData(), std::move(value)));
+				}
+			}
+			else
+				readObject( (DOMElement*)node, pointers, obj, fullLoad, lastWriteTime );
+		}
 	}
 }
 
@@ -4161,7 +4255,6 @@
 	if( !m_parent->makeSureFileExistsInVerSys( m_fileName, p_initialContent))
 	{
 		m_parent->sendMsg( "Could not find files in Versioning System", MSG_ERROR);
-		ASSERT(0);
 		return;
 	}
 
@@ -5139,7 +5232,6 @@
 	{
 		char buff[200]; sprintf( buff, "Could not get \"%s\" file from source control. Exception code: 0x%x", fulllocalfname.c_str(), e.hr);
 		sendMsg( buff, MSG_ERROR);
-		AfxMessageBox( buff);
 		return false;
 	}
 	return found;
@@ -5380,8 +5472,6 @@
 	}
 
 
-	chdir( m_folderPath.c_str()); // change to the newly created local dir
-
 	// session folder
 	std::string sessionFolder =  m_folderPath + "\\" + HelperFiles::sessionFolderName;
 	BOOL  succ = ::CreateDirectory( sessionFolder.c_str(), NULL);
@@ -5582,8 +5672,6 @@
 
 void CCoreXmlFile::findAllRwObjs( const std::string& p_folderPath, std::vector< std::string>& rw_file_vec)
 {
-	chdir( m_folderPath.c_str()); // change to the local main dir (a file dialog may have changed the local dir)
-
 	for( XmlObjVecIter it=m_objects.begin(); it!=m_objects.end(); ++it )
 	{
 		XmlObject * obj = (*it);

Modified: trunk/GME/XmlBackEnd/CoreXmlFile.h
==============================================================================
--- trunk/GME/XmlBackEnd/CoreXmlFile.h	Fri Dec  2 12:12:47 2011	(r1721)
+++ trunk/GME/XmlBackEnd/CoreXmlFile.h	Fri Dec  2 12:13:07 2011	(r1722)
@@ -1,5 +1,7 @@
 #ifndef MGA_COREXMLFILE_H
 #define MGA_COREXMLFILE_H
+
+#include "StdAfx.h"
 #include "resource.h"
 #include <fstream>//fstream.h
 #include <list>
@@ -8,6 +10,7 @@
 #include <set>
 #include <xercesc/dom/dom.hpp>
 #include "..\Mga\MgaGeneric.h"
+#include "CoreDictionaryAttributeValue.h"
 #include "XmlBackEnd.h" // for EXTERN_C const CLSID CLSID_CoreXmlFile;
 #include "OperOptions.h"
 #include "MsgConsole.h"
@@ -178,6 +181,23 @@
 };
 
 ////////////////////////////////////////////////////////////////////////////////
+// XmlAttrDict class
+////////////////////////////////////////////////////////////////////////////////
+
+class XmlAttrDict: public XmlAttrBase
+{
+public:
+	XmlAttrDict();
+
+	virtual valtype_type getType() const { return VALTYPE_DICT; };
+    virtual void fromVariant(VARIANT p);
+	virtual void toVariant(VARIANT *p) const;
+    virtual void fromString(const char * str);
+    virtual void toString(std::string& str) const;
+    CComPtr<ICoreDictionaryAttributeValue> m_value;
+};
+
+////////////////////////////////////////////////////////////////////////////////
 // XmlAttrString class
 ////////////////////////////////////////////////////////////////////////////////
 

Modified: trunk/GME/XmlBackEnd/StdAfx.h
==============================================================================
--- trunk/GME/XmlBackEnd/StdAfx.h	Fri Dec  2 12:12:47 2011	(r1721)
+++ trunk/GME/XmlBackEnd/StdAfx.h	Fri Dec  2 12:13:07 2011	(r1722)
@@ -39,6 +39,9 @@
 #include "CommonStl.h"
 #include "CoreUtilities.h"
 
+#include "Core.h"
+#include "CoreLib.h"
+
 //{{AFX_INSERT_LOCATION}}
 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
 

Modified: trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj
==============================================================================
--- trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj	Fri Dec  2 12:12:47 2011	(r1721)
+++ trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj	Fri Dec  2 12:13:07 2011	(r1722)
@@ -73,7 +73,6 @@
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup>
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
@@ -97,6 +96,7 @@
     <CustomBuildAfterTargets Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
     <CustomBuildAfterTargets Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
     <CustomBuildAfterTargets Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <CustomBuildStep />
@@ -106,7 +106,7 @@
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.;../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -117,7 +117,7 @@
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ResourceCompile>
     <Link>
-      <AdditionalDependencies>xerces-c_3D.lib;comsvcs.lib;setargv.obj;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>mfcs100d.lib;xerces-c_3.lib;comsvcs.lib;setargv.obj;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\lib\subv_$(Configuration);../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ModuleDefinitionFile>.\XmlBackEnd.def</ModuleDefinitionFile>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -148,7 +148,7 @@
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.;../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -192,7 +192,7 @@
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
-      <AdditionalIncludeDirectories>../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.;../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -206,7 +206,7 @@
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ResourceCompile>
     <Link>
-      <AdditionalDependencies>xerces-c_3.lib;comsvcs.lib;setargv.obj;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>mfcs100.lib;xerces-c_3.lib;comsvcs.lib;setargv.obj;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\lib\subv_$(Configuration);../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <IgnoreSpecificDefaultLibraries>
       </IgnoreSpecificDefaultLibraries>
@@ -242,7 +242,7 @@
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
-      <AdditionalIncludeDirectories>../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>.;../Interfaces;../Common;../Core;../Include;../Include/subversion;../Include/apr;../Include/apr-util;svncode;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -305,6 +305,7 @@
     </Midl>
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="..\Core\CoreDictionaryAttributeValue.cpp" />
     <ClCompile Include="CertificateDlg.cpp" />
     <ClCompile Include="CommitDialog.cpp" />
     <ClCompile Include="..\Common\CommonError.cpp" />

Modified: trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj.filters
==============================================================================
--- trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj.filters	Fri Dec  2 12:12:47 2011	(r1721)
+++ trunk/GME/XmlBackEnd/XmlBackEnd.vcxproj.filters	Fri Dec  2 12:13:07 2011	(r1722)
@@ -110,6 +110,9 @@
     <ClCompile Include="SVNCode\Util.cpp">
       <Filter>Source Files\SVNCode</Filter>
     </ClCompile>
+    <ClCompile Include="..\Core\CoreDictionaryAttributeValue.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="XmlBackEnd.def">

Modified: trunk/Tests/GPyUnit/test_registry.py
==============================================================================
--- trunk/Tests/GPyUnit/test_registry.py	Fri Dec  2 12:12:47 2011	(r1721)
+++ trunk/Tests/GPyUnit/test_registry.py	Fri Dec  2 12:13:07 2011	(r1722)
@@ -8,16 +8,25 @@
     def __init__(self, name, **kwds):
         super(TestRegistry, self).__init__(name, **kwds)
         self.output_file = "TestRegistry-output.mga"
+        
+    def tearDown(self):
+        if not self.project is None:
+            self.project.Close(True)
+    
+    def _adjacent_file(file):
+        import os.path
+        return os.path.join(os.path.dirname(__file__), file)
+
+    @property
+    def connstr(self):
+        return "MGA=" + self._adjacent_file(self.output_file)
 
     def test(self):
-        def _adjacent_file(file):
-            import os.path
-            return os.path.join(os.path.dirname(__file__), file)
         from GPyUnit import util
         util.register_xmp('MetaGME')
         with util.disable_early_binding():
             self.project = win32com.client.DispatchEx("Mga.MgaProject")
-            self.project.Create("MGA=" + _adjacent_file(self.output_file), "MetaGME")
+            self.project.Create(self.connstr, "MetaGME")
             self.project.BeginTransactionInNewTerr()
             
             rootregs = self.project.RootFolder.GetRegistryDisp(True)
@@ -71,7 +80,7 @@
             self.project.CommitTransaction()
             
             terr = self.project.BeginTransactionInNewTerr()
-            self.project.RootFolder.GetRegistryNodeDisp('xtest123').Value = 'xxx'
+            self.project.RootFolder.GetRegistryNodeDisp('xtest123').Value = 'xxx&<'
             self.project.RootFolder.GetRegistryNodeDisp('ytest123').Value = 'yyy'
             self.project.RootFolder.GetRegistryNodeDisp('xtest123/ztest').Value = 'zzz'
             self.project.RootFolder.GetRegistryNodeDisp('xtest123/ztest/blank').Value = ''
@@ -80,10 +89,10 @@
             self.project.Save()
             self.project.Close(True)
             
-            self.project.Open("MGA=" + _adjacent_file(self.output_file))
+            self.project.Open(self.connstr)
             terr = self.project.BeginTransactionInNewTerr()
             def testxtest():
-                self.assertEqual(self.project.RootFolder.GetRegistryNodeDisp('xtest123').Value, 'xxx')
+                self.assertEqual(self.project.RootFolder.GetRegistryNodeDisp('xtest123').Value, 'xxx&<')
                 self.assertEqual(self.project.RootFolder.GetRegistryNodeDisp('ytest123').Value, 'yyy')
                 self.assertEqual(self.project.RootFolder.GetRegistryNodeDisp('xtest123/ztest').Value, 'zzz')
                 self.assertEqual(self.project.RootFolder.GetRegistryNodeDisp('xtest123/ztest/blank').Value, '')
@@ -96,15 +105,15 @@
             self.assertEqual(self.project.RootFolder.GetRegistryDisp(False).Count, 2)
             self.project.CommitTransaction()
             self.project.Close(True)
-            
-            import util.gme
-            util.gme.mga2xme(_adjacent_file(self.output_file))
-            util.gme.xme2mga(os.path.splitext(_adjacent_file(self.output_file))[0] + ".xme")
-            self.project.Open("MGA=" + _adjacent_file(self.output_file))
-            terr = self.project.BeginTransactionInNewTerr()
-            testxtest()
-            self.project.CommitTransaction()
-            self.project.Close(True)
+            if self.connstr.find("MGA=") == 0:
+                import util.gme
+                util.gme.mga2xme(_adjacent_file(self.output_file))
+                util.gme.xme2mga(os.path.splitext(_adjacent_file(self.output_file))[0] + ".xme")
+                self.project.Open(self.connstr)
+                terr = self.project.BeginTransactionInNewTerr()
+                testxtest()
+                self.project.CommitTransaction()
+                self.project.Close(True)
 
     def test_derived(self):
         def _adjacent_file(file):
@@ -114,7 +123,7 @@
         util.register_xmp('MetaGME')
         with util.disable_early_binding():
             self.project = win32com.client.DispatchEx("Mga.MgaProject")
-            self.project.Create("MGA=" + _adjacent_file(self.output_file), "MetaGME")
+            self.project.Create(self.connstr, "MetaGME")
             self.project.BeginTransactionInNewTerr()
             
             for i in range(1, self.project.RootMeta.RootFolder.DefinedFCOs.Count+1):
@@ -146,7 +155,7 @@
         util.register_xmp('MetaGME')
         with util.disable_early_binding():
             self.project = win32com.client.DispatchEx("Mga.MgaProject")
-            self.project.Create("MGA=" + _adjacent_file(self.output_file), "MetaGME")
+            self.project.Create(self.connstr, "MetaGME")
             self.project.BeginTransactionInNewTerr()
             
             for i in range(1, self.project.RootMeta.RootFolder.DefinedFCOs.Count+1):
@@ -172,5 +181,23 @@
             self.project.BeginTransactionInNewTerr()
             self.project.RootFolder.ChildFolders
 
+class TestMURegistry(TestRegistry):
+    def __init__(self, name, **kwds):
+        super(TestMURegistry, self).__init__(name, **kwds)
+        import os.path
+        self.mgxdir = os.path.abspath(os.path.join(os.path.dirname(__file__), "TestMURegistry"))
+
+    def setUp(self):
+        import os.path
+        if os.path.isdir(self.mgxdir):
+            import shutil
+            assert len(self.mgxdir) > 10 # sanity check
+            shutil.rmtree(self.mgxdir)
+    
+    @property
+    def connstr(self):
+        return "MGX=\"" + self.mgxdir + "\""
+
+
 if __name__ == "__main__":
     unittest.main()


More information about the gme-commit mailing list