source: trunk/dll/flesh.c@ 551

Last change on this file since 551 was 551, checked in by Gregg Young, 19 years ago

Indentation cleanup

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