[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