source: trunk/dll/walkem.c@ 1010

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

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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