diff --git a/TitanScriptGui/TitanScriptGui.cpp b/TitanScriptGui/TitanScriptGui.cpp index d76e4cd..03a5e0a 100644 --- a/TitanScriptGui/TitanScriptGui.cpp +++ b/TitanScriptGui/TitanScriptGui.cpp @@ -3,18 +3,26 @@ #include "..\SDK\CPP\TitanEngine.h" #include "TitanScript.h" -HINSTANCE hInst; -HWND hLogBox; -TCHAR FileNameTarget[MAX_PATH] = {}; -TCHAR FileNameScript[MAX_PATH] = {}; +//variables +static HINSTANCE hInst; +static HWND hLogBox; +static TCHAR FileNameTarget[MAX_PATH] = {}; +static TCHAR FileNameScript[MAX_PATH] = {}; +static TCHAR FileNameIni[MAX_PATH] = {}; -INT_PTR CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); -bool GetFileDialog(TCHAR[MAX_PATH]); -void AddLogMessage(const char* szLogMessage, eLogType Type); +//functions +static INT_PTR CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); +static bool GetFileDialog(TCHAR[MAX_PATH]); +static void AddLogMessage(const char* szLogMessage, eLogType Type); +static void SettingSet(const TCHAR* name, const TCHAR* value); +static void SettingGet(const TCHAR* name, TCHAR* value, int value_size); +static bool FileExists(LPCTSTR szPath); +static void CreateDummyUnicodeFile(const TCHAR* szFileName); -tScripterLoadFileA load_file = NULL; -tScripterExecuteWithTitanMistA exec = NULL; -tScripterSetLogCallback set_log_callback = NULL; +//TitanScript functions +static tScripterLoadFileA load_file = NULL; +static tScripterExecuteWithTitanMistA exec = NULL; +static tScripterSetLogCallback set_log_callback = NULL; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { @@ -29,17 +37,39 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) { case WM_INITDIALOG: { + //set icon HICON hIconLarge = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 32, 32, LR_DEFAULTSIZE); SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIconLarge); HICON hIconSmall = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTSIZE); SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSmall); + //initialize variables hLogBox = GetDlgItem(hWnd, IDC_LOG); + int i = GetModuleFileName(hInst, FileNameIni, _countof(FileNameIni)); + while(FileNameIni[i] != TCHAR('\\') && i) + i--; + if(i) + { + int len = lstrlen(FileNameIni); + while(FileNameIni[i] != TCHAR('.') && i < len) + i++; + if(i+1 < len) + FileNameIni[i] = TCHAR('\0'); + } + lstrcat(FileNameIni, _T(".ini")); + CreateDummyUnicodeFile(FileNameIni); + + //restore last files + SettingGet(_T("Target"), FileNameTarget, _countof(FileNameTarget)); + if(lstrlen(FileNameTarget)) + SetDlgItemText(hWnd, IDC_TARGETPATH, FileNameTarget); + SettingGet(_T("Script"), FileNameScript, _countof(FileNameScript)); + if(lstrlen(FileNameScript)) + SetDlgItemText(hWnd, IDC_SCRIPTPATH, FileNameScript); //make sure TitanScript is available if ( !ExtensionManagerIsPluginLoaded( "TitanScript" ) || !ExtensionManagerIsPluginEnabled( "TitanScript" ) ) @@ -50,7 +80,6 @@ INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) #else AddLogMessage("Ensure plugins\\x86\\TitanScript.dll exists !", TS_LOG_ERROR); #endif //_WIN64 - EnableWindow(GetDlgItem(hWnd, IDC_RUN ), FALSE); } else @@ -58,13 +87,14 @@ INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) load_file = GetTSFunctionPointer( LoadFileA ); exec = GetTSFunctionPointer( ExecuteWithTitanMistA ); set_log_callback = GetTSFunctionPointer( SetLogCallback ); - set_log_callback(&AddLogMessage); } break; } + case WM_COMMAND: + { switch (LOWORD(wParam)) { case IDC_BROWSETARGET: @@ -72,6 +102,7 @@ INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if(GetFileDialog(FileNameTarget)) { SetDlgItemText(hWnd, IDC_TARGETPATH, FileNameTarget); + SettingSet(_T("Target"), FileNameTarget); } break; } @@ -80,6 +111,7 @@ INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if(GetFileDialog(FileNameScript)) { SetDlgItemText(hWnd, IDC_SCRIPTPATH, FileNameScript); + SettingSet(_T("Script"), FileNameScript); } break; } @@ -95,7 +127,7 @@ INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } wcstombs(buf, FileNameTarget, sizeof(buf)); - if(!exec(buf, "dump.exe")) + if(!exec(buf, "")) //TitanScript will generate the output filename { AddLogMessage("Failed to execute", TS_LOG_ERROR); break; @@ -105,17 +137,24 @@ INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } } - break; + } + break; + case WM_CLOSE: + { EndDialog(hWnd, NULL); - break; + } + break; + default: + { return false; } + } return 0; } -bool GetFileDialog(TCHAR Buffer[MAX_PATH]) +static bool GetFileDialog(TCHAR Buffer[MAX_PATH]) { OPENFILENAME sOpenFileName = {0}; const TCHAR szFilterString[] = _T("All Files \0*.*\0\0"); @@ -133,10 +172,40 @@ bool GetFileDialog(TCHAR Buffer[MAX_PATH]) return (TRUE == GetOpenFileName(&sOpenFileName)); } -void AddLogMessage(const char* szLogMessage, eLogType Type) +static void AddLogMessage(const char* szLogMessage, eLogType Type) { TCHAR buf[100] = {0}; mbstowcs(buf, szLogMessage, sizeof(buf)); LRESULT cSelect = SendMessage(hLogBox, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)buf); SendMessage(hLogBox, LB_SETCURSEL, cSelect, NULL); } + +static void SettingSet(const TCHAR* name, const TCHAR* value) +{ + WritePrivateProfileString(_T("Settings"), name, value, FileNameIni); +} + +static void SettingGet(const TCHAR* name, TCHAR* value, int value_size) +{ + GetPrivateProfileString(_T("Settings"), name, _T(""), value, value_size, FileNameIni); +} + +static bool FileExists(LPCTSTR szPath) +{ + DWORD dwAttrib = GetFileAttributes(szPath); + return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); +} + +static void CreateDummyUnicodeFile(const TCHAR* szFileName) +{ + //http://www.codeproject.com/Articles/9071/Using-Unicode-in-INI-files + if (!FileExists(szFileName)) + { + // UTF16-LE BOM(FFFE) + WORD wBOM = 0xFEFF; + DWORD NumberOfBytesWritten; + HANDLE hFile = CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + WriteFile(hFile, &wBOM, sizeof(WORD), &NumberOfBytesWritten, NULL); + CloseHandle(hFile); + } +} \ No newline at end of file