source: trunk/dll/walkem.c@ 1039

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

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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