source: trunk/dll/walkem.c@ 1079

Last change on this file since 1079 was 1078, checked in by Steven Levine, 17 years ago

More Fortify infrastructure enhancements
Rework Fortify_SetOwner
Add Fortify_BecomeOwner
Avoid more spurious leak reports

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 43.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: walkem.c 1078 2008-07-19 04:08:02Z stevenhl $
5
6 Misc persistent lists support
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2007 Steven H. Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 05 Jun 05 SHL Use QWL_USER
13 13 Aug 05 SHL Run through indent
14 13 Aug 05 SHL remove_udir - avoid corrupting last dirs list
15 17 Jul 06 SHL Use Runtime_Error
16 29 Jul 06 SHL Use xfgets
17 20 Oct 06 SHL Correct . .. check
18 06 Nov 06 SHL Oops - need to allow .. here
19 14 Nov 06 SHL Correct FillPathListBox regression
20 22 Mar 07 GKY Use QWL_USER
21 20 Apr 07 SHL Avoid spurious add_udir error reports
22 16 Aug 07 SHL Update add_setups for ticket# 109
23 19 Aug 07 SHL Correct load_setups error reporting
24 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
25 25 Aug 07 SHL Correct #pragma alloc_text typos
26 11 Nov 07 GKY Cancel now directly closes dialog even if directory path text has changed
27 20 Jan 08 GKY Walk & walk2 dialogs now save and restore size and position
28 19 Feb 08 JBS Add "State at last FM/2 close" to the states combo box
29 29 Feb 08 GKY Use xfree where appropriate
30 29 Feb 08 GKY Refactor global command line variables to notebook.h
31 19 Jun 08 JBS Ticket 227: Allow temporary saving/deleting of the shutdown state of directory containers
32 22 Jun 08 GKY Add free_?dir for fortify testing
33 18 Jul 08 SHL More Fortify support
34
35***********************************************************************/
36
37#include <stdlib.h>
38#include <string.h>
39#include <ctype.h>
40#include <share.h>
41
42#define INCL_WIN
43#define INCL_DOS
44#define INCL_DOSERRORS
45#define INCL_SHLERRORS // PMERR_NOT_IN_IDX
46#define INCL_LONGLONG
47
48#include "fm3dlg.h"
49#include "fm3str.h"
50#include "errutil.h" // Dos_Error...
51#include "strutil.h" // GetPString
52#include "notebook.h" // targetdirectory
53#include "fm3dll.h"
54#include "fortify.h"
55#include "walkem.h"
56
57#pragma data_seg(DATA1)
58
59static PSZ pszSrcFile = __FILE__;
60
61
62typedef struct
63{
64 USHORT size;
65 USHORT changed;
66 BOOL nounwriteable;
67 CHAR szCurrentPath[CCHMAXPATH];
68 CHAR *szReturnPath;
69}
70WALKER;
71
72static CHAR WalkFont[CCHMAXPATH] = "";
73static ULONG WalkFontSize = sizeof(WalkFont);
74
75/**
76 * States names management
77 */
78
79static BOOL fSetupsLoaded;
80static LINKDIRS *pFirstSetup;
81static const PSZ pszLastSetups = "LastSetups";
82// 18 Aug 07 SHL fixme to stop supporting old style 1 year from now?
83static const ULONG ulOldSetupsBytes = 100 * 13; // Prior to 3.0.7
84
85/**
86 * Fill States drop down list with known state names
87 */
88
89VOID fill_setups_list(VOID)
90{
91 WinSendMsg(hwndStatelist, LM_DELETEALL, MPVOID, MPVOID);
92 if (fUserComboBox) {
93 LINKDIRS *pld;
94 load_setups();
95 for (pld = pFirstSetup; pld; pld = pld->next) {
96 // DbgMsg(pszSrcFile, __LINE__, "Inserted %s", pld->path);
97 WinSendMsg(hwndStatelist,
98 LM_INSERTITEM,
99 MPFROM2SHORT(LIT_SORTASCENDING, 0),
100 MPFROMP(pld->path));
101 }
102 WinSetWindowText(hwndStatelist, GetPString(IDS_STATETEXT));
103 }
104}
105
106/**
107 * Lookup setup and do requested action
108 * @param - action, Support old/new style storage method
109 * @return 1 if found and action OK, 0 if not found and action OK, -1 if error during action
110 */
111
112#define LS_FIND 0
113#define LS_ADD 1
114#define LS_DELETE 2
115
116static INT lookup_setup(PSZ name, UINT action)
117{
118 LINKDIRS *pld;
119 LINKDIRS *pldLast = NULL;
120
121 if (!name || !*name) {
122 Runtime_Error(pszSrcFile, __LINE__, "no data");
123 return -1;
124 }
125
126 load_setups();
127
128 for (pld = pFirstSetup; pld; pld = pld->next) {
129 if (!stricmp(pld->path, name)) {
130 if (action == LS_DELETE) {
131 if (pldLast)
132 pldLast->next = pld->next;
133 else
134 pFirstSetup = pld->next;
135 xfree(pld->path, pszSrcFile, __LINE__);
136 free(pld);
137 }
138 return 1; // Found or added
139 }
140 pldLast = pld; // In case deleting
141 } // for
142
143 // Not found
144 if (action == LS_ADD) {
145 pld = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
146 if (!pld)
147 return -1;
148 pld->path = xstrdup(name, pszSrcFile, __LINE__);
149 if (!pld->path) {
150 free(pld);
151 return -1;
152 }
153 // Insert at front of list - drop down will sort
154 pld->next = pFirstSetup;
155 pFirstSetup = pld;
156 return 0;
157 }
158
159 return FALSE; // Not found
160}
161
162/**
163 * Load state names from ini
164 * Support old/new style storage method
165 */
166
167VOID load_setups(VOID)
168{
169 ULONG ulDataBytes;
170 ULONG l;
171 PSZ pszBuf;
172 PSZ psz;
173 LINKDIRS *pld;
174
175 if (fSetupsLoaded)
176 return;
177
178 if (!PrfQueryProfileSize(fmprof, FM3Str, pszLastSetups, &ulDataBytes)) {
179 // fixme to use generic hab
180 ERRORID eid = WinGetLastError((HAB)0);
181 if ((eid & 0xffff) != PMERR_NOT_IN_IDX) {
182 // Get error info back
183 PrfQueryProfileSize(fmprof, FM3Str, pszLastSetups, &ulDataBytes);
184 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, "PrfQueryProfileSize");
185 }
186 else
187 fSetupsLoaded = TRUE; // Nothing saved
188 return;
189 }
190
191 if (ulDataBytes == 0) {
192 Runtime_Error(pszSrcFile, __LINE__, "PrfQueryProfileSize reported 0 bytes");
193 return;
194 }
195
196 pszBuf = xmalloc(ulDataBytes + 1, pszSrcFile, __LINE__); // One extra for end marker
197 if (!pszBuf)
198 return;
199 l = ulDataBytes;
200 if (!PrfQueryProfileData(fmprof, FM3Str, pszLastSetups, pszBuf, &l)) {
201 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, "PrfQueryProfileData");
202 free(pszBuf);
203 return;
204 }
205
206 if (ulDataBytes != l) {
207 Runtime_Error(pszSrcFile, __LINE__, "PrfQueryProfileData reported %u expected %u", l, ulDataBytes);
208 free(pszBuf);
209 return;
210 }
211
212 *(pszBuf + ulDataBytes) = 0; // Insert end marker
213
214 psz = pszBuf;
215 if (!*psz && ulDataBytes == ulOldSetupsBytes)
216 psz += 13; // Rarely used 1st fixed width entry prior to 3.0.7
217
218 while (*psz) {
219 pld = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
220 if (!pld) {
221 free(pszBuf);
222 return;
223 }
224
225# ifdef FORTIFY
226 Fortify_SetOwner(pld, 1);
227 Fortify_SetScope(pld, 1);
228# endif
229
230 pld->path = xstrdup(psz, pszSrcFile, __LINE__);
231 if (!pld->path) {
232 free(pszBuf);
233 free(pld);
234 return;
235 }
236
237# ifdef FORTIFY
238 Fortify_SetOwner(pld->path, 1);
239 Fortify_SetScope(pld->path, 1);
240# endif
241
242 // Insert at front of list - drop down will sort
243 pld->next = pFirstSetup;
244 pFirstSetup = pld;
245 // DbgMsg(pszSrcFile, __LINE__, "Inserted %s", pld->path);
246
247 if (ulDataBytes == ulOldSetupsBytes)
248 psz += 13; // Buffers fixed width prior to 3.0.7
249 else
250 psz += strlen(psz) + 1;
251 } // while
252
253 free(pszBuf);
254
255 fSetupsLoaded = TRUE;
256}
257
258VOID save_setups(VOID)
259{
260 ULONG ulBufBytes;
261 ULONG ulFillBytes;
262 ULONG l;
263 PSZ pszBuf;
264 PSZ psz;
265 LINKDIRS *pld;
266
267 if (!fSetupsLoaded)
268 return;
269
270 ulBufBytes = 0;
271 for (pld = pFirstSetup; pld; pld = pld->next) {
272 ulBufBytes += strlen(pld->path) + 1;
273 } // for
274
275 if (!ulBufBytes)
276 pszBuf = NULL;
277 else {
278 // Ensure different than size prior to 3.0.7
279 ulFillBytes = ulBufBytes == ulOldSetupsBytes ? 1 : 0;
280 pszBuf = xmalloc(ulBufBytes + ulFillBytes, pszSrcFile, __LINE__);
281 if (!pszBuf)
282 return;
283
284 psz = pszBuf;
285 for (pld = pFirstSetup; pld; pld = pld->next) {
286 l = strlen(pld->path) + 1;
287 memcpy(psz, pld->path, l);
288 psz += l;
289 } // for
290 if (ulFillBytes)
291 *psz = 0;
292 }
293
294 if (!PrfWriteProfileData(fmprof,
295 FM3Str,
296 pszLastSetups, pszBuf, ulBufBytes)) {
297 // Win_Error(pszSrcFile, __LINE__, HWND_DESKTOP, HWND_DESKTOP, "PrfWriteProfileData");
298 ERRORID eid = WinGetLastError((HAB)0);
299 if ((eid & 0xffff) != PMERR_NOT_IN_IDX)
300 Runtime_Error(pszSrcFile, __LINE__, "PrfWriteProfileData returned %u", eid);
301 }
302
303 // Delete obsolete INI entry
304 PrfWriteProfileData(fmprof, FM3Str, "LastSetup", NULL, 0);
305}
306
307/**
308 * Add named state to setups list
309 * @return same as lookup_setup
310 */
311
312INT add_setup(PSZ name)
313{
314 return lookup_setup(name, LS_ADD);
315}
316
317/**
318 * Delete named state from setups list
319 * @return same as lookup_setup
320 */
321
322INT remove_setup(PSZ name)
323{
324 return lookup_setup(name, LS_DELETE);
325}
326
327#ifdef FORTIFY
328
329VOID free_setups(VOID)
330{
331 LINKDIRS *pld = pFirstSetup;
332 while (pld) {
333 LINKDIRS *next = pld->next;
334 free(pld->path);
335 free(pld);
336 pld = next;
337 }
338 pFirstSetup = NULL;
339}
340
341#endif // FORTIFY
342
343VOID load_udirs(VOID)
344{
345 /* load linked list of user directories from USERDIRS.DAT file */
346
347 FILE *fp;
348 LINKDIRS *info;
349 LINKDIRS *last = NULL;
350 CHAR s[CCHMAXPATH + 24];
351
352 if (udirhead)
353 free_udirs();
354 loadedudirs = TRUE;
355 fUdirsChanged = FALSE;
356 save_dir2(s);
357 if (s[strlen(s) - 1] != '\\')
358 strcat(s, "\\");
359 strcat(s, "USERDIRS.DAT");
360 fp = _fsopen(s, "r", SH_DENYWR);
361 if (fp) {
362 while (!feof(fp)) {
363 if (!xfgets(s, CCHMAXPATH + 24, fp, pszSrcFile, __LINE__))
364 break;
365 s[CCHMAXPATH] = 0;
366 bstripcr(s);
367 if (*s && *s != ';') {
368 info = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
369# ifdef FORTIFY
370 Fortify_SetOwner(info, 1);
371 Fortify_SetScope(info, 1);
372# endif
373 if (info) {
374 info->path = xstrdup(s, pszSrcFile, __LINE__);
375 if (!info->path)
376 free(info);
377 else {
378# ifdef FORTIFY
379 Fortify_SetOwner(info->path, 1);
380 Fortify_SetScope(info->path, 1);
381# endif
382 info->next = NULL;
383 if (!udirhead)
384 udirhead = info;
385 else
386 last->next = info;
387 last = info;
388 }
389 }
390 }
391 }
392 fclose(fp);
393 }
394}
395
396VOID save_udirs(VOID)
397{
398 FILE *fp;
399 LINKDIRS *info;
400 CHAR s[CCHMAXPATH + 14];
401
402 if (loadedudirs) {
403 fUdirsChanged = FALSE;
404 if (udirhead) {
405 save_dir2(s);
406 if (s[strlen(s) - 1] != '\\')
407 strcat(s, "\\");
408 strcat(s, "USERDIRS.DAT");
409 fp = xfopen(s, "w", pszSrcFile, __LINE__);
410 if (fp) {
411 fputs(GetPString(IDS_USERDEFDIRSTEXT), fp);
412 info = udirhead;
413 while (info) {
414 fprintf(fp, "%0.*s\n", CCHMAXPATH, info->path);
415 info = info->next;
416 }
417 fclose(fp);
418 }
419 }
420 }
421}
422
423/**
424 * Add path to user directory list or last used directory list.
425 * Callers need to check fUdirsChanged to know if user dirs change occured.
426 * Callers need to check return code to know if last dirs change occured.
427 * @param userdirs TRUE to process user directory list. Otherwise last used list.
428 * @return TRUE if added, FALSE if already in list or error.
429 */
430
431BOOL add_udir(BOOL userdirs, CHAR *inpath)
432{
433 CHAR path[CCHMAXPATH];
434 LINKDIRS *info;
435 LINKDIRS *last = NULL;
436 LINKDIRS *temp;
437
438 if (inpath && *inpath) {
439 if (DosQueryPathInfo(inpath, FIL_QUERYFULLNAME, path, sizeof(path)))
440 strcpy(path, inpath);
441 if (!userdirs && IsRoot(path))
442 return FALSE;
443 if (IsFullName(path)) {
444 if (!loadedudirs)
445 load_udirs();
446 // Search user dir list first unless doing last dirs
447 info = userdirs ? udirhead : ldirhead;
448 while (info) {
449 if (!stricmp(info->path, path))
450 return FALSE; // Already in list
451 last = info; // Remember append to location
452 info = info->next;
453 }
454 // Search last dir list unless doing just last dirs
455 if (!userdirs) {
456 info = udirhead;
457 while (info) {
458 if (!stricmp(info->path, path))
459 return FALSE;
460 info = info->next;
461 }
462 }
463 else {
464 /* if adding manual directory, remove from auto list if present */
465 info = ldirhead;
466 temp = NULL;
467 while (info) {
468 if (!stricmp(info->path, path)) {
469 if (temp)
470 temp->next = info->next;
471 else
472 ldirhead = info->next;
473 xfree(info->path, pszSrcFile, __LINE__);
474 free(info);
475 break;
476 }
477 temp = info;
478 info = info->next;
479 }
480 }
481 // Append entry to end of user dirs list
482 info = xmalloc(sizeof(LINKDIRS), pszSrcFile, __LINE__);
483 if (info) {
484# ifdef FORTIFY
485 Fortify_SetScope(info, 1);
486# endif
487 info->path = xstrdup(path, pszSrcFile, __LINE__);
488 if (!info->path)
489 free(info);
490 else {
491# ifdef FORTIFY
492 Fortify_SetScope(info->path, 1);
493# endif
494 info->next = NULL;
495 if (userdirs) {
496 fUdirsChanged = TRUE;
497 if (!udirhead)
498 udirhead = info;
499 else
500 last->next = info;
501 }
502 else {
503 if (!ldirhead)
504 ldirhead = info;
505 else
506 last->next = info;
507 }
508 return TRUE;
509 }
510 }
511 }
512 }
513 return FALSE;
514}
515
516//=== remove_udir - remove path from user dir list or last directory list ===
517
518BOOL remove_udir(CHAR * path)
519{
520 LINKDIRS *info;
521 LINKDIRS *last = NULL;
522
523 if (path && *path) {
524 if (!loadedudirs)
525 load_udirs();
526 info = udirhead;
527 while (info) {
528 if (!stricmp(info->path, path)) {
529 if (last)
530 last->next = info->next;
531 else
532 udirhead = info->next;
533 xfree(info->path, pszSrcFile, __LINE__);
534 free(info);
535 fUdirsChanged = TRUE;
536 return TRUE;
537 }
538 last = info;
539 info = info->next;
540 }
541
542 info = ldirhead;
543 last = NULL;
544 while (info) {
545 if (!stricmp(info->path, path)) {
546 if (last)
547 last->next = info->next;
548 else
549 ldirhead = info->next;
550 xfree(info->path, pszSrcFile, __LINE__);
551 free(info);
552 return TRUE;
553 }
554 last = info;
555 info = info->next;
556 }
557 }
558 return FALSE;
559}
560
561BOOL remove_ldir(CHAR * path)
562{
563 LINKDIRS *info;
564 LINKDIRS *last = NULL;
565
566 if (path && *path) {
567 info = ldirhead;
568 while (info) {
569 if (!stricmp(info->path, path)) {
570 if (last)
571 last->next = info->next;
572 else
573 ldirhead = info->next;
574 xfree(info->path, pszSrcFile, __LINE__);
575 free(info);
576 return TRUE;
577 }
578 last = info;
579 info = info->next;
580 }
581 }
582 return FALSE;
583}
584
585VOID free_ldir(VOID)
586{
587 LINKDIRS *info, *next;
588
589 info = ldirhead;
590 while (info) {
591 next = info->next;
592 xfree(info->path, pszSrcFile, __LINE__);
593 free(info);
594 info = next;
595 }
596 ldirhead = NULL;
597}
598
599VOID free_udirs(VOID)
600{
601 LINKDIRS *info, *next;
602
603 info = udirhead;
604 while (info) {
605 next = info->next;
606 xfree(info->path, pszSrcFile, __LINE__);
607 free(info);
608 info = next;
609 }
610 udirhead = NULL;
611}
612
613VOID FillPathListBox(HWND hwnd, HWND hwnddrive, HWND hwnddir, CHAR * pszPath,
614 BOOL nounwriteable)
615{
616 /*
617 * this function fills one or two list boxes with drive and directory
618 * information showing all available drives and all directories off of
619 * the directory represented by path. This works independently of the
620 * current directory.
621 */
622
623 CHAR szDrive[] = " :", szTemp[1032];
624 FILEFINDBUF3 findbuf;
625 HDIR hDir = HDIR_CREATE;
626 SHORT sDrive;
627 ULONG ulDriveNum, ulSearchCount = 1, ulDriveMap;
628
629 DosError(FERR_DISABLEHARDERR);
630 DosQCurDisk(&ulDriveNum, &ulDriveMap);
631 if (hwnddrive)
632 WinSendMsg(hwnddrive, LM_DELETEALL, MPVOID, MPVOID);
633 if (hwnddrive != hwnddir && hwnddir)
634 WinSendMsg(hwnddir, LM_DELETEALL, MPVOID, MPVOID);
635
636 if (hwnddrive) {
637 // Fill drive listbox
638 for (sDrive = 0; sDrive < 26; sDrive++) {
639 if (ulDriveMap & (1 << sDrive)) {
640 *szDrive = (CHAR) (sDrive + 'A');
641 if ((!nounwriteable || !(driveflags[sDrive] & DRIVE_NOTWRITEABLE)) &&
642 !(driveflags[sDrive] & (DRIVE_IGNORE | DRIVE_INVALID)))
643 WinSendMsg(hwnddrive, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0),
644 MPFROMP(szDrive));
645 }
646 }
647 if (hwnddrive != hwnddir && pszPath && isalpha(*pszPath)
648 && pszPath[1] == ':') {
649 *szDrive = toupper(*pszPath);
650 WinSetWindowText(hwnddrive, szDrive);
651 }
652 }
653
654 if (hwnddir) {
655 // Fill directory listbox
656 sprintf(szTemp,
657 "%s%s*",
658 pszPath, (pszPath[strlen(pszPath) - 1] == '\\') ? "" : "\\");
659 DosError(FERR_DISABLEHARDERR);
660 if (!DosFindFirst(szTemp,
661 &hDir,
662 FILE_DIRECTORY | MUST_HAVE_DIRECTORY |
663 FILE_READONLY | FILE_ARCHIVED | FILE_SYSTEM |
664 FILE_HIDDEN,
665 &findbuf,
666 sizeof(FILEFINDBUF3), &ulSearchCount, FIL_STANDARD)) {
667 do {
668 if (findbuf.attrFile & FILE_DIRECTORY) {
669 // Skip .. unless full path supplied
670 if (strcmp(findbuf.achName, "..") ||
671 strlen(pszPath) > 3 || pszPath[1] != ':') {
672 // Skip . allow ..
673 if (findbuf.achName[0] != '.' || findbuf.achName[1]) {
674 WinSendMsg(hwnddir,
675 LM_INSERTITEM,
676 MPFROM2SHORT(LIT_SORTASCENDING, 0),
677 MPFROMP(findbuf.achName));
678 }
679 }
680 }
681 ulSearchCount = 1;
682 } while (!DosFindNext(hDir,
683 &findbuf, sizeof(FILEFINDBUF3), &ulSearchCount));
684 DosFindClose(hDir);
685 }
686 DosError(FERR_DISABLEHARDERR);
687 }
688}
689
690MRESULT EXPENTRY TextSubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
691{
692 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
693
694 switch (msg) {
695 case WM_CHAR:
696 if (SHORT1FROMMP(mp1) & KC_KEYUP) {
697 if ((SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
698 (SHORT1FROMMP(mp2) & 255) == '\r')
699 PostMsg(WinQueryWindow(hwnd, QW_PARENT), WM_COMMAND,
700 MPFROM2SHORT(DID_OK, 0), MPVOID);
701 }
702 break;
703 }
704 return oldproc(hwnd, msg, mp1, mp2);
705}
706
707MRESULT EXPENTRY WalkDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
708{
709 WALKER *wa;
710 CHAR szBuff[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1], *p;
711 SHORT sSelect;
712 static BOOL okay; /* avoid combobox selecting as filled */
713 static CHAR lastdir[CCHMAXPATH + 1];
714
715 switch (msg) {
716 case UM_SETUP2:
717 case WM_INITDLG:
718 okay = FALSE;
719 *lastdir = 0;
720 if (!mp2) {
721 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
722 WinDismissDlg(hwnd, 0);
723 break;
724 }
725 wa = xmallocz(sizeof(WALKER), pszSrcFile, __LINE__);
726 if (!wa) {
727 WinDismissDlg(hwnd, 0);
728 break;
729 }
730 wa->size = (USHORT) sizeof(WALKER);
731 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) wa);
732 wa->szReturnPath = (CHAR *)mp2;
733 {
734 PFNWP oldproc;
735
736 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, WALK_PATH),
737 (PFNWP) TextSubProc);
738 if (oldproc)
739 WinSetWindowPtr(WinWindowFromID(hwnd, WALK_PATH),
740 QWL_USER, (PVOID) oldproc);
741 WinSendDlgItemMsg(WinWindowFromID(hwnd, WALK_RECENT),
742 CBID_EDIT,
743 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
744 WinSendDlgItemMsg(WinWindowFromID(hwnd, WALK_RECENT),
745 CBID_EDIT,
746 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
747 }
748 {
749 SWP swp;
750 ULONG size = sizeof(SWP);
751
752 PrfQueryProfileData(fmprof, FM3Str, "WalkDir.Position", (PVOID) &swp, &size);
753 WinSetWindowPos(hwnd,
754 HWND_TOP,
755 swp.x,
756 swp.y,
757 swp.cx,
758 swp.cy,
759 swp.fl);
760 }
761 PosOverOkay(hwnd);
762 if (msg == UM_SETUP2)
763 wa->nounwriteable = FALSE;
764 else
765 wa->nounwriteable = TRUE;
766 if (!*wa->szReturnPath)
767 save_dir2(wa->szCurrentPath);
768 else {
769 strcpy(wa->szCurrentPath, wa->szReturnPath);
770 MakeFullName(wa->szCurrentPath);
771 }
772 if (wa->nounwriteable &&
773 (driveflags[toupper(*wa->szCurrentPath) - 'A'] &
774 DRIVE_NOTWRITEABLE)) {
775
776 ULONG bd;
777
778 strcpy(wa->szCurrentPath, "C:\\");
779 if (DosQuerySysInfo(QSV_BOOT_DRIVE,
780 QSV_BOOT_DRIVE,
781 (PVOID) & bd, (ULONG) sizeof(ULONG)))
782 bd = 3;
783 *wa->szCurrentPath = (CHAR) bd + '@';
784 }
785 WinSendDlgItemMsg(hwnd,
786 WALK_PATH,
787 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
788 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
789 if (!loadedudirs)
790 load_udirs();
791 { /* fill user list box */
792 ULONG ulDriveNum, ulDriveMap;
793 ULONG ulSearchCount;
794 FILEFINDBUF3 findbuf;
795 HDIR hDir;
796 APIRET rc;
797 LINKDIRS *info, *temp;
798
799 DosError(FERR_DISABLEHARDERR);
800 DosQCurDisk(&ulDriveNum, &ulDriveMap);
801 info = udirhead;
802 while (info) {
803 if (IsFullName(info->path) &&
804 !(driveflags[toupper(*info->path) - 'A'] &
805 (DRIVE_IGNORE | DRIVE_INVALID))) {
806 DosError(FERR_DISABLEHARDERR);
807 hDir = HDIR_CREATE;
808 ulSearchCount = 1;
809 if (!IsRoot(info->path))
810 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
811 MUST_HAVE_DIRECTORY | FILE_READONLY |
812 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
813 &findbuf, sizeof(FILEFINDBUF3),
814 &ulSearchCount, FIL_STANDARD);
815 else {
816 rc = 0;
817 findbuf.attrFile = FILE_DIRECTORY;
818 }
819 if (!rc) {
820 if (!IsRoot(info->path))
821 DosFindClose(hDir);
822 if (findbuf.attrFile & FILE_DIRECTORY)
823 WinSendDlgItemMsg(hwnd, WALK_USERLIST, LM_INSERTITEM,
824 MPFROM2SHORT(LIT_SORTASCENDING, 0),
825 MPFROMP(info->path));
826 else {
827 temp = info->next;
828 remove_udir(info->path);
829 info = temp;
830 continue;
831 }
832 }
833 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
834 temp = info->next;
835 remove_udir(info->path);
836 info = temp;
837 continue;
838 }
839 }
840 info = info->next;
841 }
842 info = ldirhead;
843 while (info) {
844 if (IsFullName(info->path) &&
845 !(driveflags[toupper(*info->path) - 'A'] &
846 (DRIVE_IGNORE | DRIVE_INVALID))) {
847 DosError(FERR_DISABLEHARDERR);
848 hDir = HDIR_CREATE;
849 ulSearchCount = 1;
850 if (!IsRoot(info->path))
851 rc = DosFindFirst(info->path, &hDir, FILE_DIRECTORY |
852 MUST_HAVE_DIRECTORY | FILE_READONLY |
853 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
854 &findbuf, sizeof(FILEFINDBUF3),
855 &ulSearchCount, FIL_STANDARD);
856 else {
857 rc = 0;
858 findbuf.attrFile = FILE_DIRECTORY;
859 }
860 if (!rc) {
861 if (!IsRoot(info->path))
862 DosFindClose(hDir);
863 if (findbuf.attrFile & FILE_DIRECTORY)
864 WinSendDlgItemMsg(hwnd, WALK_RECENT, LM_INSERTITEM,
865 MPFROM2SHORT(LIT_SORTASCENDING, 0),
866 MPFROMP(info->path));
867 else {
868 temp = info->next;
869 remove_ldir(info->path);
870 info = temp;
871 continue;
872 }
873 WinSetDlgItemText(hwnd, WALK_RECENT,
874 GetPString(IDS_WALKRECENTDIRSTEXT));
875 }
876 else if (!(ulDriveMap & (1 << (toupper(*info->path) - 'A')))) {
877 temp = info->next;
878 remove_ldir(info->path);
879 info = temp;
880 continue;
881 }
882 }
883 info = info->next;
884 }
885 }
886 FillPathListBox(hwnd,
887 WinWindowFromID(hwnd, WALK_DRIVELIST),
888 WinWindowFromID(hwnd, WALK_DIRLIST),
889 wa->szCurrentPath, wa->nounwriteable);
890 if (!PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID))
891 okay = TRUE;
892 {
893 MRESULT ret;
894
895 ret = WinDefDlgProc(hwnd, WM_INITDLG, mp1, mp2);
896 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
897 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
898 return ret;
899 }
900
901 case UM_SETUP4:
902 okay = TRUE;
903 return 0;
904
905 case WM_ADJUSTWINDOWPOS:
906 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
907 break;
908
909 case UM_SETDIR:
910 PaintRecessedWindow(WinWindowFromID(hwnd, WALK_HELP), (HPS) 0, FALSE,
911 TRUE);
912 return 0;
913
914 case WM_PRESPARAMCHANGED:
915 {
916 ULONG AttrFound, AttrValue[64], cbRetLen;
917
918 cbRetLen = WinQueryPresParam(hwnd, (ULONG) mp1, 0, &AttrFound,
919 (ULONG) sizeof(AttrValue), &AttrValue, 0);
920 if (cbRetLen) {
921 switch (AttrFound) {
922 case PP_FONTNAMESIZE:
923 PrfWriteProfileData(fmprof,
924 appname,
925 "WalkFont", (PVOID) AttrValue, cbRetLen);
926 *WalkFont = 0;
927 WalkFontSize = sizeof(WalkFont);
928 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
929 break;
930 }
931 }
932 }
933 break;
934
935 case UM_SETUP3:
936 save_udirs();
937 if (hwndMain)
938 PostMsg(hwndMain, UM_FILLUSERLIST, MPVOID, MPVOID);
939 return 0;
940
941 case UM_SETUP:
942 {
943 INT x;
944 USHORT id[] = { WALK_PATH, WALK_DIRLIST, WALK_USERLIST,
945 WALK_RECENT, 0
946 };
947
948 if (*WalkFont ||
949 (PrfQueryProfileData(fmprof,
950 appname,
951 "WalkFont",
952 (PVOID) WalkFont,
953 &WalkFontSize) && WalkFontSize)) {
954 for (x = 0; id[x]; x++)
955 WinSetPresParam(WinWindowFromID(hwnd, id[x]),
956 PP_FONTNAMESIZE, WalkFontSize, (PVOID) WalkFont);
957 }
958 }
959 return 0;
960
961 case UM_CONTROL:
962 case WM_CONTROL:
963 wa = WinQueryWindowPtr(hwnd, QWL_USER);
964 if (SHORT1FROMMP(mp1) == WALK_DRIVELIST ||
965 SHORT1FROMMP(mp1) == WALK_DIRLIST ||
966 SHORT1FROMMP(mp1) == WALK_USERLIST ||
967 SHORT1FROMMP(mp1) == WALK_RECENT) {
968 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
969 SHORT1FROMMP(mp1),
970 LM_QUERYSELECTION, MPVOID, MPVOID);
971 *szBuffer = 0;
972 if (sSelect >= 0)
973 WinSendDlgItemMsg(hwnd, SHORT1FROMMP(mp1), LM_QUERYITEMTEXT,
974 MPFROM2SHORT(sSelect, CCHMAXPATH),
975 MPFROMP(szBuffer));
976 }
977 switch (SHORT1FROMMP(mp1)) {
978 case WALK_PATH:
979 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
980 WinSetDlgItemText(hwnd, WALK_HELP, GetPString(IDS_WALKCURRDIRTEXT));
981 else if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
982 WinSetDlgItemText(hwnd, WALK_HELP,
983 GetPString(IDS_WALKDEFAULTHELPTEXT));
984 break;
985
986 case WALK_RECENT:
987 if (okay && SHORT2FROMMP(mp1) == CBN_LBSELECT) {
988
989 ULONG ulSearchCount;
990 FILEFINDBUF3 findbuf;
991 HDIR hDir;
992 APIRET rc;
993
994 // *szBuffer = 0;
995 // WinQueryDlgItemText(hwnd,WALK_RECENT,CCHMAXPATH,szBuffer);
996 if (!*szBuffer)
997 break;
998 DosError(FERR_DISABLEHARDERR);
999 hDir = HDIR_CREATE;
1000 ulSearchCount = 1;
1001 if (!IsRoot(szBuffer)) {
1002 rc = DosFindFirst(szBuffer, &hDir, FILE_DIRECTORY |
1003 MUST_HAVE_DIRECTORY | FILE_READONLY |
1004 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1005 &findbuf, sizeof(FILEFINDBUF3),
1006 &ulSearchCount, FIL_STANDARD);
1007 if (!rc)
1008 DosFindClose(hDir);
1009 }
1010 else {
1011 findbuf.attrFile = FILE_DIRECTORY;
1012 rc = 0;
1013 }
1014 if (rc)
1015 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
1016 "xDosFindFirst");
1017 else if (~findbuf.attrFile & FILE_DIRECTORY)
1018 Runtime_Error(pszSrcFile, __LINE__, "not a directory");
1019 else {
1020 strcpy(wa->szCurrentPath, szBuffer);
1021 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1022 WinSetDlgItemText(hwnd, WALK_RECENT, wa->szCurrentPath);
1023 FillPathListBox(hwnd,
1024 WinWindowFromID(hwnd, WALK_DRIVELIST),
1025 WinWindowFromID(hwnd, WALK_DIRLIST),
1026 wa->szCurrentPath, FALSE);
1027 }
1028 }
1029 else if (SHORT2FROMMP(mp1) == CBN_ENTER)
1030 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
1031 else if (SHORT2FROMMP(mp1) == CBN_SHOWLIST)
1032 WinSetDlgItemText(hwnd, WALK_HELP,
1033 GetPString(IDS_WALKRECENTDIRSHELPTEXT));
1034 break;
1035
1036 case WALK_USERLIST:
1037 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_SELECT) {
1038
1039 ULONG ulSearchCount;
1040 FILEFINDBUF3 findbuf;
1041 HDIR hDir;
1042 APIRET rc;
1043
1044 DosError(FERR_DISABLEHARDERR);
1045 hDir = HDIR_CREATE;
1046 ulSearchCount = 1;
1047 if (!IsRoot(szBuffer)) {
1048 rc = DosFindFirst(szBuffer,
1049 &hDir,
1050 FILE_DIRECTORY |
1051 MUST_HAVE_DIRECTORY | FILE_READONLY |
1052 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1053 &findbuf,
1054 sizeof(FILEFINDBUF3),
1055 &ulSearchCount, FIL_STANDARD);
1056 if (!rc)
1057 DosFindClose(hDir);
1058 }
1059 else {
1060 findbuf.attrFile = FILE_DIRECTORY;
1061 rc = 0;
1062 }
1063 if (rc)
1064 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
1065 "xDosFindFirst");
1066 else if (~findbuf.attrFile & FILE_DIRECTORY)
1067 Runtime_Error(pszSrcFile, __LINE__, "not a directory");
1068 else {
1069 strcpy(wa->szCurrentPath, szBuffer);
1070 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1071 FillPathListBox(hwnd,
1072 WinWindowFromID(hwnd, WALK_DRIVELIST),
1073 WinWindowFromID(hwnd, WALK_DIRLIST),
1074 wa->szCurrentPath, FALSE);
1075 }
1076 }
1077 else if (SHORT2FROMMP(mp1) == LN_ENTER)
1078 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
1079 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
1080 WinSetDlgItemText(hwnd,
1081 WALK_HELP, GetPString(IDS_WALKUSERDIRSHELPTEXT));
1082 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
1083 WinSetDlgItemText(hwnd,
1084 WALK_HELP, GetPString(IDS_WALKDEFAULTHELPTEXT));
1085 break;
1086
1087 case WALK_DRIVELIST:
1088 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) {
1089
1090 ULONG ulDirLen = CCHMAXPATH;
1091 APIRET rc;
1092
1093 rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3], &ulDirLen);
1094 if (!rc) {
1095 strcpy(wa->szCurrentPath, "C:\\");
1096 *wa->szCurrentPath = toupper(*szBuffer);
1097 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1098 FillPathListBox(hwnd,
1099 WinWindowFromID(hwnd, WALK_DRIVELIST),
1100 WinWindowFromID(hwnd, WALK_DIRLIST),
1101 wa->szCurrentPath, FALSE);
1102 }
1103 }
1104 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
1105 WinSetDlgItemText(hwnd, WALK_HELP,
1106 GetPString(IDS_WALKDRIVELISTHELPTEXT));
1107 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
1108 WinSetDlgItemText(hwnd, WALK_HELP,
1109 GetPString(IDS_WALKDEFAULTHELPTEXT));
1110 break;
1111
1112 case WALK_DIRLIST:
1113 if (okay && SHORT2FROMMP(mp1) == LN_ENTER) {
1114
1115 ULONG ulSearchCount;
1116 FILEFINDBUF3 findbuf;
1117 HDIR hDir;
1118 APIRET rc;
1119
1120 bstrip(szBuffer);
1121 if (*szBuffer) {
1122 strcpy(szBuff, wa->szCurrentPath);
1123 if (szBuff[strlen(szBuff) - 1] != '\\')
1124 strcat(szBuff, "\\");
1125 strcat(szBuff, szBuffer);
1126 MakeFullName(szBuff);
1127 DosError(FERR_DISABLEHARDERR);
1128 hDir = HDIR_CREATE;
1129 ulSearchCount = 1;
1130 if (!IsRoot(szBuff)) {
1131 rc = DosFindFirst(szBuff,
1132 &hDir,
1133 FILE_DIRECTORY |
1134 MUST_HAVE_DIRECTORY | FILE_READONLY |
1135 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1136 &findbuf,
1137 sizeof(FILEFINDBUF3),
1138 &ulSearchCount, FIL_STANDARD);
1139 if (!rc)
1140 DosFindClose(hDir);
1141 }
1142 else {
1143 findbuf.attrFile = FILE_DIRECTORY;
1144 rc = 0;
1145 }
1146 if (!rc && (findbuf.attrFile & FILE_DIRECTORY)) {
1147 strcpy(wa->szCurrentPath, szBuff);
1148 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1149 FillPathListBox(hwnd,
1150 WinWindowFromID(hwnd, WALK_DRIVELIST),
1151 WinWindowFromID(hwnd, WALK_DIRLIST),
1152 wa->szCurrentPath, FALSE);
1153 }
1154 }
1155 }
1156 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
1157 WinSetDlgItemText(hwnd, WALK_HELP,
1158 GetPString(IDS_WALKDIRLISTHELPTEXT));
1159 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
1160 WinSetDlgItemText(hwnd, WALK_HELP,
1161 GetPString(IDS_WALKDEFAULTHELPTEXT));
1162 break;
1163 }
1164 return 0;
1165
1166 case WM_COMMAND:
1167 wa = WinQueryWindowPtr(hwnd, QWL_USER);
1168 if (!wa)
1169 WinDismissDlg(hwnd, 0);
1170 *szBuff = 0;
1171 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1172 bstrip(szBuff);
1173 while ((p = strchr(szBuff, '/')) != NULL)
1174 *p = '\\';
1175 while (strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\')
1176 szBuff[strlen(szBuff) - 1] = 0;
1177 MakeFullName(szBuff);
1178 if (*szBuff && stricmp(szBuff, wa->szCurrentPath) && SHORT1FROMMP(mp1) != DID_CANCEL) {
1179 if (!SetDir(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT),
1180 QW_OWNER), hwnd, szBuff, 0))
1181 strcpy(wa->szCurrentPath, szBuff);
1182 else
1183 return 0;
1184 }
1185 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath);
1186 switch (SHORT1FROMMP(mp1)) {
1187 case WALK_ADD:
1188 *szBuff = 0;
1189 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1190 bstrip(szBuff);
1191 while ((p = strchr(szBuff, '/')) != NULL)
1192 *p = '\\';
1193 if (*szBuff && !IsFile(szBuff)) {
1194 MakeFullName(szBuff);
1195 add_udir(TRUE, szBuff);
1196 if (fUdirsChanged) {
1197 WinSendDlgItemMsg(hwnd,
1198 WALK_USERLIST,
1199 LM_INSERTITEM,
1200 MPFROM2SHORT(LIT_SORTASCENDING, 0),
1201 MPFROMP(szBuff));
1202 wa->changed = 1;
1203 }
1204 }
1205 break;
1206
1207 case WALK_DELETE:
1208 *szBuff = 0;
1209 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1210 bstrip(szBuff);
1211 while ((p = strchr(szBuff, '/')) != NULL)
1212 *p = '\\';
1213 if (*szBuff && !IsFile(szBuff)) {
1214 MakeFullName(szBuff);
1215 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
1216 WALK_USERLIST,
1217 LM_SEARCHSTRING,
1218 MPFROM2SHORT(0, LIT_FIRST),
1219 MPFROMP(szBuff));
1220 if (sSelect >= 0) {
1221 WinSendDlgItemMsg(hwnd,
1222 WALK_USERLIST,
1223 LM_DELETEITEM, MPFROM2SHORT(sSelect, 0), MPVOID);
1224 remove_udir(szBuff);
1225 wa->changed = 1;
1226 }
1227 }
1228 break;
1229
1230 case DID_OK:
1231 if (*wa->szCurrentPath) {
1232 strcpy(wa->szReturnPath, wa->szCurrentPath);
1233 MakeValidDir(wa->szReturnPath);
1234 if (fAutoAddAllDirs)
1235 add_udir(FALSE, wa->szReturnPath);
1236 if (fChangeTarget) {
1237 strcpy(targetdir, wa->szReturnPath);
1238 PrfWriteProfileString(fmprof, appname, "Targetdir", targetdir);
1239 }
1240 }
1241 {
1242 SWP swp;
1243 ULONG size = sizeof(SWP);
1244
1245 WinQueryWindowPos(hwnd, &swp);
1246 PrfWriteProfileData(fmprof, FM3Str, "WalkDir.Position", (PVOID) &swp,
1247 size);
1248 }
1249 if (wa->changed)
1250 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
1251 WinDismissDlg(hwnd, 1);
1252 break;
1253
1254 case IDM_HELP:
1255 if (hwndHelp)
1256 WinSendMsg(hwndHelp,
1257 HM_DISPLAY_HELP,
1258 MPFROM2SHORT(HELP_WALKEM, 0), MPFROMSHORT(HM_RESOURCEID));
1259 break;
1260
1261 case DID_CANCEL:
1262 {
1263 SWP swp;
1264 ULONG size = sizeof(SWP);
1265
1266 WinQueryWindowPos(hwnd, &swp);
1267 PrfWriteProfileData(fmprof, FM3Str, "WalkDir.Position", (PVOID) &swp,
1268 size);
1269 }
1270 if (wa->changed)
1271 WinSendMsg(hwnd, UM_SETUP3, MPVOID, MPVOID);
1272 free(wa);
1273 WinDismissDlg(hwnd, 0);
1274 break;
1275 }
1276 return 0;
1277
1278 case WM_CLOSE:
1279 break;
1280 }
1281 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1282}
1283
1284MRESULT EXPENTRY WalkAllDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1285{
1286 switch (msg) {
1287 case WM_INITDLG:
1288 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1289 }
1290 return WalkDlgProc(hwnd, msg, mp1, mp2);
1291}
1292
1293MRESULT EXPENTRY WalkCopyDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1294{
1295 switch (msg) {
1296 case WM_INITDLG:
1297 WinSetWindowText(hwnd, GetPString(IDS_WALKCOPYDLGTEXT));
1298 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1299 }
1300 return WalkDlgProc(hwnd, msg, mp1, mp2);
1301}
1302
1303MRESULT EXPENTRY WalkMoveDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1304{
1305 switch (msg) {
1306 case WM_INITDLG:
1307 WinSetWindowText(hwnd, GetPString(IDS_WALKMOVEDLGTEXT));
1308 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1309 }
1310 return WalkDlgProc(hwnd, msg, mp1, mp2);
1311}
1312
1313MRESULT EXPENTRY WalkExtractDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1314 MPARAM mp2)
1315{
1316 switch (msg) {
1317 case WM_INITDLG:
1318 WinSetWindowText(hwnd, GetPString(IDS_WALKEXTRACTDLGTEXT));
1319 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1320 }
1321 return WalkDlgProc(hwnd, msg, mp1, mp2);
1322}
1323
1324MRESULT EXPENTRY WalkTargetDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1325 MPARAM mp2)
1326{
1327 switch (msg) {
1328 case WM_INITDLG:
1329 {
1330 char s[CCHMAXPATH + 32];
1331
1332 sprintf(s,
1333 GetPString(IDS_WALKTARGETDLGTEXT),
1334 (*targetdir) ?
1335 NullStr :
1336 " (",
1337 (*targetdir) ?
1338 NullStr : GetPString(IDS_NONE), (*targetdir) ? NullStr : ")");
1339 WinSetWindowText(hwnd, s);
1340 }
1341 return WalkDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1342 }
1343 return WalkDlgProc(hwnd, msg, mp1, mp2);
1344}
1345
1346MRESULT EXPENTRY WalkTwoDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1347{
1348 WALK2 *wa;
1349 CHAR szBuff[CCHMAXPATH + 1], szBuffer[CCHMAXPATH + 1], *p;
1350 SHORT sSelect;
1351 static BOOL okay; /* avoid combobox selecting as filled */
1352
1353 switch (msg) {
1354 case UM_SETUP2:
1355 case WM_INITDLG:
1356 okay = FALSE;
1357 if (!mp2) {
1358 WinDismissDlg(hwnd, 0);
1359 break;
1360 }
1361 WinSetWindowPtr(hwnd, QWL_USER, mp2);
1362 wa = mp2;
1363 {
1364 PFNWP oldproc;
1365
1366 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, WALK_PATH),
1367 (PFNWP) TextSubProc);
1368 if (oldproc)
1369 WinSetWindowPtr(WinWindowFromID(hwnd, WALK_PATH),
1370 QWL_USER, (PVOID) oldproc);
1371 oldproc = WinSubclassWindow(WinWindowFromID(hwnd, WALK2_PATH),
1372 (PFNWP) TextSubProc);
1373 if (oldproc)
1374 WinSetWindowPtr(WinWindowFromID(hwnd, WALK2_PATH),
1375 QWL_USER, (PVOID) oldproc);
1376 }
1377 {
1378 SWP swp;
1379 ULONG size = sizeof(SWP);
1380
1381 PrfQueryProfileData(fmprof, FM3Str, "WalkDir2.Position", (PVOID) &swp, &size);
1382 WinSetWindowPos(hwnd,
1383 HWND_TOP,
1384 swp.x,
1385 swp.y,
1386 swp.cx,
1387 swp.cy,
1388 swp.fl);
1389 }
1390 if (!*wa->szCurrentPath1)
1391 save_dir2(wa->szCurrentPath1);
1392 MakeFullName(wa->szCurrentPath1);
1393 if (!*wa->szCurrentPath2)
1394 save_dir2(wa->szCurrentPath2);
1395 MakeFullName(wa->szCurrentPath2);
1396 WinSendDlgItemMsg(hwnd,
1397 WALK_PATH,
1398 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1399 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1400 WinSendDlgItemMsg(hwnd, WALK2_PATH, EM_SETTEXTLIMIT,
1401 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
1402 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1403 FillPathListBox(hwnd,
1404 WinWindowFromID(hwnd, WALK_DRIVELIST),
1405 WinWindowFromID(hwnd, WALK_DIRLIST),
1406 wa->szCurrentPath1, FALSE);
1407 FillPathListBox(hwnd,
1408 WinWindowFromID(hwnd, WALK2_DRIVELIST),
1409 WinWindowFromID(hwnd, WALK2_DIRLIST),
1410 wa->szCurrentPath2, FALSE);
1411 if (!PostMsg(hwnd, UM_SETUP4, MPVOID, MPVOID))
1412 okay = TRUE;
1413 {
1414 MRESULT ret;
1415
1416 ret = WinDefDlgProc(hwnd, WM_INITDLG, mp1, mp2);
1417 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
1418 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
1419 WinInvalidateRect(WinWindowFromID(hwnd, WALK2_PATH), NULL, TRUE);
1420 return ret;
1421 }
1422
1423 case UM_SETUP4:
1424 okay = TRUE;
1425 return 0;
1426
1427 case WM_PRESPARAMCHANGED:
1428 {
1429 ULONG AttrFound, AttrValue[64], cbRetLen;
1430
1431 cbRetLen = WinQueryPresParam(hwnd, (ULONG) mp1, 0, &AttrFound,
1432 (ULONG) sizeof(AttrValue), &AttrValue, 0);
1433 if (cbRetLen) {
1434 switch (AttrFound) {
1435 case PP_FONTNAMESIZE:
1436 PrfWriteProfileData(fmprof,
1437 appname,
1438 "WalkFont", (PVOID) AttrValue, cbRetLen);
1439 *WalkFont = 0;
1440 WalkFontSize = sizeof(WalkFont);
1441 WinInvalidateRect(WinWindowFromID(hwnd, WALK_PATH), NULL, TRUE);
1442 break;
1443 }
1444 }
1445 }
1446 break;
1447
1448 case UM_SETUP:
1449 {
1450 INT x;
1451 USHORT id[] = { WALK_PATH, WALK_DIRLIST,
1452 WALK2_PATH, WALK2_DIRLIST, 0
1453 };
1454
1455 if (*WalkFont ||
1456 (PrfQueryProfileData(fmprof,
1457 appname,
1458 "WalkFont",
1459 (PVOID) WalkFont,
1460 &WalkFontSize) && WalkFontSize)) {
1461 for (x = 0; id[x]; x++)
1462 WinSetPresParam(WinWindowFromID(hwnd, id[x]),
1463 PP_FONTNAMESIZE, WalkFontSize, (PVOID) WalkFont);
1464 }
1465 }
1466 return 0;
1467
1468 case UM_CONTROL:
1469 case WM_CONTROL:
1470 wa = WinQueryWindowPtr(hwnd, QWL_USER);
1471 if (SHORT1FROMMP(mp1) == WALK_DRIVELIST ||
1472 SHORT1FROMMP(mp1) == WALK_DIRLIST ||
1473 SHORT1FROMMP(mp1) == WALK2_DRIVELIST ||
1474 SHORT1FROMMP(mp1) == WALK2_DIRLIST) {
1475 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
1476 SHORT1FROMMP(mp1),
1477 LM_QUERYSELECTION, MPVOID, MPVOID);
1478 *szBuffer = 0;
1479 if (sSelect >= 0)
1480 WinSendDlgItemMsg(hwnd, SHORT1FROMMP(mp1), LM_QUERYITEMTEXT,
1481 MPFROM2SHORT(sSelect, CCHMAXPATH),
1482 MPFROMP(szBuffer));
1483 }
1484 switch (SHORT1FROMMP(mp1)) {
1485 case WALK_DRIVELIST:
1486 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) {
1487
1488 ULONG ulDirLen = CCHMAXPATH;
1489 APIRET rc;
1490
1491 rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3], &ulDirLen);
1492 if (!rc) {
1493 strcpy(wa->szCurrentPath1, "C:\\");
1494 *wa->szCurrentPath1 = toupper(*szBuffer);
1495 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1496 FillPathListBox(hwnd,
1497 WinWindowFromID(hwnd, WALK_DRIVELIST),
1498 WinWindowFromID(hwnd, WALK_DIRLIST),
1499 wa->szCurrentPath1, FALSE);
1500 }
1501 }
1502 break;
1503
1504 case WALK_DIRLIST:
1505 if (okay && SHORT2FROMMP(mp1) == LN_ENTER) {
1506
1507 ULONG ulSearchCount;
1508 FILEFINDBUF3 findbuf;
1509 HDIR hDir;
1510 APIRET rc;
1511
1512 bstrip(szBuffer);
1513 if (*szBuffer) {
1514 strcpy(szBuff, wa->szCurrentPath1);
1515 if (szBuff[strlen(szBuff) - 1] != '\\')
1516 strcat(szBuff, "\\");
1517 strcat(szBuff, szBuffer);
1518 MakeFullName(szBuff);
1519 DosError(FERR_DISABLEHARDERR);
1520 hDir = HDIR_CREATE;
1521 ulSearchCount = 1;
1522 if (!IsRoot(szBuff)) {
1523 rc = DosFindFirst(szBuff,
1524 &hDir,
1525 FILE_DIRECTORY |
1526 MUST_HAVE_DIRECTORY | FILE_READONLY |
1527 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1528 &findbuf,
1529 sizeof(FILEFINDBUF3),
1530 &ulSearchCount, FIL_STANDARD);
1531 if (!rc)
1532 DosFindClose(hDir);
1533 }
1534 else {
1535 findbuf.attrFile = FILE_DIRECTORY;
1536 rc = 0;
1537 }
1538 if (!rc && (findbuf.attrFile & FILE_DIRECTORY)) {
1539 strcpy(wa->szCurrentPath1, szBuff);
1540 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1541 FillPathListBox(hwnd,
1542 WinWindowFromID(hwnd, WALK_DRIVELIST),
1543 WinWindowFromID(hwnd, WALK_DIRLIST),
1544 wa->szCurrentPath1, FALSE);
1545 }
1546 }
1547 }
1548 break;
1549
1550 case WALK2_DRIVELIST:
1551 if (okay && *szBuffer && SHORT2FROMMP(mp1) == LN_ENTER) {
1552
1553 ULONG ulDirLen = CCHMAXPATH;
1554 APIRET rc;
1555
1556 rc = DosQCurDir(toupper(*szBuffer) - '@', &szBuff[3], &ulDirLen);
1557 if (!rc) {
1558 strcpy(wa->szCurrentPath2, "C:\\");
1559 *wa->szCurrentPath2 = toupper(*szBuffer);
1560 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1561 FillPathListBox(hwnd,
1562 WinWindowFromID(hwnd, WALK2_DRIVELIST),
1563 WinWindowFromID(hwnd, WALK2_DIRLIST),
1564 wa->szCurrentPath2, FALSE);
1565 }
1566 }
1567 break;
1568
1569 case WALK2_DIRLIST:
1570 if (okay && SHORT2FROMMP(mp1) == LN_ENTER) {
1571
1572 ULONG ulSearchCount;
1573 FILEFINDBUF3 findbuf;
1574 HDIR hDir;
1575 APIRET rc;
1576
1577 bstrip(szBuffer);
1578 if (*szBuffer) {
1579 strcpy(szBuff, wa->szCurrentPath2);
1580 if (szBuff[strlen(szBuff) - 1] != '\\')
1581 strcat(szBuff, "\\");
1582 strcat(szBuff, szBuffer);
1583 MakeFullName(szBuff);
1584 DosError(FERR_DISABLEHARDERR);
1585 hDir = HDIR_CREATE;
1586 ulSearchCount = 1;
1587 if (!IsRoot(szBuff)) {
1588 rc = DosFindFirst(szBuff,
1589 &hDir,
1590 FILE_DIRECTORY |
1591 MUST_HAVE_DIRECTORY | FILE_READONLY |
1592 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
1593 &findbuf,
1594 sizeof(FILEFINDBUF3),
1595 &ulSearchCount, FIL_STANDARD);
1596 if (!rc)
1597 DosFindClose(hDir);
1598 }
1599 else {
1600 findbuf.attrFile = FILE_DIRECTORY;
1601 rc = 0;
1602 }
1603 if (!rc && (findbuf.attrFile & FILE_DIRECTORY)) {
1604 strcpy(wa->szCurrentPath2, szBuff);
1605 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1606 FillPathListBox(hwnd,
1607 WinWindowFromID(hwnd, WALK2_DRIVELIST),
1608 WinWindowFromID(hwnd, WALK2_DIRLIST),
1609 wa->szCurrentPath2, FALSE);
1610 }
1611 }
1612 }
1613 break;
1614 }
1615 return 0;
1616
1617 case WM_COMMAND:
1618 wa = WinQueryWindowPtr(hwnd, QWL_USER);
1619 if (!wa)
1620 WinDismissDlg(hwnd, 0);
1621 *szBuff = 0;
1622 WinQueryDlgItemText(hwnd, WALK_PATH, CCHMAXPATH, szBuff);
1623 bstrip(szBuff);
1624 while ((p = strchr(szBuff, '/')) != NULL)
1625 *p = '\\';
1626 while (strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\')
1627 szBuff[strlen(szBuff) - 1] = 0;
1628 MakeFullName(szBuff);
1629 if (*szBuff && stricmp(szBuff, wa->szCurrentPath1) && SHORT1FROMMP(mp1) != DID_CANCEL) {
1630 if (!SetDir(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT),
1631 QW_OWNER), hwnd, szBuff, 0))
1632 strcpy(wa->szCurrentPath1, szBuff);
1633 else
1634 return 0;
1635 }
1636 WinSetDlgItemText(hwnd, WALK_PATH, wa->szCurrentPath1);
1637 *szBuff = 0;
1638 WinQueryDlgItemText(hwnd, WALK2_PATH, CCHMAXPATH, szBuff);
1639 bstrip(szBuff);
1640 while ((p = strchr(szBuff, '/')) != NULL)
1641 *p = '\\';
1642 while (strlen(szBuff) > 3 && szBuff[strlen(szBuff) - 1] == '\\')
1643 szBuff[strlen(szBuff) - 1] = 0;
1644 MakeFullName(szBuff);
1645 if (*szBuff && stricmp(szBuff, wa->szCurrentPath2) && SHORT1FROMMP(mp1) != DID_CANCEL) {
1646 if (!SetDir(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT),
1647 QW_OWNER), hwnd, szBuff, 0))
1648 strcpy(wa->szCurrentPath2, szBuff);
1649 else
1650 return 0;
1651 }
1652 WinSetDlgItemText(hwnd, WALK2_PATH, wa->szCurrentPath2);
1653 switch (SHORT1FROMMP(mp1)) {
1654 case DID_OK:
1655 {
1656 SWP swp;
1657 ULONG size = sizeof(SWP);
1658
1659 WinQueryWindowPos(hwnd, &swp);
1660 PrfWriteProfileData(fmprof, FM3Str, "WalkDir2.Position", (PVOID) &swp,
1661 size);
1662 }
1663 WinDismissDlg(hwnd, 1);
1664 break;
1665
1666 case IDM_HELP:
1667 if (hwndHelp)
1668 WinSendMsg(hwndHelp,
1669 HM_DISPLAY_HELP,
1670 MPFROM2SHORT(HELP_WALKEM2, 0), MPFROMSHORT(HM_RESOURCEID));
1671 break;
1672
1673 case DID_CANCEL:
1674 {
1675 SWP swp;
1676 ULONG size = sizeof(SWP);
1677
1678 WinQueryWindowPos(hwnd, &swp);
1679 PrfWriteProfileData(fmprof, FM3Str, "WalkDir2.Position", (PVOID) &swp,
1680 size);
1681 }
1682 WinDismissDlg(hwnd, 0);
1683 break;
1684 }
1685 return 0;
1686
1687 case WM_CLOSE:
1688 break;
1689 }
1690 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1691}
1692
1693MRESULT EXPENTRY WalkTwoCmpDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1694 MPARAM mp2)
1695{
1696 switch (msg) {
1697 case WM_INITDLG:
1698 WinSetWindowText(hwnd, GetPString(IDS_WALKCOMPAREDLGTEXT));
1699 return WalkTwoDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1700 }
1701 return WalkTwoDlgProc(hwnd, msg, mp1, mp2);
1702}
1703
1704MRESULT EXPENTRY WalkTwoSetDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
1705 MPARAM mp2)
1706{
1707 switch (msg) {
1708 case WM_INITDLG:
1709 WinSetWindowText(hwnd, GetPString(IDS_WALKSETDIRSDLGTEXT));
1710 return WalkTwoDlgProc(hwnd, UM_SETUP2, mp1, mp2);
1711 }
1712 return WalkTwoDlgProc(hwnd, msg, mp1, mp2);
1713}
1714
1715#pragma alloc_text(WALKER,FillPathListBox,WalkDlgProc,TextSubProc)
1716#pragma alloc_text(WALKER,WalkAllDlgProc,WalkCopyDlgProc)
1717#pragma alloc_text(WALKER,WalkMoveDlgProc,WalkExtractDlgProc,WalkTargetDlgProc)
1718#pragma alloc_text(WALK2,WalkTwoDlgProc,WalkTwoCmpDlgProc,WalkTwoSetDlgProc)
1719#pragma alloc_text(UDIRS,add_udir,remove_udir,remove_ldir,load_udirs)
1720#pragma alloc_text(UDIRS,save_udirs,load_setups,save_setups,add_setups)
1721#pragma alloc_text(UDIRS,remove_setup)
Note: See TracBrowser for help on using the repository browser.