[commit] r1627 - in trunk: GME/Console GME/Gme Tests/GPyUnit

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Thu Oct 13 10:51:02 CDT 2011


Author: ksmyth
Date: Thu Oct 13 10:51:02 2011
New Revision: 1627

Log:
Fix console loading of scripts, broken since UNICODE. Load both ansi and UTF-16LE w/BOM

Modified:
   trunk/GME/Console/Console.odl
   trunk/GME/Console/ConsoleCtl.cpp
   trunk/GME/Console/ConsoleCtl.h
   trunk/GME/Console/ScriptEdit.cpp
   trunk/GME/Gme/GMEConsole.h
   trunk/GME/Gme/GMEOLEPanel.cpp
   trunk/Tests/GPyUnit/test_gmeoleapp.py

Modified: trunk/GME/Console/Console.odl
==============================================================================
--- trunk/GME/Console/Console.odl	Thu Oct 13 10:50:45 2011	(r1626)
+++ trunk/GME/Console/Console.odl	Thu Oct 13 10:51:02 2011	(r1627)
@@ -45,6 +45,9 @@
 			[id(5)] void SetGMEApp(IDispatch *disp);
 			[id(6)] void SetGMEProj(IDispatch *disp);
 			[id(7)] void NavigateTo(BSTR url);
+			[id(8)] void LoadScript(BSTR filename);
+			[id(9)] void RunLoadedScript();
+			[id(10)] void SetContents(BSTR Contents);
 			[id(DISPID_ABOUTBOX)] void AboutBox();
 	};
 

Modified: trunk/GME/Console/ConsoleCtl.cpp
==============================================================================
--- trunk/GME/Console/ConsoleCtl.cpp	Thu Oct 13 10:50:45 2011	(r1626)
+++ trunk/GME/Console/ConsoleCtl.cpp	Thu Oct 13 10:51:02 2011	(r1627)
@@ -59,6 +59,9 @@
 	DISP_FUNCTION(CConsoleCtrl, "SetGMEApp", SetGMEApp, VT_EMPTY, VTS_DISPATCH)
 	DISP_FUNCTION(CConsoleCtrl, "SetGMEProj", SetGMEProj, VT_EMPTY, VTS_DISPATCH)
 	DISP_FUNCTION_ID(CConsoleCtrl, "NavigateTo", dispidNavigateTo, NavigateTo, VT_EMPTY, VTS_BSTR)
+    DISP_FUNCTION(CConsoleCtrl, "LoadScript", LoadScript, VT_EMPTY, VTS_BSTR)
+	DISP_FUNCTION(CConsoleCtrl, "RunLoadedScript", RunScript, VT_EMPTY, VTS_NONE)
+	DISP_FUNCTION(CConsoleCtrl, "SetContents", SetContents, VT_EMPTY, VTS_BSTR)
 	DISP_PROPERTY_EX_ID(CConsoleCtrl, "GetCWnd", 0x43576E64, GetCWnd, SetCWnd, VT_I8)
 	DISP_FUNCTION_ID(CConsoleCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
 	//}}AFX_DISPATCH_MAP
@@ -654,27 +657,43 @@
 		Message( _T("Script not found!"), MSG_INFO);
 }
 
