source: trunk/dll/walkem.c@ 1082

Last change on this file since 1082 was 1082, checked in by Gregg Young, 17 years ago

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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