source: trunk/dll/walkem.c@ 1402

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

Remove variable aurgs from docopy & unlinkf (not used); Move more strings to PCSZs and string table; Move PCSZs to compile time initialization; Fix hang on startup caused by a drive scan and a dircnr scan trying to update a drive in the tree at the same time (related to the "treeswitch options); Code cleanup mainly removal of old printfs, SayMsgs, DbgMsg and unneeded %s.

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