#include "stdafx.h" #include "WizardMachine.h" #include "Interpret.h" #include "WizardUI.h" #include "ImgDlg.h" #include "SumDlg.h" #include "NewDialog.h" #include // for CopyDir #include "winbase.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CWizardMachineApp theApp; extern NODE *CurrentNode; extern HBITMAP hBitmap; extern CString Path; extern char iniFilePath[MAX_SIZE]; extern BOOL inNext; extern BOOL inPrev; extern NODE* WizardTree; extern WIDGET GlobalWidgetArray[1000]; extern int GlobalArrayIndex; extern char currDirPath[MAX_SIZE]; extern char customizationPath[MAX_SIZE]; extern BOOL IsSameCache; extern CString CacheFile; extern CString CachePath; extern char asePath[MAX_SIZE]; extern char nciPath[MAX_SIZE]; extern char tmpPath[MAX_SIZE]; extern _declspec (dllimport) WIDGET ptr_ga[1000]; CInterpret::CInterpret() { // Init linked list to avoid messy operations on the linked list m_DLLs.dllName = ""; m_DLLs.procName = ""; m_DLLs.next = NULL; } CInterpret::~CInterpret() { DLLINFO *dllp = m_DLLs.next; while (dllp) { FreeLibrary(dllp->hDLL); dllp = dllp->next; } } BOOL CInterpret::InitInstance() { return FALSE; } //---------------------------------------------------------- void CInterpret::CopyDir(CString from, CString to) { WIN32_FIND_DATA data; HANDLE d; CString dot = "."; CString dotdot = ".."; CString fchild, tchild; CString pattern = from + "\\*.*"; int found; DWORD tmp; d = FindFirstFile((const char *) to, &data); if (d == INVALID_HANDLE_VALUE) mkdir(to); d = FindFirstFile((const char *) pattern, &data); found = (d != INVALID_HANDLE_VALUE); while (found) { if (data.cFileName != dot && data.cFileName != dotdot) { fchild = from + "\\" + data.cFileName; tchild = to + "\\" + data.cFileName; tmp = data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; if (tmp == FILE_ATTRIBUTE_DIRECTORY) CopyDir(fchild, tchild); else CopyFile((const char *) fchild, (const char *) tchild, FALSE); } found = FindNextFile(d, &data); } FindClose(d); } void CInterpret::ExecuteCommand(char *command, int showflag) { STARTUPINFO startupInfo; PROCESS_INFORMATION processInfo; memset(&startupInfo, 0, sizeof(startupInfo)); memset(&processInfo, 0, sizeof(processInfo)); startupInfo.cb = sizeof(STARTUPINFO); startupInfo.dwFlags = STARTF_USESHOWWINDOW; //startupInfo.wShowWindow = SW_SHOW; startupInfo.wShowWindow = showflag; BOOL executionSuccessful = CreateProcess(NULL, command, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInfo); DWORD error = GetLastError(); WaitForSingleObject(processInfo.hProcess, INFINITE); } BOOL CInterpret::IterateListBox(char *parms) { char *target = strtok(parms, ","); char *showstr = strtok(NULL, ","); char *cmd = strtok(NULL, ""); WIDGET *w = theApp.findWidget(target); char indices[MAX_SIZE]; int showflag; if (!w || !(w->type == "ListBox" || w->type == "CheckListBox")) return FALSE; if (w->control && w->control->m_hWnd) { // Widget is still visible on screen, get temporary copy of current value // (from here, we depend on UpdataData() having been called somewhere upstream) CString v = CWizardUI::GetScreenValue(w); strcpy(indices, (char *) (LPCSTR) v); } else strcpy(indices, w->value); if (strcmp(showstr, "SHOW") == 0) showflag = SW_SHOWDEFAULT; else if (strcmp(showstr, "HIDE") == 0) showflag = SW_HIDE; else showflag = SW_SHOWDEFAULT; char *s = strtok(indices, ","); for (; s; s=strtok(NULL, ",")) { char *cmd_copy = strdup(cmd); CString command = replaceVars(cmd_copy, s); free(cmd_copy); ExecuteCommand((char *) (LPCSTR) command, showflag); } return TRUE; } CString CInterpret::replaceVars(char *str, char *listval) { char buf[MIN_SIZE]; char *b = buf; char *v; CString v1; char x[MIN_SIZE]; while (*str) { if (*str == '%') { char *n = ++str; while (*str && *str != '%') str++; if (*str == '%') { // *str = '\0'; int len = (strchr(n,'%') - n); strncpy(x,n,len); x[len]=NULL; if (listval && strlen(x) <= 0) v = listval; else { WIDGET *w = theApp.findWidget(x); if (w) { if (w->control && w->control->m_hWnd) { v1 = CWizardUI::GetScreenValue(w); v = (char *) (LPCSTR) v1; } else v = (char *) (LPCSTR) w->value; } else v = ""; } strcpy(b, v); b += strlen(v); } else { CWnd myWnd; myWnd.MessageBox("Improperly terminated globals reference", "Error", MB_OK); exit(12); } str++; } else *b++ = *str++; } *b = '\0'; return CString(buf); } BOOL CInterpret::CallDLL(char *dll, char *proc, char *parms) { // When searching for DLL info, the m_DLLs is a dummy object // that only exists to hold the head of the list. This simplifies // the handling of the linked list by allowing us to otherwise // ignore the difference in the first node. DLLINFO *last = &m_DLLs; DLLINFO *dllp = m_DLLs.next; int found = FALSE; while (!found && dllp) { last = dllp; if (strcmp(dllp->dllName, dll) == 0 && strcmp(dllp->procName, proc) == 0) found = TRUE; else dllp = dllp->next; } // If we didn't find a match, then create a new entry in the list // and load the library and procedure if (!found) { dllp = (DLLINFO *) GlobalAlloc(0, sizeof(DLLINFO)); dllp->dllName = CString(dll); dllp->procName = CString(proc); VERIFY(dllp->hDLL = ::LoadLibrary(dll)); if (!dllp->hDLL) return FALSE; VERIFY(dllp->procAddr = (DLLPROC *) ::GetProcAddress(dllp->hDLL, proc)); if (!dllp->procAddr) return FALSE; dllp->next = NULL; last->next = dllp; } // OK, if we get this far we've got a valid DLLINFO struct so call the procedure if (!(*dllp->procAddr)(CString(parms))) return FALSE; return TRUE; } BOOL CInterpret::interpret(CString cmds, WIDGET *curWidget) { // Make modifiable copy of string's buffer char buf[MAX_SIZE]; strcpy(buf, (char *)(LPCTSTR) cmds); // Format of commandList is: ;;... // Format of command is: (,,...) int numCmds = 0; char *cmdList[100]; char *pcmdL = strtok(buf, ";"); while (pcmdL) { cmdList[numCmds] = strdup(pcmdL); pcmdL = strtok(NULL, ";"); numCmds++; if (numCmds >= 100) { //fprintf(out, "Skipping command interpretation, too many commands.\n"); return FALSE; } } int i; for (i=0; icontrol)->GetCurSel(); WIDGET *t = theApp.findWidget((char *)(LPCSTR) curWidget->target); CString msg(i); ((CEdit*)t->control)->SetWindowText(msg); } } } // This is an extra free... //free(pcmd); } return TRUE; }