|
|
1.1 root 1: #include "porttool.h"
2: #include "port.h"
3:
4: #define DLGOFFSET 70
5: RESULT rIssue;
6:
7: HANDLE hBkFileHeap;
8:
9:
10: // function prototypes for helper functions
11: void WINAPI GrowDialog (HWND, BOOL);
12: BOOL WINAPI GetHelpFileName (char *);
13: BOOL WINAPI BuildFileList (char *, LPBKFILELIST *);
14: BOOL WINAPI AddFile (char *, char *, BKFILELIST *);
15: BOOL WINAPI RemoveFile (char *, LPBKFILELIST *);
16: BOOL WINAPI FreeFileList (BKFILELIST *);
17:
18: // port options dialog
19: BOOL WINAPI OptionsDlgProc (
20: HWND hDlg,
21: UINT uMsg,
22: UINT uParam,
23: LONG lParam)
24: {
25: BOOL bRet = TRUE;
26: static DWORD *dwPTFlags;
27: static HFONT hStrikeoutFont;
28: static HFONT hSystemFont;
29: LOGFONT lf;
30:
31: switch (uMsg)
32: {
33: case WM_INITDIALOG:
34: // create strikeout font for ignored tokens
35: hSystemFont = GetStockObject (SYSTEM_FONT);
36: GetObject (hSystemFont, sizeof (LOGFONT), &lf);
37: lf.lfStrikeOut = TRUE;
38: hStrikeoutFont = CreateFontIndirect (&lf);
39:
40: // initialize token control with stock system font
41: SendMessage (GetDlgItem (hDlg, IDC_CURTOKEN),
42: WM_SETFONT,
43: (UINT)hSystemFont,
44: FALSE);
45:
46: // save dwPTFlags from lParam
47: dwPTFlags = (DWORD *)lParam;
48:
49: // initialize current token if any
50: if (*(WORD *)rIssue.lpszToken != MAXTOKENLEN)
51: SetDlgItemText (hDlg, IDC_CURTOKEN, rIssue.lpszToken);
52: else
53: EnableWindow (GetDlgItem (hDlg, IDC_IGNORETOKEN), FALSE);
54:
55: // initialize search flag check boxes
56: CheckDlgButton (hDlg, IDC_NOAPIS, (*dwPTFlags & PT_NOAPIS));
57: CheckDlgButton (hDlg, IDC_NOMESSAGES, (*dwPTFlags & PT_NOMESSAGES));
58: CheckDlgButton (hDlg, IDC_NOSTRUCTURES, (*dwPTFlags & PT_NOSTRUCTURES));
59: CheckDlgButton (hDlg, IDC_NOMACROS, (*dwPTFlags & PT_NOMACROS));
60: CheckDlgButton (hDlg, IDC_NOCONSTANTS, (*dwPTFlags & PT_NOCONSTANTS));
61: CheckDlgButton (hDlg, IDC_NOTYPES, (*dwPTFlags & PT_NOTYPES));
62: CheckDlgButton (hDlg, IDC_NOCUSTOM, (*dwPTFlags & PT_NOCUSTOM));
63: CheckDlgButton (hDlg, IDC_IGNORECASE, (*dwPTFlags & PT_IGNORECASE));
64:
65: // set focus to first check box, return FALSE
66: SetFocus (GetDlgItem (hDlg, IDC_NOAPIS));
67: bRet = FALSE;
68: break;
69:
70: case WM_COMMAND:
71: switch (LOWORD (uParam))
72: {
73: case IDOK:
74: // get check box states and return as FLAGS in UM_PORT message
75: *dwPTFlags = (*dwPTFlags & ~PT_IGNORECASE) ^
76: (IsDlgButtonChecked (hDlg, IDC_IGNORECASE) ? PT_IGNORECASE : 0);
77: *dwPTFlags = (*dwPTFlags & ~PT_NOAPIS) ^
78: (IsDlgButtonChecked (hDlg, IDC_NOAPIS) ? PT_NOAPIS : 0);
79: *dwPTFlags = (*dwPTFlags & ~PT_NOMESSAGES) ^
80: (IsDlgButtonChecked (hDlg, IDC_NOMESSAGES) ? PT_NOMESSAGES : 0);
81: *dwPTFlags = (*dwPTFlags & ~PT_NOSTRUCTURES) ^
82: (IsDlgButtonChecked (hDlg, IDC_NOSTRUCTURES) ? PT_NOSTRUCTURES : 0);
83: *dwPTFlags = (*dwPTFlags & ~PT_NOMACROS) ^
84: (IsDlgButtonChecked (hDlg, IDC_NOMACROS) ? PT_NOMACROS : 0);
85: *dwPTFlags = (*dwPTFlags & ~PT_NOCONSTANTS) ^
86: (IsDlgButtonChecked (hDlg, IDC_NOCONSTANTS) ? PT_NOCONSTANTS : 0);
87: *dwPTFlags = (*dwPTFlags & ~PT_NOTYPES) ^
88: (IsDlgButtonChecked (hDlg, IDC_NOTYPES) ? PT_NOTYPES : 0);
89: *dwPTFlags = (*dwPTFlags & ~PT_NOCUSTOM) ^
90: (IsDlgButtonChecked (hDlg, IDC_NOCUSTOM) ? PT_NOCUSTOM : 0);
91:
92: case IDCANCEL:
93: SendMessage (GetDlgItem (hDlg, IDC_CURTOKEN), WM_SETFONT, NULL, FALSE);
94: DeleteObject (hStrikeoutFont);
95: EndDialog (hDlg, LOWORD (uParam) == IDOK);
96: break;
97:
98: case IDC_IGNORETOKEN:
99: // toggle ignore bit
100: *dwPTFlags ^= PT_IGNORETOKEN;
101:
102: // have control draw in strikeout if ignored
103: if (*dwPTFlags & PT_IGNORETOKEN)
104: SendMessage (GetDlgItem (hDlg, IDC_CURTOKEN),
105: WM_SETFONT,
106: (UINT)hStrikeoutFont,
107: TRUE);
108: // else draw in system font
109: else
110: SendMessage (GetDlgItem (hDlg, IDC_CURTOKEN),
111: WM_SETFONT,
112: (UINT)hSystemFont,
113: TRUE);
114: break;
115: }
116: break;
117:
118: default:
119: bRet = FALSE;
120: break;
121: }
122:
123: // return (message was processed);
124: return bRet;
125: }
126:
127:
128:
129: // port options dialog
130: BOOL WINAPI PortDlgProc (
131: HWND hDlg,
132: UINT uMsg,
133: UINT uParam,
134: LONG lParam)
135: {
136: BOOL bRet = TRUE;
137: static DWORD dwPTFlags;
138: static BOOL bSearching = TRUE;
139: static BOOL bHelpActive = FALSE, bIsHelpFile = FALSE;
140: static HBRUSH hBkBrush;
141: static HWND hWndEdit;
142: static HANDLE hEditData;
143: static int nIssues = 0;
144: static int iLineNo, iStartPos;
145: static HLOCAL hToken, hHelp, hIssue, hSuggest;
146: static HLOCAL hEditLine;
147:
148:
149: switch (uMsg)
150: {
151: case WM_INITDIALOG:
152: {
153: char lpszTitle[MAX_PATH];
154: char lpszFilename[MAX_PATH];
155: RECT rc;
156:
157:
158: // reposition self on bottom of screen
159: GetWindowRect (hDlg, &rc);
160: SetWindowPos (hDlg,
161: NULL,
162: rc.left,
163: GetSystemMetrics (SM_CYSCREEN) -
164: (rc.bottom - rc.top + DLGOFFSET),
165: rc.right-rc.left,
166: rc.bottom-rc.top,
167: SWP_NOZORDER | SWP_NOREDRAW | SWP_NOSIZE);
168:
169: // set help available flag
170: if (GetHelpFileName (lpszTitle))
171: {
172: EnableWindow (GetDlgItem (hDlg, IDC_HELP), TRUE);
173: bIsHelpFile = TRUE;
174: }
175:
176: // allocate strings for Issue struct from local heap to reduce stack overhead
177: if (!(rIssue.lpszToken = LocalLock (hToken = LocalAlloc (LHND, MAXTOKENLEN))) ||
178: !(rIssue.lpszHelpStr = LocalLock (hHelp = LocalAlloc (LHND, MAXHELPLEN))) ||
179: !(rIssue.lpszIssue = LocalLock (hIssue = LocalAlloc (LHND, MAXISSUELEN))) ||
180: !(rIssue.lpszSuggest = LocalLock (hSuggest = LocalAlloc (LHND, MAXSUGGESTLEN))))
181: {
182: ErrorNotify (hDlg, IDS_MEMORYFAILED);
183: PostMessage (hDlg, WM_COMMAND, IDC_DONE, 0);
184: break;
185: }
186:
187: // initialize line and token offset position stuff
188: iLineNo = 0;
189: iStartPos = 0;
190: rIssue.nPosToken = 0;
191:
192: // initialize background brush for use in WM_CTLCOLOR message
193: hBkBrush = (HBRUSH)GetClassLong (hDlg, GCL_HBRBACKGROUND);
194:
195: // set initial search flags to default
196: dwPTFlags = 0;
197:
198: // initialize filename in caption
199: LoadString (GetModuleHandle (NULL), IDS_PORTFILE, lpszTitle, strlen (lpszTitle));
200: GetFileFromPath (lpszFilePath, lpszFilename);
201: strcat (lpszTitle, lpszFilename);
202: SetWindowText (hDlg, lpszTitle);
203:
204: // IDC_SUGGESTION to SW_HIDE
205: ShowWindow (GetDlgItem (hDlg, IDC_SUGGESTION), SW_HIDE);
206: ShowWindow (GetDlgItem (hDlg, IDC_SUGGESTLABEL), SW_HIDE);
207:
208: // get edit window and data handle
209: hWndEdit = (HWND)GetWindowLong (GetParent (hDlg), WL_HWNDEDIT);
210: hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
211:
212: // allocate here, reallocate later when needed
213: hEditLine = LocalAlloc (LHND, 1);
214:
215: // post message to start ball rolling
216: PostMessage (hDlg, WM_COMMAND, (UINT)IDC_CONTINUE, 0);
217:
218: // don't worry about focus here since were going to drive the search anyway
219: bRet = TRUE;
220: }
221: break;
222:
223: case WM_COMMAND:
224: switch (LOWORD (uParam))
225: {
226: case IDC_CONTINUE:
227: {
228: int iLastLine, nCharOffset, nLineLen;
229: MSG msg;
230: char lpszBuff[MAXTOKENLEN];
231: char *lpszLine;
232: char *lpLine;
233: char *lpEditData;
234:
235: // disable continue button
236: EnableWindow (GetDlgItem (hDlg, IDC_CONTINUE), FALSE);
237: EnableWindow (GetDlgItem (hDlg, IDC_OPTIONS), FALSE);
238: EnableWindow (GetDlgItem (hDlg, IDCANCEL), TRUE);
239:
240: // set IDC_SEARCHFOUND to green searching
241: LoadString (GetModuleHandle (NULL), IDS_SEARCHING,
242: lpszBuff,
243: sizeof (lpszBuff));
244: SetWindowText (GetDlgItem (hDlg, IDC_SEARCHFOUND), lpszBuff);
245: bSearching = TRUE;
246:
247: // set last line
248: iLastLine = (int)SendMessage (hWndEdit, EM_GETLINECOUNT, 0, 0);
249:
250: // find next port issue
251: while (TRUE)
252: {
253: if (iLineNo >= iLastLine)
254: {
255: // no more issues found, so clean up and go away
256: ErrorNotify (hDlg, IDS_NOMOREPORTISSUES);
257:
258: // nullify any selection in line edit control
259: SendMessage (GetDlgItem (hDlg, IDC_LINE), EM_SETSEL, 0, 0);
260: break;
261: }
262:
263: // increment line no
264: SetWindowText (GetDlgItem (hDlg, IDC_LINENO),
265: itoa (iLineNo, lpszBuff, 10));
266:
267: // get length and number of edit line
268: nCharOffset = SendMessage (hWndEdit, EM_LINEINDEX, iLineNo, 0);
269: if ((nLineLen = SendMessage (hWndEdit, EM_LINELENGTH, nCharOffset, 0)) <= 2)
270: goto NEXT_LINE;
271:
272: // allocate enough memory for edit line
273: if (!(hEditLine = LocalReAlloc (hEditLine,
274: nLineLen+1,
275: LHND)))
276: {
277: // no more issues found, so clean up and go away
278: ErrorNotify (hDlg, IDS_MEMORYFAILED);
279: PostMessage (hDlg, WM_COMMAND, IDC_DONE, 0);
280: break;
281: }
282:
283: // get line from edit control, and null terminate
284: lpEditData = LocalLock (hEditData);
285: lpLine = lpszLine = LocalLock (hEditLine);
286: strncpy (lpszLine, lpEditData+nCharOffset, nLineLen);
287: lpszLine[nLineLen] = 0;
288:
289: // increment the token position for multiple errors in a line
290: lpLine += iStartPos;
291: LocalUnlock (hEditData);
292:
293: // initialize line and hilight token
294: SetWindowText (GetDlgItem (hDlg, IDC_LINE), lpszLine);
295:
296: // reinitialize rIssue strings lengths
297: *(WORD *)rIssue.lpszToken = MAXTOKENLEN;
298: *(WORD *)rIssue.lpszHelpStr = MAXHELPLEN;
299: *(WORD *)rIssue.lpszIssue = MAXISSUELEN;
300: *(WORD *)rIssue.lpszSuggest = MAXSUGGESTLEN;
301:
302: // search next line
303: if (CheckString (lpLine, dwPTFlags, &rIssue))
304: {
305: // set SEARCHFOUND string to found
306: LoadString (GetModuleHandle (NULL),
307: IDS_FOUND,
308: lpszBuff,
309: sizeof (lpszBuff));
310: strcat (lpszBuff, rIssue.lpszToken);
311: SetWindowText (GetDlgItem (hDlg, IDC_SEARCHFOUND), lpszBuff);
312:
313: // reenable options button
314: EnableWindow (GetDlgItem (hDlg, IDC_OPTIONS), TRUE);
315:
316: // set searching flag off
317: bSearching = FALSE;
318:
319: // increment issue cnt
320: SetWindowText (GetDlgItem (hDlg, IDC_ISSUECNT),
321: itoa (++nIssues, lpszBuff, 10));
322:
323: // initialize Issue
324: SetWindowText (GetDlgItem (hDlg, IDC_ISSUE), rIssue.lpszIssue);
325:
326: // if help, enble button
327: EnableWindow (GetDlgItem (hDlg, IDC_HELP),
328: ((*(rIssue.lpszSuggest) != 0) && bIsHelpFile));
329:
330: // if suggest, show suggestion
331: if (*(rIssue.lpszSuggest))
332: {
333: SetWindowText (GetDlgItem (hDlg, IDC_SUGGESTION),
334: rIssue.lpszSuggest);
335: if (!IsWindowVisible (GetDlgItem (hDlg, IDC_SUGGESTION)))
336: GrowDialog (hDlg, TRUE);
337: }
338:
339: else if (IsWindowVisible (GetDlgItem (hDlg, IDC_SUGGESTION)))
340: GrowDialog (hDlg, FALSE);
341:
342: // scroll parent edit control and select offending text
343: SendMessage (hWndEdit, EM_LINESCROLL, 0, iLineNo -
344: SendMessage (hWndEdit, EM_GETFIRSTVISIBLELINE, 0, 0));
345: SendMessage (hWndEdit,
346: EM_SETSEL,
347: iStartPos + nCharOffset + rIssue.nPosToken,
348: iStartPos + nCharOffset + rIssue.nPosToken +
349: strlen (rIssue.lpszToken));
350:
351: // select text in line edit control
352: SendMessage (GetDlgItem (hDlg, IDC_LINE),
353: EM_SETSEL,
354: iStartPos + rIssue.nPosToken,
355: iStartPos + rIssue.nPosToken +
356: strlen (rIssue.lpszToken));
357:
358: // reset nPosToken to check rest of line
359: iStartPos += (rIssue.nPosToken + strlen (rIssue.lpszToken));
360: LocalUnlock (hEditLine);
361: break;
362: }
363:
364: // call peek message to let user cancel if they choose
365: if (PeekMessage (&msg,
366: GetDlgItem (hDlg, IDCANCEL),
367: WM_LBUTTONDOWN,
368: WM_LBUTTONDOWN,
369: PM_REMOVE))
370: {
371: // reset appropriate buttons
372: EnableWindow (GetDlgItem (hDlg, IDCANCEL), FALSE);
373: EnableWindow (GetDlgItem (hDlg, IDC_HELP), FALSE);
374: EnableWindow (GetDlgItem (hDlg, IDC_OPTIONS), TRUE);
375:
376: // break to let message get delivered
377: break;
378: }
379:
380: // also let the user exit from searching
381: if (PeekMessage (&msg,
382: GetDlgItem (hDlg, IDC_DONE),
383: WM_LBUTTONDOWN,
384: WM_LBUTTONDOWN,
385: PM_REMOVE))
386: {
387: PostMessage (hDlg, WM_COMMAND, IDC_DONE, 0);
388: break;
389: }
390:
391: // unlock local edit line
392: LocalUnlock (hEditLine);
393:
394: // reset token position
395: rIssue.nPosToken = 0;
396: iStartPos = 0;
397: NEXT_LINE:
398: // increment line and continue
399: iLineNo++;
400: }
401:
402: // enable continue button unless at end of file
403: if (iLineNo < iLastLine)
404: {
405: EnableWindow (GetDlgItem (hDlg, IDC_CONTINUE), TRUE);
406: SetFocus (GetDlgItem (hDlg, IDC_CONTINUE));
407: }
408: else
409: {
410: EnableWindow (GetDlgItem (hDlg, IDC_CONTINUE), FALSE);
411: EnableWindow (GetDlgItem (hDlg, IDCANCEL), FALSE);
412: SetFocus (GetDlgItem (hDlg, IDC_DONE));
413: }
414: }
415: break;
416:
417: case WM_CLOSE:
418: case IDC_DONE:
419: {
420: char lpszFile[MAX_PATH];
421:
422: if (bHelpActive &&
423: GetHelpFileName (lpszFile))
424: WinHelp (hDlg, lpszFile, HELP_QUIT, 0);
425:
426: // clean up and go away
427: LocalUnlock (hToken); LocalFree (hToken);
428: LocalUnlock (hHelp); LocalFree (hHelp);
429: LocalUnlock (hIssue); LocalFree (hIssue);
430: LocalUnlock (hSuggest); LocalFree (hSuggest);
431: LocalFree (hEditLine);
432: DestroyWindow (hDlg);
433: }
434: break;
435:
436: case IDC_OPTIONS:
437: {
438: DWORD dwOptions = dwPTFlags;
439:
440: // call dialog to start port process
441: if (DialogBoxParam (GetModuleHandle (NULL),
442: IDD_OPTIONSDLG,
443: hDlg,
444: OptionsDlgProc,
445: (LPARAM)&dwOptions))
446: {
447: dwPTFlags = dwOptions;
448:
449: // if PT_IGNORETOKEN, call CheckString
450: if (dwOptions & PT_IGNORETOKEN)
451: {
452: CheckString (rIssue.lpszToken, dwPTFlags, NULL);
453: dwPTFlags ^= PT_IGNORETOKEN;
454: }
455: }
456:
457: }
458: break;
459:
460: case IDC_HELP:
461: {
462: char lpszFile[MAX_PATH];
463:
464: if (bIsHelpFile && GetHelpFileName (lpszFile))
465: {
466: WinHelp (hDlg, lpszFile, HELP_KEY, (DWORD)rIssue.lpszHelpStr);
467: bHelpActive = TRUE;
468: }
469: }
470: break;
471:
472: case IDC_RESTART:
473: iLineNo = 0;
474: rIssue.nPosToken = 0;
475: iStartPos = 0;
476: PostMessage (hDlg, WM_COMMAND, IDC_CONTINUE, 0);
477: break;
478: }
479: break;
480:
481: default:
482: bRet = FALSE;
483: break;
484: }
485:
486: // return (message was processed);
487: return bRet;
488: }
489:
490:
491:
492:
493: // background porting status dialog
494: BOOL WINAPI BkPortDlgProc (
495: HWND hDlg,
496: UINT uMsg,
497: UINT uParam,
498: LONG lParam)
499: {
500: BOOL bRet = TRUE;
501: char szFileName[MAX_PATH];
502: char szFilePath[MAX_PATH];
503: static BKFILELIST *lpbkFiles;
504: static int iCurThread;
505: static BOOL bStarted = FALSE;
506: BKFILELIST *lpNode;
507:
508: switch (uMsg)
509: {
510: case WM_INITDIALOG:
511: {
512: HWND hIssues = GetDlgItem (hDlg, IDC_ISSUES);
513: HWND hLines = GetDlgItem (hDlg, IDC_LINES);
514: HWND hComplete = GetDlgItem (hDlg, IDC_COMPLETE);
515:
516: // set background icon to porttool background icon and start minimized
517: SetClassLong (hDlg,
518: GCL_HICON,
519: (LONG)LoadIcon (GetModuleHandle (NULL), IDBkPort));
520:
521: lpbkFiles = NULL;
522: iCurThread = -1;
523:
524: // build list of files to port from lParam
525: if (lParam)
526: {
527: if (!BuildFileList ((char *)lParam, &lpbkFiles))
528: {
529: lpbkFiles = NULL;
530: break;
531: }
532: }
533:
534: else
535: {
536: // get file from user first
537: *szFileName = 0;
538: *szFilePath = 0;
539:
540: GetFileName (hDlg, szFileName, szFilePath);
541: if (!BuildFileList (szFilePath, &lpbkFiles))
542: {
543: lpbkFiles = NULL;
544: break;
545: }
546: }
547:
548: lpNode = lpbkFiles;
549: // initialize each file in list
550: while (lpNode)
551: {
552: // add filename to listbox
553: SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
554: LB_ADDSTRING,
555: 0,
556: (LPARAM)lpNode->bkFile.szFile);
557:
558: // initialize some stuff
559: lpNode->bkFile.hDlg = hDlg;
560: lpNode->bkFile.dwPTFlags = PT_DEFAULT;
561:
562: // start background thread on each file
563: StartBkPortThread (&lpNode->bkFile);
564:
565: // traverse list
566: lpNode = lpNode->Next;
567: }
568:
569: // select first thread in listbox
570: SendMessage (GetDlgItem (hDlg, IDC_FILELIST), LB_SETCURSEL, 0, 0);
571: SetDlgItemText (hDlg, IDC_FILEPATH, lpbkFiles->bkFile.szFilePath);
572:
573: // if started with /b switch
574: if (!GetParent (hDlg))
575: ShowWindow (hDlg, SW_SHOWMINIMIZED);
576: else
577: SetEvent (lpbkFiles->hEvents[BKPORT_STATUS]);
578:
579: iCurThread = 0;
580: bStarted = TRUE;
581: }
582: break;
583:
584: case WM_SHOWWINDOW:
585: if (bStarted)
586: {
587: int i = 0;
588:
589: lpNode = lpbkFiles;
590: while (i < iCurThread)
591: lpNode = lpNode->Next;
592:
593: if (!uParam)
594: ResetEvent (lpNode->hEvents[BKPORT_STATUS]);
595: else
596: SetEvent (lpNode->hEvents[BKPORT_STATUS]);
597: }
598: break;
599:
600: case WM_SIZE:
601: if (bStarted)
602: {
603: int i = 0;
604:
605: lpNode = lpbkFiles;
606: while (i < iCurThread)
607: lpNode = lpNode->Next;
608:
609: if (uParam == SIZEICONIC)
610: ResetEvent (lpNode->hEvents[BKPORT_STATUS]);
611: else
612: SetEvent (lpNode->hEvents[BKPORT_STATUS]);
613: }
614: break;
615:
616: case UM_STATUSUPDATE:
617: {
618: char Buff[10];
619:
620: // update status info controls
621: SetDlgItemText (hDlg, IDC_ISSUES, itoa (LOWORD (uParam), Buff, 10));
622: SetDlgItemText (hDlg, IDC_COMPLETE, itoa (HIWORD (uParam), Buff, 10));
623: SetDlgItemText (hDlg, IDC_LINES, itoa (lParam, Buff, 10));
624: }
625: break;
626:
627: case UM_THREADCOMPLETE:
628: {
629: int iThread = 0;
630:
631: // find handle in list
632: lpNode = lpbkFiles;
633: while (lpNode)
634: {
635: if ((HANDLE)uParam == lpNode->bkFile.hThread)
636: break;
637: lpNode = lpNode->Next;
638: iThread++;
639: }
640:
641: if (lpNode)
642: {
643: // remove file list item
644: RemoveFile (lpNode->bkFile.szFilePath, &lpbkFiles);
645:
646: // remove item from list box
647: SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
648: LB_DELETESTRING,
649: iThread,
650: 0);
651:
652: // if current thread ended and more threads exist
653: if (iThread == iCurThread &&
654: lpbkFiles &&
655: SendMessage (GetDlgItem (hDlg, IDC_FILELIST), LB_GETCOUNT, 0, 0))
656: {
657: SendMessage (GetDlgItem (hDlg, IDC_FILELIST), LB_SETCURSEL, 0, 0);
658: SetEvent (lpbkFiles->hEvents[BKPORT_STATUS]);
659: iCurThread = 0;
660: }
661:
662: else if (iThread == iCurThread)
663: {
664: iCurThread = -1;
665: PostMessage (hDlg, WM_COMMAND, IDC_BKDONE, 0);
666: }
667:
668: // clean up controls
669: SetDlgItemText (hDlg, IDC_FILEPATH, "");
670: PostMessage (hDlg, UM_STATUSUPDATE, 0, 0);
671: }
672:
673: else
674: {
675: MessageBox (hDlg,
676: "Error, invalid thread handle process terminating.",
677: "Error",
678: MB_ICONSTOP | MB_OK);
679: ExitProcess (FALSE);
680: }
681:
682: }
683: break;
684:
685: case WM_COMMAND:
686: switch (LOWORD (uParam))
687: {
688: case IDC_FILELIST:
689: // if new file selected change update signal to active thread
690: if (HIWORD (uParam) == LBN_SELCHANGE)
691: {
692: int i = 0;
693: int iNewThread = SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
694: LB_GETCURSEL,
695: 0,
696: 0);
697:
698: // reset current thread
699: lpNode = lpbkFiles;
700: while (lpNode)
701: {
702: if (i == iCurThread)
703: ResetEvent (lpNode->hEvents[BKPORT_STATUS]);
704:
705: if (i == iNewThread)
706: {
707: SetEvent (lpNode->hEvents[BKPORT_STATUS]);
708: SetDlgItemText (hDlg,
709: IDC_FILEPATH,
710: lpNode->bkFile.szFilePath);
711: }
712:
713: lpNode = lpNode->Next;
714: i++;
715: }
716:
717: iCurThread = iNewThread;
718: }
719: break;
720:
721: case IDC_ABORTFILE:
722: {
723: int i = 0;
724: HCURSOR hOldCursor;
725:
726: // reset current thread
727: lpNode = lpbkFiles;
728: while (lpNode)
729: {
730: if (i == iCurThread)
731: {
732: // put hourglass cursor up
733: hOldCursor = (HCURSOR)SetClassLong (hDlg, GCL_HCURSOR, NULL);
734: SetCursor (LoadCursor (NULL, IDC_WAIT));
735:
736: // abort porting file where it is
737: SetEvent (lpNode->hEvents[BKPORT_ABORT]);
738:
739: // remove file from list when thread is dead
740: WaitForSingleObject (lpNode->bkFile.hThread, INFINITE);
741: RemoveFile (lpNode->bkFile.szFilePath, &lpbkFiles);
742:
743: // replace original cursor
744: SetClassLong (hDlg, GCL_HCURSOR, (LONG)hOldCursor);
745: SetCursor (hOldCursor);
746:
747: // update listbox
748: SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
749: LB_DELETESTRING,
750: iCurThread,
751: 0);
752:
753: // select new event if any in listbox
754: if (SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
755: LB_GETCOUNT,
756: 0,
757: 0))
758: {
759: SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
760: LB_SETCURSEL,
761: 0,
762: 0);
763: SetEvent (lpbkFiles->hEvents[BKPORT_STATUS]);
764: iCurThread = 0;
765: }
766:
767: else
768: {
769: iCurThread = -1;
770: PostMessage (hDlg, WM_COMMAND, IDC_DONE, 0);
771: }
772:
773: // clean up controls
774: SetDlgItemText (hDlg, IDC_FILEPATH, "");
775: PostMessage (hDlg, UM_STATUSUPDATE, 0, 0);
776: break;
777: }
778:
779: lpNode = lpNode->Next;
780: i++;
781: }
782: }
783: break;
784:
785: case IDC_ADDFILE:
786: {
787: // get file from user first
788: *szFileName = 0;
789: *szFilePath = 0;
790:
791: // add a file to the list
792: if (GetFileName (hDlg, szFileName, szFilePath))
793: {
794: // if new list
795: if (!lpbkFiles)
796: BuildFileList (szFilePath, &lpbkFiles);
797:
798: else if (!AddFile (szFilePath, szFileName, lpbkFiles))
799: break;
800:
801: // find node in list
802: lpNode = lpbkFiles;
803: while (lpNode)
804: {
805: if (!strcmp (lpNode->bkFile.szFilePath, szFilePath))
806: break;
807: lpNode = lpNode->Next;
808: }
809:
810: if (lpNode)
811: {
812: // add filename to listbox
813: SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
814: LB_ADDSTRING,
815: 0,
816: (LPARAM)lpNode->bkFile.szFile);
817:
818: // initialize some stuff
819: lpNode->bkFile.hDlg = hDlg;
820: lpNode->bkFile.dwPTFlags = PT_DEFAULT;
821:
822: // start background thread on this file
823: StartBkPortThread (&lpNode->bkFile);
824:
825: // if first thread
826: if (iCurThread == -1 ||
827: SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
828: LB_GETCOUNT, 0, 0) == 1)
829: {
830: iCurThread = 0;
831: SendMessage (GetDlgItem (hDlg, IDC_FILELIST),
832: LB_SETCURSEL,
833: 0,
834: 0);
835: SendMessage (hDlg,
836: WM_COMMAND,
837: MAKELONG (IDC_FILELIST, LBN_SELCHANGE),
838: 0);
839: }
840: }
841: }
842: }
843: break;
844:
845: case IDC_CHANGEOPTIONS:
846: {
847: DWORD dwFlags;
848:
849: dwFlags = (dwFlags & ~PT_IGNORECASE) ^
850: (IsDlgButtonChecked (hDlg, IDC_BKIGNORECASE) ? PT_IGNORECASE : 0);
851: dwFlags = (dwFlags & ~PT_NOAPIS) ^
852: (IsDlgButtonChecked (hDlg, IDC_BKNOAPIS) ? PT_NOAPIS : 0);
853: dwFlags = (dwFlags & ~PT_NOMESSAGES) ^
854: (IsDlgButtonChecked (hDlg, IDC_BKNOMESSAGES) ? PT_NOMESSAGES : 0);
855: dwFlags = (dwFlags & ~PT_NOSTRUCTURES) ^
856: (IsDlgButtonChecked (hDlg, IDC_BKNOSTRUCTURES) ? PT_NOSTRUCTURES : 0);
857: dwFlags = (dwFlags & ~PT_NOMACROS) ^
858: (IsDlgButtonChecked (hDlg, IDC_BKNOMACROS) ? PT_NOMACROS : 0);
859: dwFlags = (dwFlags & ~PT_NOCONSTANTS) ^
860: (IsDlgButtonChecked (hDlg, IDC_BKNOCONSTANTS) ? PT_NOCONSTANTS : 0);
861: dwFlags = (dwFlags & ~PT_NOTYPES) ^
862: (IsDlgButtonChecked (hDlg, IDC_BKNOTYPES) ? PT_NOTYPES : 0);
863: dwFlags = (dwFlags & ~PT_NOCUSTOM) ^
864: (IsDlgButtonChecked (hDlg, IDC_BKNOCUSTOM) ? PT_NOCUSTOM : 0);
865:
866: // change the options for the file being ported
867: lpbkFiles->bkFile.dwPTFlags = dwFlags;
868: }
869: break;
870:
871: case IDCANCEL:
872: {
873: HCURSOR hOldCursor;
874: HANDLE hThreads[MAXBKTHREADS];
875: int i = 0;
876:
877: // put up confirm message
878: if (MessageBox (hDlg,
879: "Cancel background process?",
880: "PortTool - Abort",
881: MB_ICONQUESTION | MB_OKCANCEL) == IDOK)
882: {
883: // put hourglass cursor up
884: hOldCursor = (HCURSOR)SetClassLong (hDlg, GCL_HCURSOR, NULL);
885: SetCursor (LoadCursor (NULL, IDC_WAIT));
886:
887: // if any files in list
888: if (lpbkFiles)
889: {
890: // abort all background threads and build thread handle array
891: lpNode = lpbkFiles;
892: while (lpNode)
893: {
894: SetEvent (lpNode->hEvents[BKPORT_ABORT]);
895: hThreads[i++] = lpNode->bkFile.hThread;
896: lpNode = lpNode->Next;
897: }
898:
899: // wait on completion of background threads
900: WaitForMultipleObjects (i, hThreads, TRUE, INFINITE);
901:
902: // free background port resources
903: FreeFileList (lpbkFiles);
904: }
905:
906: SetClassLong (hDlg, GCL_HCURSOR, (LONG)hOldCursor);
907: SetCursor (hOldCursor);
908: DestroyWindow (hDlg);
909: }
910: }
911: break;
912:
913: case IDC_BKDONE:
914: // if file list post message to cancel
915: if (lpbkFiles)
916: PostMessage (hDlg, WM_COMMAND, IDCANCEL, 0);
917: else
918: DestroyWindow (hDlg);
919: break;
920:
921: default:
922: bRet = FALSE;
923: break;
924: }
925: break;
926:
927: case WM_DESTROY:
928: // if no parent, post quit message
929: if (GetParent (hDlg) == NULL)
930: PostQuitMessage (1);
931: break;
932:
933: default:
934: bRet = FALSE;
935: break;
936: }
937:
938: return bRet;
939: }
940:
941:
942:
943: // funtion retrieves the help filename from the ini file
944: BOOL WINAPI GetHelpFileName (
945: char *lpszFile)
946: {
947: char szAppName[30];
948: char szWinHelp[30];
949: char szDefault[] = "Default";
950: char szIniFile[MAX_PATH];
951: OFSTRUCT of;
952:
953: // get ini file and path
954: GetIniFile (szIniFile);
955:
956: // get help filename from ini file
957: LoadString (GetModuleHandle (NULL), IDS_APPNAME, szAppName, 30);
958: LoadString (GetModuleHandle (NULL), IDS_WINHELP, szWinHelp, 30);
959: GetPrivateProfileString (szAppName,
960: szWinHelp,
961: szDefault,
962: lpszFile,
963: MAX_PATH,
964: szIniFile);
965:
966: // test to see if help file exists
967: return (OpenFile (lpszFile, &of, OF_EXIST) != -1);
968: }
969:
970:
971:
972:
973: // rearrange dialog and controls
974: void WINAPI GrowDialog (
975: HWND hDlg,
976: BOOL bBigger)
977: {
978: RECT rc;
979: int nChange = (bBigger ? DLGOFFSET : -DLGOFFSET);
980:
981: // grow main dialog
982: GetWindowRect (hDlg, &rc);
983: SetWindowPos (hDlg,
984: NULL,
985: rc.left,
986: rc.top,
987: rc.right-rc.left,
988: rc.bottom-rc.top + nChange,
989: SWP_NOMOVE | SWP_NOZORDER);
990:
991: // move stop button down
992: GetWindowRect (GetDlgItem (hDlg, IDCANCEL), &rc);
993: ScreenToClient (hDlg, (LPPOINT)&rc);
994: ScreenToClient (hDlg, (LPPOINT)&rc.right);
995: SetWindowPos (GetDlgItem (hDlg, IDCANCEL),
996: NULL,
997: rc.left,
998: rc.top + nChange,
999: rc.right-rc.left,
1000: rc.bottom-rc.top,
1001: SWP_NOSIZE | SWP_NOZORDER);
1002:
1003: // move CONTINUE button down
1004: GetWindowRect (GetDlgItem (hDlg, IDC_CONTINUE), &rc);
1005: ScreenToClient (hDlg, (LPPOINT)&rc);
1006: ScreenToClient (hDlg, (LPPOINT)&rc.right);
1007: SetWindowPos (GetDlgItem (hDlg, IDC_CONTINUE),
1008: NULL,
1009: rc.left,
1010: rc.top + nChange,
1011: rc.right-rc.left,
1012: rc.bottom-rc.top,
1013: SWP_NOSIZE | SWP_NOZORDER);
1014:
1015: // move restart button down
1016: GetWindowRect (GetDlgItem (hDlg, IDC_RESTART), &rc);
1017: ScreenToClient (hDlg, (LPPOINT)&rc);
1018: ScreenToClient (hDlg, (LPPOINT)&rc.right);
1019: SetWindowPos (GetDlgItem (hDlg, IDC_RESTART),
1020: NULL,
1021: rc.left,
1022: rc.top + nChange,
1023: rc.right-rc.left,
1024: rc.bottom-rc.top,
1025: SWP_NOSIZE | SWP_NOZORDER);
1026:
1027: // move options button down
1028: GetWindowRect (GetDlgItem (hDlg, IDC_OPTIONS), &rc);
1029: ScreenToClient (hDlg, (LPPOINT)&rc);
1030: ScreenToClient (hDlg, (LPPOINT)&rc.right);
1031: SetWindowPos (GetDlgItem (hDlg, IDC_OPTIONS),
1032: NULL,
1033: rc.left,
1034: rc.top + nChange,
1035: rc.right-rc.left,
1036: rc.bottom-rc.top,
1037: SWP_NOSIZE | SWP_NOZORDER);
1038:
1039: // move help button down
1040: GetWindowRect (GetDlgItem (hDlg, IDC_HELP), &rc);
1041: ScreenToClient (hDlg, (LPPOINT)&rc);
1042: ScreenToClient (hDlg, (LPPOINT)&rc.right);
1043: SetWindowPos (GetDlgItem (hDlg, IDC_HELP),
1044: NULL,
1045: rc.left,
1046: rc.top + nChange,
1047: rc.right-rc.left,
1048: rc.bottom-rc.top,
1049: SWP_NOSIZE | SWP_NOZORDER);
1050:
1051: // move done button down
1052: GetWindowRect (GetDlgItem (hDlg, IDC_DONE), &rc);
1053: ScreenToClient (hDlg, (LPPOINT)&rc);
1054: ScreenToClient (hDlg, (LPPOINT)&rc.right);
1055: SetWindowPos (GetDlgItem (hDlg, IDC_DONE),
1056: NULL,
1057: rc.left,
1058: rc.top + nChange,
1059: rc.right-rc.left,
1060: rc.bottom-rc.top,
1061: SWP_NOSIZE | SWP_NOZORDER);
1062:
1063: // show suggestion edit control and label when appropriate
1064: ShowWindow (GetDlgItem (hDlg, IDC_SUGGESTION), (bBigger ? SW_SHOW : SW_HIDE));
1065: ShowWindow (GetDlgItem (hDlg, IDC_SUGGESTLABEL), (bBigger ? SW_SHOW : SW_HIDE));
1066: }
1067:
1068:
1069:
1070:
1071: BOOL WINAPI BuildFileList (
1072: char *lpFileList,
1073: LPBKFILELIST *lpList)
1074: {
1075: char *lpFile;
1076: char szFilePath[MAX_PATH];
1077: char szFile[MAX_PATH];
1078: HFILE hFile;
1079: OFSTRUCT of;
1080: BOOL bList = FALSE;
1081:
1082: // create heap for up to 50 files at a time
1083: if (!(hBkFileHeap = HeapCreate (HEAP_SERIALIZE,
1084: sizeof (BKFILELIST),
1085: MAXBKTHREADS * sizeof (BKFILELIST))))
1086: return FALSE;
1087:
1088: // allocate first node in list
1089: *lpList = (BKFILELIST *)HeapAlloc (hBkFileHeap, sizeof (BKFILELIST));
1090: (*lpList)->hEvents[BKPORT_ABORT] = NULL;
1091:
1092: // parse first file in list
1093: lpFile = strtok (lpFileList, " ");
1094:
1095: // loop through all files in list
1096: while (lpFile)
1097: {
1098: strcpy (szFilePath, lpFile);
1099:
1100: // if no path, add current directory as path
1101: if (!GetFileFromPath (szFilePath, szFile))
1102: {
1103: strcpy (szFile, szFilePath);
1104: GetCurrentDirectory (MAX_PATH, szFilePath);
1105: strcat (szFilePath, "\\");
1106: strcat (szFilePath, szFile);
1107: }
1108:
1109: // verify file is available
1110: hFile = OpenFile (szFilePath, &of, OF_READWRITE);
1111: if (hFile != -1)
1112: {
1113: // added at least one file
1114: bList = TRUE;
1115:
1116: // close file
1117: CloseHandle ((HANDLE)hFile);
1118:
1119: // add file to list
1120: AddFile (szFilePath, szFile, *lpList);
1121: }
1122:
1123: // get next file in list
1124: lpFile = strtok (NULL, " ");
1125: }
1126:
1127: // if no valid files, cleanup
1128: if (!bList)
1129: {
1130: HeapDestroy (hBkFileHeap);
1131: return FALSE;
1132: }
1133:
1134: return TRUE;
1135: }
1136:
1137:
1138:
1139:
1140: BOOL WINAPI AddFile (
1141: char *lpFilePath,
1142: char *lpFile,
1143: BKFILELIST *lpbkFiles)
1144: {
1145: BKFILELIST *lpNode;
1146:
1147:
1148: // if first item in list don't need to allocate
1149: if (!lpbkFiles->hEvents[BKPORT_ABORT])
1150: lpNode = lpbkFiles;
1151: else
1152: {
1153: lpNode = (BKFILELIST *)HeapAlloc (hBkFileHeap, sizeof (BKFILELIST));
1154: if (!lpNode)
1155: return FALSE;
1156:
1157: // find end of list then add new node
1158: while (lpbkFiles->Next)
1159: lpbkFiles = lpbkFiles->Next;
1160: lpbkFiles->Next = lpNode;
1161: }
1162:
1163: // initialize node structure
1164: strcpy (lpNode->bkFile.szFile, lpFile);
1165: strcpy (lpNode->bkFile.szFilePath, lpFilePath);
1166: CreateEvents (lpNode->hEvents, &lpNode->bkFile);
1167: lpNode->Next = NULL;
1168:
1169: return TRUE;
1170: }
1171:
1172:
1173:
1174:
1175: BOOL WINAPI RemoveFile (
1176: char *lpFilePath,
1177: LPBKFILELIST *lpbkFiles)
1178: {
1179: BKFILELIST *pHead = *lpbkFiles;
1180: BKFILELIST *pTail = *lpbkFiles;
1181:
1182: // loop thru list until file name matches
1183: while (pHead)
1184: {
1185: if (!strcmp (lpFilePath, pHead->bkFile.szFilePath))
1186: {
1187: // special case remove first node
1188: if (pTail == pHead)
1189: {
1190: *lpbkFiles = pHead->Next;
1191: DestroyEvents (pHead->hEvents);
1192: HeapFree (hBkFileHeap, (char *)(pHead));
1193:
1194: // if no more nodes, destroy heap
1195: if (!*lpbkFiles)
1196: HeapDestroy (hBkFileHeap);
1197: }
1198:
1199: else
1200: {
1201: pTail->Next = pHead->Next;
1202: DestroyEvents (pHead->hEvents);
1203: HeapFree (hBkFileHeap, (char *)pHead);
1204: }
1205:
1206: return TRUE;
1207: }
1208:
1209: pTail = pHead;
1210: pHead = pHead->Next;
1211: }
1212:
1213: return FALSE;
1214: }
1215:
1216:
1217:
1218:
1219: BOOL WINAPI FreeFileList (
1220: BKFILELIST *lpbkFiles)
1221: {
1222: // loop thru each list item
1223: while (lpbkFiles)
1224: {
1225: // destroy event handles
1226: DestroyEvents (lpbkFiles->hEvents);
1227:
1228: lpbkFiles = lpbkFiles->Next;
1229: }
1230:
1231: // release entire heap
1232: HeapDestroy (hBkFileHeap);
1233:
1234: return TRUE;
1235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.