-void CConsoleCtrl::LoadScript( const CString& p_fileName)
+void CConsoleCtrl::LoadScript(BSTR p_fileName)
 {
 	m_edit.SetLoadedScript(_T("")); // erase old loaded script contents
 
 	CStdioFile _file;
 
 	// open file
-	if( _file.Open( p_fileName, CFile::modeRead | CFile::typeText) == 0) {
+	if( _file.Open( p_fileName, CFile::modeRead | CFile::typeBinary) == 0) {
 		Message( _T("Unable to open file."), MSG_ERROR);
 		return;
 	}
 
-	CString script_buf;
-	unsigned int sizeof_file = (unsigned int) _file.GetLength();
-	sizeof_file = _file.Read( script_buf.GetBufferSetLength( sizeof_file), sizeof_file);
-	// sizeof_file was modified above because of newline handling
-	if( sizeof_file > 0) script_buf.ReleaseBufferSetLength( sizeof_file); 
-	else script_buf.ReleaseBuffer(0);
-	_file.Close();
+	unsigned char utf16_bom[] = { 0xFF, 0xFE };
+	unsigned char bytes[2];
+	_file.Read(bytes, 2);
+	if (memcmp(utf16_bom, bytes, 2) == 0)
+	{
+		CString script_buf;
+		unsigned int sizeof_file = _file.GetLength();
+		// skipping BOM
+		sizeof_file -= 2;
+		sizeof_file = _file.Read(script_buf.GetBuffer(sizeof_file / sizeof(wchar_t)), sizeof_file);
+		script_buf.ReleaseBuffer();
+		_file.Close();
+		m_edit.SetLoadedScript(script_buf);
+	}
+	else
+	{
+		_file.SeekToBegin();
+		CStringA script_buf;
+		unsigned int sizeof_file = _file.GetLength();
+		sizeof_file = _file.Read(script_buf.GetBuffer(sizeof_file), sizeof_file);
+		script_buf.ReleaseBuffer();
+		_file.Close();
+		m_edit.SetLoadedScript(CString(script_buf));
+	}
 
-	m_edit.SetLoadedScript( script_buf);
 	m_edit.SetScriptFileName( p_fileName);
 
 	Message( CString( _T("Loaded script: ")) + p_fileName, MSG_INFO);
@@ -702,7 +721,7 @@
 			return;
 		}
 
-		LoadScript( fpath);
+		LoadScript(_bstr_t(fpath));
 
 		if( m_recent1.IsEmpty())
 			m_recent1 = fpath;
@@ -742,12 +761,12 @@
 
 void CConsoleCtrl::relScript() // reload
 {
-	LoadScript( m_edit.GetLoadedScriptFileName());
+	LoadScript(_bstr_t(m_edit.GetLoadedScriptFileName()));
 }
 
 void CConsoleCtrl::rlrScript() // reload & run
 {
-	LoadScript( m_edit.GetLoadedScriptFileName());
+	LoadScript(_bstr_t(m_edit.GetLoadedScriptFileName()));
 	RunScript();
 }
 
@@ -766,11 +785,11 @@
 void CConsoleCtrl::loadRecent( UINT which)
 {
 	switch( which) {
-	case IDC_RECENT_SCRIPT1: LoadScript( m_recent1);break;
-	case IDC_RECENT_SCRIPT2: LoadScript( m_recent2);break;
-	case IDC_RECENT_SCRIPT3: LoadScript( m_recent3);break;
-	case IDC_RECENT_SCRIPT4: LoadScript( m_recent4);break;
-	case IDC_RECENT_SCRIPT5: LoadScript( m_recent5);break;
+	case IDC_RECENT_SCRIPT1: LoadScript(_bstr_t(m_recent1));break;
+	case IDC_RECENT_SCRIPT2: LoadScript(_bstr_t(m_recent2));break;
+	case IDC_RECENT_SCRIPT3: LoadScript(_bstr_t(m_recent3));break;
+	case IDC_RECENT_SCRIPT4: LoadScript(_bstr_t(m_recent4));break;
+	case IDC_RECENT_SCRIPT5: LoadScript(_bstr_t(m_recent5));break;
 	}
 }
 

Modified: trunk/GME/Console/ConsoleCtl.h
==============================================================================
--- trunk/GME/Console/ConsoleCtl.h	Thu Oct 13 10:50:45 2011	(r1626)
+++ trunk/GME/Console/ConsoleCtl.h	Thu Oct 13 10:51:02 2011	(r1627)
@@ -28,7 +28,7 @@
 // Implementation
 // protected:
 	~CConsoleCtrl();
-	void LoadScript( const CString& fileName);
+	void LoadScript(BSTR fileName);
 	void RunScript();
 
 	CHtmlCtrl   m_browser;

Modified: trunk/GME/Console/ScriptEdit.cpp
==============================================================================
--- trunk/GME/Console/ScriptEdit.cpp	Thu Oct 13 10:50:45 2011	(r1626)
+++ trunk/GME/Console/ScriptEdit.cpp	Thu Oct 13 10:51:02 2011	(r1627)
@@ -140,9 +140,9 @@
 		bool             handled = false;
 
 		if(      inp == run_c) handled = true, m_console->RunScript();
-		else if( inp == lod_c) handled = true, m_console->LoadScript( inp.Mid( _tcslen( lod_c)));
-		else if( inp == rel_c) handled = true, m_console->LoadScript( m_loadedFileName);
-		else if( inp == rlr_c) handled = true, m_console->LoadScript( m_loadedFileName), m_console->RunScript();
+		else if( inp == lod_c) handled = true, m_console->LoadScript( _bstr_t(inp.Mid( _tcslen( lod_c))));
+		else if( inp == rel_c) handled = true, m_console->LoadScript( _bstr_t(m_loadedFileName));
+		else if( inp == rlr_c) handled = true, m_console->LoadScript( _bstr_t(m_loadedFileName)), m_console->RunScript();
 		else if( inp == cls_c) handled = true, m_console->Clear();
 		
 		if( handled) {

Modified: trunk/GME/Gme/GMEConsole.h
==============================================================================
--- trunk/GME/Gme/GMEConsole.h	Thu Oct 13 10:50:45 2011	(r1626)
+++ trunk/GME/Gme/GMEConsole.h	Thu Oct 13 10:51:02 2011	(r1627)
@@ -23,7 +23,6 @@
 	void SetGMEApp(IDispatch *idp);
 	void SetGMEProj(IDispatch *idp);
 	void NavigateTo(CString url);
-	IDispatch * GetInterface() {return NULL;};
 
 // Dialog Data
 	//{{AFX_DATA(CGMEConsole)
@@ -32,6 +31,17 @@
 	//}}AFX_DATA
 
 	static CGMEConsole *theInstance;
+	
+	IDispatch * GetInterface()
+	{
+		LPUNKNOWN pUnk = m_Console.GetControlUnknown();
+
+		// From there get the IDispatch interface of control.
+		LPDISPATCH pDisp = NULL;
+		pUnk->QueryInterface(IID_IDispatch, (LPVOID*)&pDisp);
+		return pDisp;
+	};
+
 // Overrides
 	// ClassWizard generated virtual function overrides
 	//{{AFX_VIRTUAL(CGMEConsole)

Modified: trunk/GME/Gme/GMEOLEPanel.cpp
==============================================================================
--- trunk/GME/Gme/GMEOLEPanel.cpp	Thu Oct 13 10:50:45 2011	(r1626)
+++ trunk/GME/Gme/GMEOLEPanel.cpp	Thu Oct 13 10:51:02 2011	(r1627)
@@ -112,6 +112,8 @@
 	CGMEEventLogger::LogGMEEvent("CGMEOLEPanel::GetInterface()\r\n");
 	
 	PRECONDITION_VALID_PANEL
+	if (m_interf == NULL)
+		AfxThrowOleDispatchException(ID_ERROR_PTR_INVALID, _T("GUI panel is invalid."));
 /*
 	IDispatch* interf = NULL;
 	CSizingControlBar * scb = dynamic_cast<CSizingControlBar *>( m_control);

Modified: trunk/Tests/GPyUnit/test_gmeoleapp.py
==============================================================================
--- trunk/Tests/GPyUnit/test_gmeoleapp.py	Thu Oct 13 10:50:45 2011	(r1626)
+++ trunk/Tests/GPyUnit/test_gmeoleapp.py	Thu Oct 13 10:51:02 2011	(r1627)
@@ -8,6 +8,45 @@
         gme.Exit()
         # under _DEBUG, GME.exe does not exit until Release()ed
         del(gme)
+        
+    def test_Console(self):
+        import win32com.client
+
+        registrar = win32com.client.DispatchEx("Mga.MgaRegistrar")
+        registrar.SetScriptEngineDisp(1, "Python.AXScript.2")
+        
+        def _adjacent_file(file):
+            import os.path
+            return os.path.join(os.path.dirname(__file__), file)
+        self.gme = win32com.client.DispatchEx("GME.Application")
+        self.gme.Version
+        console = filter(lambda p: p.Name == "Console", self.gme.Panels)[0]
+        intf = console.Interface
+        # 'intf.Contents =' fails because python calls Invoke(wFlags=3) instead of DISPATCH_PROPERTYPUT=4
+        intf.SetContents('magicstring')
+        self.assertEqual(intf.Contents, 'magicstring')
+        
+        pythoncode = 'gme.ConsoleMessage("magic2string", 0)\n'
+        with open(_adjacent_file('_console_utf16.py'), 'wb') as file:
+           file.write('\xFF\xFE')
+           file.write(unicode(pythoncode).encode('utf-16le'))
+        intf.LoadScript(_adjacent_file('_console_utf16.py'))
+        intf.RunLoadedScript()
+        self.assertTrue(intf.Contents.find('magic2string') != -1, 'Console contents: "' + intf.Contents + '"')
+        
+        with open(_adjacent_file('_console_ansi.py'), 'wb') as file:
+            file.write(pythoncode.replace('magic2string', 'magic3string'))
+        intf.LoadScript(_adjacent_file('_console_ansi.py'))
+        intf.RunLoadedScript()
+        self.assertTrue(intf.Contents.find('magic3string') != -1, 'Console contents: "' + intf.Contents + '"')
+        
+    def setUp(self):
+        self.gme = None
+
+    def tearDown(self):
+        if self.gme:
+            self.gme.Exit()
+            del(self.gme)
 
 if __name__ == "__main__":
         unittest.main()


More information about the gme-commit mailing list