source: trunk/dll/flesh.c@ 689

Last change on this file since 689 was 574, checked in by Gregg Young, 18 years ago

Use QWL_USER; Replace doesn't move the command and Okay on cmd dialog removed error on unchanged command

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.8 KB
Line 
1
2/***********************************************************************
3
4 $Id: flesh.c 574 2007-03-23 22:37:07Z gyoung $
5
6 Flesh
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005-07 Steven H. Levine
10
11 24 May 05 SHL Rework Win_Error usage
12 25 May 05 SHL Rework for ProcessDirectory
13 28 May 05 SHL Clean while reading code
14 24 Oct 05 SHL Delete obsolete code
15 22 Jul 06 SHL Check more run time errors
16 19 Oct 06 SHL Stubby - correct . and .. detect
17 22 Mar 07 GKY Use QWL_USER
18
19***********************************************************************/
20
21#define INCL_DOS
22#define INCL_DOSERRORS
23#define INCL_WIN
24#include <os2.h>
25
26#include <stdarg.h>
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30#include <ctype.h>
31
32#include "fm3dll.h"
33#include "fm3str.h"
34
35#pragma data_seg(DATA1)
36
37static PSZ pszSrcFile = __FILE__;
38
39#pragma alloc_text(FLESH,Flesh,FleshEnv,Unflesh,Stubby)
40
41BOOL FleshEnv(HWND hwndCnr, PCNRITEM pciParent)
42{
43 PCNRITEM pciL;
44 DIRCNRDATA *dcd;
45 CHAR path[CCHMAXPATH + 12],
46 fullpath[CCHMAXPATH + 12], *env, *p, *pp, *var = NULL;
47
48 if (!pciParent || (INT) pciParent == -1 || !hwndCnr)
49 return FALSE;
50 dcd = (DIRCNRDATA *) WinQueryWindowPtr(hwndCnr, QWL_USER);
51 if (!dcd)
52 return FALSE;
53
54 strcpy(path, pciParent->szFileName + 1);
55 if (stricmp(path, GetPString(IDS_ENVVARSTEXT) + 1))
56 UnFlesh(hwndCnr, pciParent);
57 if (*path) {
58 path[strlen(path) - 1] = 0;
59 if (!stricmp(path, "LIBPATH")) {
60 var = xmalloc(65536, pszSrcFile, __LINE__);
61 if (var)
62 LoadLibPath(var, 65536);
63 env = var;
64 }
65 else
66 env = getenv(path);
67 if (env && *env) {
68 p = env;
69 while (*p) {
70 pp = path;
71 while (*p == ';')
72 p++;
73 while (*p && *p != ';') {
74 *pp = *p;
75 p++;
76 pp++;
77 }
78 *pp = 0;
79 if (*path &&
80 strcmp(path, ".") &&
81 strcmp(path, ".\\") &&
82 strcmp(path, "..") &&
83 strcmp(path, "..\\") &&
84 strncmp(path, ".\\", 2) && strncmp(path, "..\\", 3)) {
85 if (!DosQueryPathInfo(path,
86 FIL_QUERYFULLNAME,
87 fullpath,
88 sizeof(fullpath)) && IsValidDir(fullpath)) {
89 pciL = FindCnrRecord(hwndCnr,
90 fullpath, pciParent, FALSE, FALSE, FALSE);
91 if (pciL) {
92 while (pciL && pciL != (PCNRITEM) - 1 && pciL != pciParent)
93 pciL = WinSendMsg(hwndCnr,
94 CM_QUERYRECORD,
95 MPFROMP(pciL),
96 MPFROM2SHORT(CMA_PARENT, CMA_ITEMORDER));
97 }
98 if (!pciL) {
99
100 RECORDINSERT ri;
101
102 pciL = WinSendMsg(hwndCnr,
103 CM_ALLOCRECORD,
104 MPFROMLONG(EXTRA_RECORD_BYTES2),
105 MPFROMLONG(1));
106 if (pciL) {
107 strcpy(pciL->szFileName, fullpath);
108 pciL->pszFileName = pciL->szFileName;
109 pciL->rc.pszIcon = pciL->pszFileName;
110 if (!fNoIconsDirs &&
111 (!isalpha(*fullpath) ||
112 !(driveflags[toupper(*fullpath) - 'A'] &
113 DRIVE_NOLOADICONS)))
114 pciL->rc.hptrIcon = WinLoadFileIcon(fullpath, FALSE);
115 if (!pciL->rc.hptrIcon)
116 pciL->rc.hptrIcon = hptrDir;
117 pciL->attrFile = FILE_DIRECTORY;
118 strcpy(pciL->szDispAttr, "----D-");
119 pciL->pszDispAttr = pciL->szDispAttr;
120 memset(&ri, 0, sizeof(ri));
121 ri.cb = sizeof(ri);
122 ri.pRecordOrder = (PRECORDCORE) CMA_END;
123 ri.pRecordParent = (PRECORDCORE) pciParent;
124 ri.zOrder = (ULONG) CMA_TOP;
125 ri.cRecordsInsert = 1;
126 ri.fInvalidateRecord = FALSE;
127 if (!WinSendMsg(hwndCnr,
128 CM_INSERTRECORD, MPFROMP(pciL), MPFROMP(&ri)))
129 WinSendMsg(hwndCnr,
130 CM_FREERECORD, MPFROMP(&pciL), MPFROMSHORT(1));
131 }
132 }
133 }
134 }
135 }
136 }
137 if (var)
138 free(var);
139 pciL = (PCNRITEM) WinSendMsg(hwndCnr,
140 CM_QUERYRECORD,
141 MPFROMP(pciParent),
142 MPFROM2SHORT(CMA_FIRSTCHILD, CMA_ITEMORDER));
143 while (pciL && (INT) pciL != -1) {
144 pciL->flags |= (RECFLAGS_NODRAG | RECFLAGS_UNDERENV);
145 WinSendMsg(hwndCnr,
146 CM_INVALIDATERECORD, MPFROMP(&pciL), MPFROM2SHORT(1, 0));
147 pciL = WinSendMsg(hwndCnr,
148 CM_QUERYRECORD,
149 MPFROMP(pciL), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER));
150 }
151 }
152 return TRUE;
153}
154
155BOOL Flesh(HWND hwndCnr, PCNRITEM pciParent)
156{
157 PCNRITEM pciL;
158 DIRCNRDATA *dcd;
159 BOOL includefiles = fFilesInTree;
160
161 if (!pciParent || (INT) pciParent == -1 || !hwndCnr)
162 return FALSE;
163 pciL = (PCNRITEM) WinSendMsg(hwndCnr,
164 CM_QUERYRECORD,
165 MPFROMP(pciParent),
166 MPFROM2SHORT(CMA_FIRSTCHILD, CMA_ITEMORDER));
167 if (!pciL || !*pciL->szFileName) {
168 if (pciL && (INT) pciL != -1) {
169 WinSendMsg(hwndCnr,
170 CM_REMOVERECORD, MPFROMP(&pciL), MPFROM2SHORT(1, CMA_FREE));
171 }
172 dcd = INSTDATA(hwndCnr);
173 if (dcd && dcd->size != sizeof(DIRCNRDATA))
174 dcd = NULL;
175 if (driveflags[toupper(*pciParent->szFileName) - 'A'] &
176 DRIVE_INCLUDEFILES)
177 includefiles = TRUE;
178 ProcessDirectory(hwndCnr,
179 pciParent,
180 pciParent->szFileName,
181 includefiles, TRUE, TRUE, NULL, dcd, NULL, NULL);
182 }
183 return TRUE;
184}
185
186BOOL UnFlesh(HWND hwndCnr, PCNRITEM pciParent)
187{
188 BOOL ret = FALSE;
189 PCNRITEM pciL;
190
191 if (!pciParent || !hwndCnr)
192 return FALSE;
193 for (;;) {
194 pciL = (PCNRITEM) WinSendMsg(hwndCnr,
195 CM_QUERYRECORD,
196 MPFROMP(pciParent),
197 MPFROM2SHORT(CMA_FIRSTCHILD, CMA_ITEMORDER));
198 if (pciL && (INT) pciL != -1) {
199 ret = TRUE;
200 WinSendMsg(hwndCnr,
201 CM_REMOVERECORD, MPFROMP(&pciL), MPFROM2SHORT(1, CMA_FREE));
202 }
203 else
204 break;
205 }
206 if (ret) {
207 WinSendMsg(hwndCnr,
208 CM_INVALIDATERECORD,
209 MPFROMP(&pciParent),
210 MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION));
211 }
212 return ret;
213}
214
215#define DDEPTH 16
216
217BOOL Stubby(HWND hwndCnr, PCNRITEM pciParent)
218{
219 /*
220 * this code is full of workarounds for screwed up LANs.
221 * let's hope all the current LAN programmers fall into
222 * a black hole and make way for people who can get it right...
223 */
224
225 BOOL ret = FALSE;
226 FILEFINDBUF3 ffb[DDEPTH];
227 PFILEFINDBUF3 pffb;
228 HDIR hDir = HDIR_CREATE;
229 ULONG nm, ulM = 1L, total = 0L, fl = MUST_HAVE_DIRECTORY;
230 CHAR str[CCHMAXPATH];
231 register INT len;
232 APIRET rc, prc;
233 BOOL isadir = FALSE, isremote = FALSE, includefiles = fFilesInTree;
234 ULONG ddepth = 3L;
235 static BOOL brokenlan = FALSE, isbroken = FALSE;
236
237 if (!pciParent || !*pciParent->szFileName || !hwndCnr)
238 return FALSE;
239
240 len = strlen(pciParent->szFileName);
241 memcpy(str, pciParent->szFileName, len + 1);
242 if (str[len - 1] != '\\')
243 str[len++] = '\\';
244 str[len++] = '*';
245 str[len] = 0;
246
247 if (!isalpha(*str) || str[1] != ':' || str[2] != '\\')
248 MakeFullName(str);
249
250 if (!isalpha(*str) ||
251 str[1] != ':' ||
252 str[2] != '\\' || ((driveflags[toupper(*str) - 'A'] & DRIVE_IGNORE)))
253 return FALSE;
254
255 if (isalpha(*str) && driveflags[toupper(*str) - 'A'] & DRIVE_INCLUDEFILES)
256 includefiles = TRUE;
257
258 if (!isalpha(*str) ||
259 str[1] != ':' ||
260 str[2] != '\\' || ((driveflags[toupper(*str) - 'A'] & DRIVE_REMOTE)))
261 isremote = TRUE;
262
263 if (isremote) {
264 ddepth = 14;
265 if (fRemoteBug) {
266 if (brokenlan) {
267 ddepth = (ULONG) - 1;
268 ddepth--;
269 }
270 ulM = 1L;
271 }
272 }
273 else if (isbroken)
274 ddepth = 14;
275
276 if (!isremote || !fRemoteBug)
277 ulM = (ddepth < 16L) ? ddepth : 1L;
278
279 nm = ulM;
280
281 DosError(FERR_DISABLEHARDERR);
282 if (includefiles)
283 fl = FILE_DIRECTORY;
284 rc = DosFindFirst(str,
285 &hDir,
286 FILE_NORMAL | fl |
287 FILE_READONLY | FILE_ARCHIVED |
288 FILE_SYSTEM | FILE_HIDDEN,
289 &ffb, ulM * sizeof(FILEFINDBUF3), &nm, FIL_STANDARD);
290 if (ulM == 1L && !rc) {
291 do {
292 pffb = &ffb[0];
293 if (!includefiles && !(pffb->attrFile & FILE_DIRECTORY) && !brokenlan) {
294 brokenlan = TRUE;
295 ddepth = (ULONG) - 1L;
296 ddepth--;
297 if (!NoBrokenNotify) {
298 prc = saymsg(MB_YESNO | MB_ICONEXCLAMATION,
299 HWND_DESKTOP,
300 GetPString(IDS_LANERRORTITLETEXT),
301 GetPString(IDS_LANERRORTEXT));
302 if (prc == MBID_NO) {
303 saymsg(MB_ENTER,
304 HWND_DESKTOP,
305 GetPString(IDS_LANERROR2TITLETEXT),
306 GetPString(IDS_LANERROR2TEXT));
307 NoBrokenNotify = 255L;
308 PrfWriteProfileData(fmprof,
309 FM3Str,
310 "NoBrokenNotify",
311 &NoBrokenNotify, sizeof(ULONG));
312 }
313 }
314 else {
315 NoBrokenNotify--;
316 PrfWriteProfileData(fmprof,
317 FM3Str,
318 "NoBrokenNotify",
319 &NoBrokenNotify, sizeof(ULONG));
320 }
321 }
322 if (*pffb->achName &&
323 (includefiles || (pffb->attrFile & FILE_DIRECTORY)) &&
324 // Skip . and ..
325 (pffb->achName[0] != '.' ||
326 (pffb->achName[1] &&
327 (pffb->achName[1] != '.' || pffb->achName[2])))) {
328 DosFindClose(hDir);
329 isadir = TRUE;
330 goto Interruptus;
331 }
332 nm = 1L;
333 DosError(FERR_DISABLEHARDERR);
334 } while (++total < ddepth && !(rc = (DosFindNext(hDir,
335 &ffb,
336 sizeof(FILEFINDBUF3),
337 &nm))));
338 DosFindClose(hDir);
339 if (toupper(*pciParent->szFileName) > 'B' &&
340 pciParent->szFileName[1] == ':' &&
341 pciParent->szFileName[2] == '\\' && !pciParent->szFileName[3]) {
342
343 CHAR s[132];
344
345 sprintf(s,
346 GetPString(IDS_NOSUBDIRSTEXT),
347 total, toupper(*pciParent->szFileName));
348 if (rc && rc != ERROR_NO_MORE_FILES)
349 sprintf(&s[strlen(s)], GetPString(IDS_SEARCHERRORTEXT), rc, str);
350 else if (ddepth < 16L)
351 brokenlan = TRUE;
352 Notify(s);
353 }
354 goto None;
355 }
356
357 if (!rc) {
358 DosFindClose(hDir);
359 if (nm) {
360
361 register PBYTE fb = (PBYTE) & ffb[0];
362
363 for (len = 0; len < nm; len++) {
364 pffb = (PFILEFINDBUF3) fb;
365 if (!includefiles && !(pffb->attrFile & FILE_DIRECTORY)) {
366 if (!isbroken) {
367 isbroken = TRUE;
368 if (!NoBrokenNotify) {
369 prc = saymsg(MB_YESNO | MB_ICONEXCLAMATION,
370 HWND_DESKTOP,
371 GetPString(IDS_FSDERRORTITLETEXT),
372 GetPString(IDS_FSDERRORTEXT),
373 (isremote) ?
374 GetPString(IDS_REMOTETEXT) :
375 GetPString(IDS_LOCALTEXT), *str);
376 if (prc == MBID_NO) {
377 saymsg(MB_ENTER,
378 HWND_DESKTOP,
379 GetPString(IDS_FSDERROR2TITLETEXT),
380 GetPString(IDS_FSDERROR2TEXT));
381 NoBrokenNotify = 255L;
382 PrfWriteProfileData(fmprof,
383 FM3Str,
384 "NoBrokenNotify",
385 &NoBrokenNotify, sizeof(ULONG));
386 }
387 }
388 else {
389 NoBrokenNotify--;
390 PrfWriteProfileData(fmprof,
391 FM3Str,
392 "NoBrokenNotify",
393 &NoBrokenNotify, sizeof(ULONG));
394 }
395 }
396 }
397 if (*pffb->achName &&
398 (includefiles || (pffb->attrFile & FILE_DIRECTORY)) &&
399 // Skip . and ..
400 (pffb->achName[0] != '.' || (pffb->achName[1]
401 && (pffb->achName[1] != '.'
402 || pffb->achName[2])))) {
403 isadir = TRUE;
404 break;
405 }
406 fb += pffb->oNextEntryOffset;
407 }
408
409 Interruptus:
410
411 if (isadir) {
412
413 PCNRITEM pci;
414
415 pci = WinSendMsg(hwndCnr,
416 CM_ALLOCRECORD,
417 MPFROMLONG(EXTRA_RECORD_BYTES2), MPFROMLONG(1L));
418 if (!pci) {
419 Win_Error(hwndCnr, HWND_DESKTOP, __FILE__, __LINE__,
420 GetPString(IDS_RECORDALLOCFAILEDTEXT));
421 }
422 else {
423 RECORDINSERT ri;
424
425 *pci->szFileName = 0;
426 pci->pszFileName = pci->szFileName;
427 pci->rc.pszIcon = pci->pszFileName;
428 memset(&ri, 0, sizeof(RECORDINSERT));
429 ri.cb = sizeof(RECORDINSERT);
430 ri.pRecordOrder = (PRECORDCORE) CMA_END;
431 ri.pRecordParent = (PRECORDCORE) pciParent;
432 ri.zOrder = (ULONG) CMA_TOP;
433 ri.cRecordsInsert = 1L;
434 ri.fInvalidateRecord = TRUE;
435 if (!WinSendMsg(hwndCnr,
436 CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
437 DosSleep(100L);
438 WinSetFocus(HWND_DESKTOP, hwndCnr);
439 if (WinIsWindow((HAB) 0, hwndCnr)) {
440 if (!WinSendMsg(hwndCnr,
441 CM_INSERTRECORD, MPFROMP(pci), MPFROMP(&ri))) {
442 Win_Error(hwndCnr, HWND_DESKTOP, __FILE__, __LINE__,
443 GetPString(IDS_RECORDINSERTFAILEDTEXT));
444 WinSendMsg(hwndCnr,
445 CM_FREERECORD, MPFROMP(&pci), MPFROMSHORT(1));
446 }
447 else
448 ret = TRUE;
449 }
450 }
451 else
452 ret = TRUE;
453 }
454 }
455 else if (toupper(*str) > 'B' && str[1] == ':' && str[2] == '\\' &&
456 !str[3]) {
457
458 CHAR s[162];
459
460 sprintf(s,
461 GetPString(IDS_NOSUBDIRS2TEXT),
462 nm,
463 toupper(*pciParent->szFileName),
464 (isremote) ? GetPString(IDS_NOSUBDIRS3TEXT) : NullStr);
465 Notify(s);
466 }
467 }
468 }
469 else if (toupper(*str) > 'B' && rc != ERROR_NO_MORE_FILES) {
470
471 CHAR s[CCHMAXPATH + 80];
472
473 sprintf(s, GetPString(IDS_SEARCHERRORTEXT), rc, str);
474 Notify(s);
475 }
476
477None:
478
479 DosError(FERR_DISABLEHARDERR);
480 return ret;
481}
Note: See TracBrowser for help on using the repository browser.