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