source: trunk/dll/worker.c@ 1017

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

fortify updates for threads dble free fix

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 41.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: worker.c 1017 2008-05-26 03:02:59Z gyoung $
5
6 Worker thread
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2008 Steven H. Levine
10
11 16 Oct 02 SHL Comments
12 18 Oct 02 SHL MassAction:Archive - force extension so file found
13 06 Jun 05 SHL Indent -i2
14 06 Jun 05 SHL Rework Action for VAC3.65 compat
15 27 Jul 05 SHL IDM_DOITYOURSELF - avoid need to strip in ExecOnList
16 22 Jul 06 SHL Comments
17 22 Jul 06 SHL Check more run time errors
18 03 Nov 06 SHL Renames
19 03 Nov 06 SHL Count thread usage
20 21 Apr 07 GKY Find FM2Utils by path or utils directory
21 16 Jun 07 SHL Update for OpenWatcom
22 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
23 07 Aug 07 SHL Use BldQuotedFileName
24 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
25 26 Aug 07 SHL Revert to DosSleep(0)
26 29 Feb 08 GKY Use xfree where appropriate
27 29 Feb 08 GKY Refactor global command line variables to notebook.h
28
29***********************************************************************/
30
31#include <stdlib.h>
32#include <string.h>
33#include <ctype.h>
34#include <share.h>
35#include <process.h> // _beginthread
36
37#define INCL_DOS
38#define INCL_DOSERRORS
39#define INCL_WINPROGRAMLIST
40#define INCL_WINHELP
41#define INCL_LONGLONG
42#define INCL_WINPOINTERS
43
44#include "fm3dlg.h"
45#include "fm3str.h"
46#include "comp.h" // FCOMPARE
47#include "pathutil.h" // BldQuotedFileName
48#include "makelist.h" // AddToList
49#include "errutil.h" // Dos_Error...
50#include "strutil.h" // GetPString
51#include "notebook.h" // External viewers
52#include "fm3dll.h"
53
54#include "fortify.h"
55
56#pragma data_seg(DATA2)
57
58static PSZ pszSrcFile = __FILE__;
59
60#ifdef UNDO
61
62static VOID LINFO undo;
63
64VOID FreeUndo(VOID)
65{
66 if (undo->list)
67 FreeList(undo->list);
68 memset(&undo, 0, sizeof(undo));
69}
70
71VOID Undo(HWND hwndCnr, HWND hwndFrame, HWND hwndClient, HWND hwndParent)
72{
73 LISTINFO *li;
74 WORKER *wk;
75
76 if (undo->type && undo->list && undo->list[0]) {
77 switch (undo->type) {
78 case IDM_MOVE case IDM_COPY:
79 case IDM_EXTRACT:
80 {
81 li = xmallocz(sizeof(LISTINFO), pszSrcFile, __LINE__);
82 if (li) {
83# ifdef FORTIFY
84 Fortify_EnterScope();
85# endif
86 wk = xmallocz(sizeof(WORKER), pszSrcFile, __LINE__);
87 if (wk) {
88 wk->size = sizeof(WORKER);
89 wk->hwndCnr = hwndCnr;
90 wk->hwndParent = hwndParent;
91 wk->hwndFrame = hwndFrame;
92 wk->hwndClient = hwndClient;
93 wk->li = li;
94 *wk->li = *undo;
95 switch (undo->type) {
96 case IDM_COPY:
97 case IDM_EXTRACT:
98 li->type = IDM_PERMDELETE;
99 break;
100 }
101 if (_beginthread(MassAction, NULL, 122880, (PVOID) wk) == -1) {
102 Runtime_Error(pszSrcFile, __LINE__,
103 GetPString(IDS_COULDNTSTARTTHREADTEXT));
104 FreeListInfo(wk->li);
105 xfree(wk, pszSrcFile, __LINE__);
106# ifdef FORTIFY
107 Fortify_LeaveScope();
108# endif
109 }
110 }
111 else
112 FreeListInfo(li);
113 }
114 }
115 break;
116 }
117 }
118 FreeUndo();
119}
120
121#endif // defined(UNDO)
122
123VOID Action(VOID * args)
124{
125 WORKER *wk = (WORKER *)args;
126 HAB hab2;
127 HMQ hmq2;
128 CHAR **files = NULL;
129 UINT numfiles = 0, numalloc = 0;
130 INT plen = 0;
131 CHAR *p, *pp;
132 CHAR szQuotedDirName[CCHMAXPATH];
133 CHAR szQuotedFileName[CCHMAXPATH];
134
135 if (wk) {
136 if (wk->li && wk->li->list && wk->li->list[0]) {
137 hab2 = WinInitialize(0);
138 if (hab2) {
139 hmq2 = WinCreateMsgQueue(hab2, 0);
140 if (hmq2) {
141 CHAR message[(CCHMAXPATH * 2) + 80], wildname[CCHMAXPATH];
142 INT x;
143 BOOL dontask = FALSE, wildcarding = FALSE, overold =
144 FALSE, overnew = FALSE, usedtarget;
145
146 WinCancelShutdown(hmq2, TRUE);
147 IncrThreadUsage();
148 *wildname = 0;
149 switch (wk->li->type) {
150 case IDM_MERGE:
151 if (wk->li->type == IDM_MERGE) {
152 if (TestBinary(wk->li->list[0]))
153 wk->li->type = IDM_MERGEBINARY;
154 else
155 wk->li->type = IDM_MERGETEXT;
156 }
157 strcpy(wk->li->targetpath, wk->li->list[0]);
158 p = strrchr(wk->li->targetpath, '\\');
159 if (p) {
160 p++;
161 *p = 0;
162 }
163 else
164 strcat(wk->li->targetpath, "\\");
165 sprintf(wk->li->targetpath + strlen(wk->li->targetpath),
166 "MERGE.%03x", (clock() & 4095L));
167 if (!WinDlgBox(HWND_DESKTOP,
168 wk->hwndFrame,
169 MergeDlgProc, FM3ModHandle, MRG_FRAME, (PVOID) wk))
170 goto Abort;
171 if (!wk->li->type ||
172 !*wk->li->targetpath || !wk->li->list || !wk->li->list[0])
173 goto Abort;
174 if (IsFile(wk->li->targetpath) != 1 && !wk->li->list[1]) {
175 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
176 wk->hwndFrame,
177 GetPString(IDS_AHEMTEXT),
178 GetPString(IDS_SILLYMERGETEXT));
179 goto Abort;
180 }
181 break;
182 case IDM_WILDMOVE:
183 wildcarding = TRUE;
184 wk->li->type = IDM_MOVE;
185 break;
186 case IDM_WILDRENAME:
187 wildcarding = TRUE;
188 wk->li->type = IDM_RENAME;
189 break;
190 case IDM_WILDCOPY:
191 wildcarding = TRUE;
192 wk->li->type = IDM_COPY;
193 break;
194 case IDM_MOVEPRESERVE:
195 {
196 CHAR preserve[CCHMAXPATH], *end;
197
198 wk->li->type = IDM_MOVE;
199 strcpy(preserve, wk->li->list[0] + 2);
200 end = strrchr(preserve, '\\');
201 if (end) {
202 end++;
203 for (x = 1; wk->li->list[x]; x++) {
204 p = preserve;
205 pp = wk->li->list[x] + 2;
206 while (p < end && toupper(*p) == toupper(*pp)) {
207 p++;
208 pp++;
209 }
210 if (*p == '\\')
211 p++;
212 if (p < end)
213 end = p;
214 }
215 *end = 0;
216 }
217 else
218 *preserve = 0;
219 plen = strlen(preserve);
220 if (plen)
221 plen += 2;
222 }
223 break;
224 case IDM_COPYPRESERVE:
225 {
226 CHAR preserve[CCHMAXPATH], *end;
227
228 wk->li->type = IDM_COPY;
229 strcpy(preserve, wk->li->list[0] + 2);
230 end = strrchr(preserve, '\\');
231 if (end) {
232 end++;
233 for (x = 1; wk->li->list[x]; x++) {
234 p = preserve;
235 pp = wk->li->list[x] + 2;
236 while (p < end && toupper(*p) == toupper(*pp)) {
237 p++;
238 pp++;
239 }
240 if (*p == '\\')
241 p++;
242 if (p < end)
243 end = p;
244 }
245 *end = 0;
246 }
247 else
248 *preserve = 0;
249 plen = strlen(preserve);
250 if (plen)
251 plen += 2;
252 }
253 break;
254 }
255 if (wk->li && wk->li->list && wk->li->list[0]) {
256 for (x = 0; wk->li->list[x]; x++) {
257 switch (wk->li->type) {
258 case IDM_COLLECTFROMFILE:
259 if (Collector) {
260
261 CHAR *temp = xstrdup(wk->li->list[x], pszSrcFile, __LINE__);
262
263 if (temp) {
264 if (!PostMsg(Collector,
265 UM_COLLECTFROMFILE, MPFROMP(temp), MPVOID))
266 xfree(temp, pszSrcFile, __LINE__);
267 }
268 }
269 break;
270
271 case IDM_MERGEBINARY:
272 case IDM_MERGETEXT:
273 case IDM_MERGEBINARYAPPEND:
274 case IDM_MERGETEXTAPPEND:
275 {
276 FILE *in, *out;
277 CHAR *moder, *modew;
278 int c;
279
280 switch (wk->li->type) {
281 case IDM_MERGEBINARY:
282 moder = "rb";
283 modew = "wb";
284 break;
285 case IDM_MERGEBINARYAPPEND:
286 moder = "rb";
287 modew = "a+b";
288 break;
289 case IDM_MERGETEXTAPPEND:
290 moder = "r";
291 modew = "a+";
292 break;
293 default:
294 moder = "r";
295 modew = "w";
296 break;
297 }
298 in = _fsopen(wk->li->list[x], moder, SH_DENYWR);
299 if (!in) {
300 if (saymsg(MB_ENTERCANCEL,
301 HWND_DESKTOP,
302 GetPString(IDS_MERGEERRORTEXT),
303 GetPString(IDS_CANTOPENINPUTTEXT),
304 wk->li->list[x]) == MBID_CANCEL)
305 goto Abort;
306 }
307 else {
308 out = _fsopen(wk->li->targetpath, modew, SH_DENYWR);
309 if (out) {
310 fseek(out, 0L, SEEK_END);
311 switch (wk->li->type) {
312 case IDM_MERGEBINARY:
313 wk->li->type = IDM_MERGEBINARYAPPEND;
314 break;
315 default:
316 wk->li->type = IDM_MERGETEXTAPPEND;
317 break;
318 }
319 sprintf(message,
320 GetPString(IDS_MERGINGTEXT),
321 wk->li->list[x], wk->li->targetpath);
322 AddNote(message);
323 while ((c = fgetc(in)) != EOF)
324 fputc(c, out);
325 fclose(out);
326 sprintf(message,
327 GetPString(IDS_MERGECOMPLETETEXT),
328 wk->li->list[x], wk->li->targetpath);
329 AddNote(message);
330 }
331 else {
332 saymsg(MB_CANCEL,
333 HWND_DESKTOP,
334 GetPString(IDS_MERGEERRORTEXT),
335 GetPString(IDS_CANTOPENOUTPUTTEXT),
336 wk->li->targetpath);
337 fclose(in);
338 goto Abort;
339 }
340 fclose(in);
341 }
342 }
343 break;
344
345 case IDM_UUDECODE:
346 {
347 CHAR outname[CCHMAXPATH + 2];
348
349 sprintf(message,
350 GetPString(IDS_UUDECODINGTEXT), wk->li->list[x]);
351 AddNote(message);
352 if (UUD(wk->li->list[x], outname) && *outname) {
353 sprintf(message,
354 GetPString(IDS_UUDECODECOMPLETETEXT),
355 wk->li->list[x]);
356 AddNote(message);
357 if (fSyncUpdates ||
358 AddToList(outname, &files, &numfiles, &numalloc))
359 Broadcast(hab2,
360 wk->hwndCnr,
361 UM_UPDATERECORD, MPFROMP(outname), MPVOID);
362 }
363 else {
364 sprintf(message,
365 GetPString(IDS_UUDECODEABORTEDTEXT),
366 wk->li->list[x]);
367 AddNote(message);
368 }
369 }
370 break;
371
372 case IDM_VIEWARCHIVE:
373 if (IsFile(wk->li->list[x]) > 0) {
374
375 ARC_TYPE *info = NULL; // Say calling for editing - fixme to know why?
376
377 if (WinDlgBox(HWND_DESKTOP,
378 wk->hwndFrame,
379 SBoxDlgProc,
380 FM3ModHandle,
381 ASEL_FRAME, (PVOID) & info) && info) {
382 WinSendMsg(wk->hwndCnr,
383 UM_OPENWINDOWFORME,
384 MPFROMP(wk->li->list[x]), MPFROMP(info));
385 }
386 }
387 break;
388
389 case IDM_EXTRACT:
390 {
391 EXTRDATA ex;
392 BOOL maskspaces = FALSE;
393
394 memset(&ex, 0, sizeof(EXTRDATA));
395 ex.info = find_type(wk->li->list[x], NULL);
396 if (!ex.info || (!ex.info->extract && !ex.info->exwdirs))
397 break;
398 ex.size = sizeof(EXTRDATA);
399 ex.arcname = wk->li->list[x];
400 strcpy(ex.masks, "*");
401 strcpy(ex.extractdir, wk->li->targetpath);
402 if (!WinDlgBox(HWND_DESKTOP,
403 wk->hwndFrame,
404 ExtractDlgProc,
405 FM3ModHandle,
406 EXT_FRAME,
407 (PVOID) & ex) ||
408 !ex.ret ||
409 !*ex.command || !*ex.arcname || !*ex.extractdir)
410 goto Abort;
411 {
412 FILESTATUS3 fsa;
413
414 DosError(FERR_DISABLEHARDERR);
415 if (DosQueryPathInfo(ex.extractdir,
416 FIL_STANDARD,
417 &fsa,
418 (ULONG) sizeof(FILESTATUS3)) ||
419 !(fsa.attrFile & FILE_DIRECTORY))
420 goto Abort;
421 }
422 if (needs_quoting(ex.masks) && !strchr(ex.masks, '\"'))
423 maskspaces = TRUE;
424 if (!runemf2(SEPARATE | WINDOWED |
425 fArcStuffVisible ? 0 : (BACKGROUND | MINIMIZED),
426 HWND_DESKTOP, pszSrcFile, __LINE__, ex.extractdir, NULL,
427 "%s %s %s%s%s",
428 ex.command,
429 ex.arcname,
430 maskspaces ? "\"" : NullStr,
431 *ex.masks ? ex.masks : "*",
432 maskspaces ? "\"" : NullStr) &&
433 !stricmp(ex.extractdir, wk->directory)) {
434 if (WinIsWindow(hab2, wk->hwndCnr))
435 WinSendMsg(wk->hwndCnr,
436 WM_COMMAND,
437 MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
438 }
439 }
440 break;
441
442 case IDM_SUBJECT:
443 {
444 INT ret;
445
446 ret = Subject(wk->hwndFrame, wk->li->list[x]);
447 if (!ret)
448 goto Abort;
449 if (ret == 1) {
450 if (fSyncUpdates ||
451 AddToList(wk->li->list[x],
452 &files, &numfiles, &numalloc))
453 Broadcast(hab2,
454 wk->hwndCnr,
455 UM_UPDATERECORD,
456 MPFROMP(wk->li->list[x]), MPVOID);
457 }
458 }
459 break;
460
461 case IDM_INFO:
462 if (IsFullName(wk->li->list[x]) &&
463 !(driveflags[toupper(*wk->li->list[x]) - 'A'] &
464 DRIVE_INVALID)) {
465 if (!IsRoot(wk->li->list[x])) {
466
467 CHAR *list[2];
468
469 list[0] = wk->li->list[x];
470 list[1] = NULL;
471 if (!WinDlgBox(HWND_DESKTOP,
472 HWND_DESKTOP,
473 FileInfoProc,
474 FM3ModHandle, FLE_FRAME, (PVOID) list)) {
475 goto Abort;
476 }
477 }
478 else {
479 if (!WinDlgBox(HWND_DESKTOP,
480 HWND_DESKTOP,
481 DrvInfoProc,
482 FM3ModHandle,
483 INFO_FRAME, (PVOID) wk->li->list[x]))
484 goto Abort;
485 }
486 }
487 break;
488
489 case IDM_OPENWINDOW:
490 if (!IsFile(wk->li->list[x]) &&
491 WinIsWindow(hab2, wk->hwndCnr))
492 WinSendMsg(wk->hwndCnr,
493 UM_OPENWINDOWFORME,
494 MPFROMP(wk->li->list[x]), MPVOID);
495 break;
496
497 case IDM_OPENICON:
498 case IDM_OPENDETAILS:
499 case IDM_OPENTREE:
500 {
501 FILESTATUS3 fsa;
502
503 DosError(FERR_DISABLEHARDERR);
504 if (DosQueryPathInfo(wk->li->list[x],
505 FIL_STANDARD,
506 &fsa,
507 (ULONG) sizeof(FILESTATUS3)) ||
508 !(fsa.attrFile & FILE_DIRECTORY))
509 break;
510 }
511 /* else intentional fallthru */
512 case IDM_OPENDEFAULT:
513 case IDM_OPENSETTINGS:
514 {
515 CHAR *s;
516
517 switch (wk->li->type) {
518 case IDM_OPENICON:
519 s = "ICON";
520 break;
521 case IDM_OPENDETAILS:
522 s = "DETAILS";
523 break;
524 case IDM_OPENTREE:
525 s = "TREE";
526 break;
527 case IDM_OPENSETTINGS:
528 s = Settings;
529 break;
530 default:
531 s = Default;
532 break;
533 }
534 OpenObject(wk->li->list[x], s, wk->hwndFrame);
535 }
536 break;
537
538 case IDM_WPSMOVE:
539 case IDM_WPSCOPY:
540 case IDM_MOVE:
541 case IDM_COPY:
542 case IDM_RENAME:
543 if (!*wk->li->targetpath && (wk->li->type == IDM_MOVE ||
544 wk->li->type == IDM_COPY ||
545 wk->li->type == IDM_WPSMOVE ||
546 wk->li->type == IDM_WPSCOPY)) {
547
548 APIRET rc = 1;
549
550 usedtarget = FALSE;
551 if (hwndMain) {
552 if (!*targetdir)
553 TopWindowName(hwndMain,
554 wk->hwndFrame, wk->li->targetpath);
555 else {
556 strcpy(wk->li->targetpath, targetdir);
557 usedtarget = TRUE;
558 }
559 }
560 if (!*wk->li->targetpath)
561 strcpy(wk->li->targetpath, wk->directory);
562 if (!*wk->li->targetpath) {
563 strcpy(wk->li->targetpath, wk->li->list[0]);
564 p = strrchr(wk->li->targetpath, '\\');
565 if (p) {
566 if (*(p - 1) == ':')
567 p++;
568 *p = 0;
569 }
570 }
571 MakeValidDir(wk->li->targetpath);
572 if (fConfirmTarget ||
573 (!*targetdir && strcmp(realappname, "FM/4"))) {
574 RetryPath:
575 usedtarget = FALSE;
576 if (wk->li->type == IDM_MOVE ||
577 wk->li->type == IDM_WPSMOVE) {
578 rc = WinDlgBox(HWND_DESKTOP,
579 wk->hwndFrame,
580 WalkMoveDlgProc,
581 FM3ModHandle,
582 WALK_FRAME, MPFROMP(wk->li->targetpath));
583 }
584 else if (wk->li->type == IDM_COPY ||
585 wk->li->type == IDM_WPSCOPY) {
586 rc = WinDlgBox(HWND_DESKTOP,
587 wk->hwndFrame,
588 WalkCopyDlgProc,
589 FM3ModHandle,
590 WALK_FRAME, MPFROMP(wk->li->targetpath));
591 }
592 else
593 rc = WinDlgBox(HWND_DESKTOP,
594 wk->hwndFrame,
595 WalkDlgProc,
596 FM3ModHandle,
597 WALK_FRAME, MPFROMP(wk->li->targetpath));
598 }
599 if (!rc || !*wk->li->targetpath)
600 goto Abort;
601 if (driveflags[toupper(*wk->li->targetpath) - 'A'] &
602 DRIVE_NOTWRITEABLE) {
603 saymsg(MB_CANCEL,
604 wk->hwndFrame,
605 GetPString(IDS_ERRORTEXT),
606 "%s", GetPString(IDS_NOTWRITENOTARGETTEXT));
607 goto RetryPath;
608 }
609 }
610 Retry:
611 {
612 CHAR newname[CCHMAXPATH], *moving, *move, *moved;
613 APIRET rc;
614 INT type;
615 FILESTATUS4L fs4;
616 BOOL isnewer, existed;
617
618 type = (wk->li->type == IDM_RENAME) ? MOVE :
619 (wk->li->type == IDM_MOVE) ? MOVE :
620 (wk->li->type == IDM_WPSMOVE) ? WPSMOVE :
621 (wk->li->type == IDM_WPSCOPY) ? WPSCOPY : COPY;
622 moving = (wk->li->type == IDM_RENAME) ?
623 GetPString(IDS_RENAMINGTEXT) :
624 (wk->li->type == IDM_MOVE ||
625 wk->li->type == IDM_WPSMOVE) ?
626 GetPString(IDS_MOVINGTEXT) : GetPString(IDS_COPYINGTEXT);
627 move = (wk->li->type == IDM_RENAME) ?
628 GetPString(IDS_RENAMETEXT) :
629 (wk->li->type == IDM_MOVE ||
630 wk->li->type == IDM_WPSMOVE) ?
631 GetPString(IDS_MOVETEXT) : GetPString(IDS_COPYTEXT);
632 moved = (wk->li->type == IDM_RENAME) ?
633 GetPString(IDS_RENAMEDTEXT) :
634 (wk->li->type == IDM_MOVE ||
635 wk->li->type == IDM_WPSMOVE) ?
636 GetPString(IDS_MOVEDTEXT) : GetPString(IDS_COPIEDTEXT);
637 if (*wk->li->targetpath) {
638 strcpy(newname, wk->li->targetpath);
639 if (newname[strlen(newname) - 1] != '\\')
640 strcat(newname, "\\");
641 if (plen)
642 p = wk->li->list[x] + plen;
643 else {
644 p = strrchr(wk->li->list[x], '\\');
645 if (p)
646 p++;
647 else
648 p = wk->li->list[x];
649 }
650 strcat(newname, p);
651 }
652 else
653 strcpy(newname, wk->li->list[x]);
654 if ((wildcarding || wk->li->type == IDM_RENAME) &&
655 *wildname) {
656
657 CHAR testname[CCHMAXPATH];
658
659 strcpy(testname, wildname);
660 if (AdjustWildcardName(newname, testname))
661 strcpy(newname, testname);
662 }
663 existed = (IsFile(newname) != -1);
664 isnewer = IsNewer(wk->li->list[x], newname);
665 /*
666 {
667 char temp[CCHMAXPATH * 3];
668 sprintf(temp,"Target: %s\rSource: %s\rOverold: %lu\rOvernew: %lu\rIsNewer: %lu\rExisted: %lu",newname,wk->li->list[x],overold,overnew,isnewer,existed);
669 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,temp);
670 }
671 */
672 if (existed && wk->li->type != IDM_RENAME && dontask) {
673 if (!overold && !overnew)
674 break;
675 if (!overold && !isnewer)
676 break;
677 if (!overnew && isnewer)
678 break;
679 }
680 if ((wk->li->type == IDM_RENAME &&
681 (!dontask || !*wildname)) ||
682 (!dontask && existed) ||
683 (!dontask && wildcarding) ||
684 (IsFile(newname) == 0 && IsFile(wk->li->list[x]) > 0)) {
685
686 MOVEIT mv;
687
688 memset(&mv, 0, sizeof(MOVEIT));
689 mv.rename = (wk->li->type == IDM_RENAME);
690 mv.source = wk->li->list[x];
691 strcpy(mv.target, newname);
692 rc = WinDlgBox(HWND_DESKTOP,
693 wk->hwndFrame,
694 RenameProc,
695 FM3ModHandle, REN_FRAME, (PVOID) & mv);
696 if (!rc)
697 goto Abort;
698 DosSleep(1);
699 if (mv.skip || !*mv.target)
700 break;
701 if (mv.dontask)
702 dontask = TRUE;
703 if (mv.overold)
704 overold = TRUE;
705 if (mv.overnew)
706 overnew = TRUE;
707 if (wildcarding || wk->li->type == IDM_RENAME) {
708 p = strrchr(mv.target, '\\');
709 if (p && (strchr(p, '*') || strchr(p, '?'))) {
710 strcpy(wildname, mv.target);
711 AdjustWildcardName(wk->li->list[x], mv.target);
712 }
713 else
714 *wildname = 0;
715 }
716 strcpy(newname, mv.target);
717 existed = (IsFile(newname) != -1);
718 isnewer = IsNewer(wk->li->list[x], newname);
719 if (!mv.overwrite) {
720 if (existed && wk->li->type != IDM_RENAME && dontask) {
721 if (!overold && !overnew)
722 break;
723 if (!overold && !isnewer)
724 break;
725 if (!overnew && isnewer)
726 break;
727 }
728 }
729 }
730 if (!strcmp(wk->li->list[x], newname) ||
731 (wk->li->type == IDM_COPY &&
732 !stricmp(wk->li->list[x], newname)))
733 break;
734 sprintf(message,
735 " %s \"%s\" %s\"%s\"%s",
736 moving,
737 wk->li->list[x],
738 GetPString(IDS_TOTEXT),
739 newname,
740 (usedtarget) ? GetPString(IDS_TOTARGETTEXT) :
741 NullStr);
742 AddNote(message);
743 if (plen) {
744 /* make directory/ies, if required */
745
746 CHAR dirpart[CCHMAXPATH];
747
748 strcpy(dirpart, newname);
749 p = strrchr(dirpart, '\\');
750 if (p) {
751 *p = 0;
752 if (p > dirpart + 3)
753 MassMkdir((hwndMain) ? hwndMain : wk->hwndCnr,
754 dirpart);
755 }
756 }
757 if (fRealIdle)
758 priority_idle();
759 rc = docopyf(type, wk->li->list[x], "%s", newname);
760 priority_normal();
761 if (rc) {
762 if ((rc == ERROR_DISK_FULL ||
763 rc == ERROR_HANDLE_DISK_FULL) &&
764 isalpha(*newname) &&
765 (driveflags[toupper(*newname) - 'A'] &
766 DRIVE_REMOVABLE)
767 && !(driveflags[toupper(*newname) - 'A'] &
768 DRIVE_NOTWRITEABLE)
769 && toupper(*newname) != toupper(*wk->li->list[x])
770 && !DosQueryPathInfo(wk->li->list[x], FIL_QUERYEASIZEL,
771 &fs4, sizeof(fs4))
772 && !(fs4.attrFile & FILE_DIRECTORY)) {
773
774 FSALLOCATE fsa;
775 ULONG clFreeBytes;
776 CHAR *ptr;
777 INT cntr;
778
779 Notify(GetPString(IDS_FITTINGTEXT));
780 DosError(FERR_DISABLEHARDERR);
781 if (!DosQueryFSInfo(toupper(*newname) - '@',
782 FSIL_ALLOC,
783 &fsa, sizeof(FSALLOCATE))) {
784 // Assume <2GB since file did not fit
785 clFreeBytes = fsa.cUnitAvail * fsa.cSectorUnit *
786 fsa.cbSector;
787 if (clFreeBytes) {
788 // Find item that will fit in available space
789 for (cntr = x + 1; wk->li->list[cntr]; cntr++) {
790 DosError(FERR_DISABLEHARDERR);
791 if (!DosQueryPathInfo(wk->li->list[cntr],
792 FIL_QUERYEASIZEL,
793 &fs4,
794 sizeof(fs4)) &&
795 !(fs4.attrFile & FILE_DIRECTORY) &&
796 // fixme to use CBLIST_TO_EASIZE?
797 fs4.cbFile + fs4.cbList <= clFreeBytes) {
798 // Swap with failing item
799 ptr = wk->li->list[x];
800 wk->li->list[x] = wk->li->list[cntr];
801 wk->li->list[cntr] = ptr;
802 goto Retry;
803 }
804 }
805 Notify(GetPString(IDS_COULDNTFITTEXT));
806 }
807 }
808 rc = saymsg(MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION,
809 wk->hwndFrame,
810 GetPString(IDS_DISKFULLTEXT),
811 "%s", GetPString(IDS_ANOTHERDISKTEXT));
812 if (rc == MBID_RETRY)
813 goto Retry;
814 if (rc == MBID_ABORT)
815 goto Abort;
816 }
817 else {
818 if (LogFileHandle)
819 fprintf(LogFileHandle,
820 GetPString(IDS_LOGTOFAILEDTEXT),
821 move, wk->li->list[x], newname, rc);
822 rc = Dos_Error(MB_ENTERCANCEL,
823 rc,
824 wk->hwndFrame,
825 pszSrcFile,
826 __LINE__,
827 "%s %s \"%s\" %s\"%s\" %s.",
828 move,
829 GetPString(IDS_OFTEXT),
830 wk->li->list[x],
831 GetPString(IDS_TOTEXT),
832 newname, GetPString(IDS_FAILEDTEXT));
833 if (rc == MBID_CANCEL)
834 goto Abort;
835 }
836 }
837 else {
838 if (LogFileHandle)
839 fprintf(LogFileHandle,
840 "%s \"%s\" %s\"%s\"\n",
841 moved,
842 wk->li->list[x],
843 GetPString(IDS_TOTEXT), newname);
844 if (fSyncUpdates ||
845 AddToList(wk->li->list[x],
846 &files, &numfiles, &numalloc))
847 Broadcast(hab2,
848 wk->hwndCnr,
849 UM_UPDATERECORD,
850 MPFROMP(wk->li->list[x]), MPVOID);
851 if (fSyncUpdates ||
852 AddToList(newname, &files, &numfiles, &numalloc))
853 Broadcast(hab2,
854 wk->hwndCnr,
855 UM_UPDATERECORD, MPFROMP(newname), MPVOID);
856 }
857 }
858 break;
859
860 case IDM_COMPARE:
861 if ((!IsFile(wk->li->targetpath) ||
862 IsRoot(wk->li->targetpath)) &&
863 (!IsFile(wk->li->list[x]) || IsRoot(wk->li->list[x]))) {
864 if (!*dircompare && WinIsWindow(hab2, wk->hwndCnr))
865 WinSendMsg(wk->hwndCnr,
866 UM_COMPARE,
867 MPFROMP(wk->li->targetpath),
868 MPFROMP(wk->li->list[x]));
869 else {
870 runemf2(SEPARATE,
871 HWND_DESKTOP, pszSrcFile, __LINE__,
872 NULL, NULL,
873 "%s %s %s",
874 dircompare,
875 BldQuotedFileName(szQuotedDirName, wk->li->targetpath),
876 BldQuotedFileName(szQuotedFileName, wk->li->list[x]));
877 }
878 }
879 else if (*compare) {
880 CHAR *fakelist[3];
881
882 fakelist[0] = wk->li->list[x];
883 fakelist[1] = wk->li->targetpath;
884 fakelist[2] = NULL;
885 ExecOnList(wk->hwndFrame,
886 compare,
887 WINDOWED | SEPARATEKEEP, NULL, fakelist, NULL,
888 pszSrcFile, __LINE__);
889 }
890 else {
891 FCOMPARE fc;
892
893 memset(&fc, 0, sizeof(fc));
894 fc.size = sizeof(fc);
895 fc.hwndParent = wk->hwndParent;
896 strcpy(fc.file1, wk->li->list[x]);
897 strcpy(fc.file2, wk->li->targetpath);
898 if (WinDlgBox(HWND_DESKTOP,
899 wk->hwndFrame,
900 CFileDlgProc,
901 FM3ModHandle, FCMP_FRAME, (PVOID) & fc))
902 goto Abort;
903 }
904 break;
905 } // switch
906 DosSleep(0);
907 } // for list
908
909 switch (wk->li->type) {
910 case IDM_MOVE:
911 case IDM_COPY:
912 case IDM_WPSMOVE:
913 case IDM_WPSCOPY:
914 case IDM_RENAME:
915 sprintf(message,
916 GetPString(IDS_OPSCOMPLETETEXT),
917 (wk->li->type == IDM_MOVE) ?
918 GetPString(IDS_MOVETEXT) :
919 (wk->li->type == IDM_COPY) ?
920 GetPString(IDS_COPYTEXT) :
921 (wk->li->type == IDM_WPSMOVE) ?
922 GetPString(IDS_WPSMOVETEXT) :
923 (wk->li->type == IDM_WPSCOPY) ?
924 GetPString(IDS_WPSCOPYTEXT) :
925 GetPString(IDS_RENAMETEXT),
926 &"s"[x == 1],
927 (wk->li->type == IDM_MOVE ||
928 wk->li->type == IDM_COPY ||
929 wk->li->type == IDM_WPSMOVE ||
930 wk->li->type == IDM_WPSCOPY) ?
931 GetPString(IDS_TOTEXT) :
932 NullStr,
933 (wk->li->type == IDM_MOVE ||
934 wk->li->type == IDM_COPY ||
935 wk->li->type == IDM_WPSMOVE ||
936 wk->li->type == IDM_WPSCOPY) ?
937 wk->li->targetpath :
938 NullStr,
939 (x != 1) ?
940 GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
941 Notify(message);
942 if (toupper(*wk->li->targetpath) < 'C')
943 DosBeep(1000, 25); // Wake up user
944 DosSleep(16);//05 Aug 07 GKY 33
945 if (wk->li->type == IDM_WPSMOVE || wk->li->type == IDM_WPSCOPY)
946 DosSleep(48);//05 Aug 07 GKY 96
947 break;
948 default:
949 break;
950 }
951 }
952
953 Abort:
954
955 if (files) {
956 Broadcast(hab2,
957 wk->hwndCnr,
958 UM_UPDATERECORDLIST, MPFROMP(files), MPVOID);
959 FreeList(files);
960 }
961
962 if (WinIsWindow(hab2, wk->hwndCnr))
963 PostMsg(wk->hwndCnr, UM_RESCAN, MPVOID, MPVOID);
964
965 WinDestroyMsgQueue(hmq2);
966 }
967 DecrThreadUsage();
968 WinTerminate(hab2);
969 }
970 }
971
972 if (wk->li)
973 FreeListInfo(wk->li);
974 xfree(wk, pszSrcFile, __LINE__);
975# ifdef FORTIFY
976 Fortify_LeaveScope();
977# endif
978 DosPostEventSem(CompactSem);
979 }
980}
981
982VOID MassAction(VOID * args)
983{
984 WORKER *wk = (WORKER *) args;
985 HAB hab2;
986 HMQ hmq2;
987 CHAR **files = NULL;
988 register CHAR *p, *pp;
989 UINT numfiles = 0, numalloc = 0;
990
991 if (wk) {
992 if (wk->li && wk->li->list && wk->li->list[0]) {
993 hab2 = WinInitialize(0);
994 if (hab2) {
995 hmq2 = WinCreateMsgQueue(hab2, 0);
996 if (hmq2) {
997 WinCancelShutdown(hmq2, TRUE);
998 IncrThreadUsage();
999 DosError(FERR_DISABLEHARDERR);
1000 if (IsRoot(wk->li->list[0]) || !IsFile(wk->li->list[0])) {
1001 if (wk->li->type == IDM_VIEW)
1002 wk->li->type = IDM_INFO;
1003 if (wk->li->type == IDM_EDIT)
1004 wk->li->type = IDM_EAS;
1005 }
1006 switch (wk->li->type) {
1007 case IDM_INFO:
1008 if (WinDlgBox(HWND_DESKTOP,
1009 wk->hwndFrame,
1010 FileInfoProc,
1011 FM3ModHandle, FLE_FRAME, (PVOID) wk->li->list) != 2)
1012 {
1013 break;
1014 }
1015 /* else intentional fallthru */
1016 case IDM_UPDATE:
1017 Broadcast(hab2,
1018 wk->hwndCnr,
1019 UM_UPDATERECORDLIST, MPFROMP(wk->li->list), MPVOID);
1020 break;
1021
1022 case IDM_EAS:
1023 if (WinDlgBox(HWND_DESKTOP,
1024 wk->hwndFrame,
1025 DisplayEAsProc,
1026 FM3ModHandle, EA_FRAME, (PVOID) wk->li->list))
1027 Broadcast(hab2,
1028 wk->hwndCnr,
1029 UM_UPDATERECORDLIST, MPFROMP(wk->li->list), MPVOID);
1030 break;
1031
1032 case IDM_DOITYOURSELF:
1033 ExecOnList(wk->hwndFrame,
1034 "%a",
1035 WINDOWED | SEPARATE | PROMPT,
1036 NULL, wk->li->list, GetPString(IDS_DOITYOURSELFTEXT),
1037 pszSrcFile, __LINE__);
1038 break;
1039
1040 case IDM_MCIPLAY:
1041 {
1042 register INT x;
1043 register ULONG total;
1044 CHAR fbuf[CCHMAXPATH];
1045
1046 if (DosSearchPath(SEARCH_IGNORENETERRS | SEARCH_ENVIRONMENT |
1047 SEARCH_CUR_DIRECTORY,
1048 "PATH", "FM2PLAY.EXE", fbuf, CCHMAXPATH - 1))
1049 total += strlen("..\\FM2UTILS\\FM2PLAY.EXE ");
1050 else
1051 total = strlen(fbuf);
1052 for (x = 0; wk->li->list[x]; x++)
1053 total += (strlen(wk->li->list[x]) + 1 +
1054 (needs_quoting(wk->li->list[x]) * 2));
1055 if (total > 1000) {
1056
1057 FILE *fp;
1058
1059 fp = xfopen("$FM2PLAY.$$$", "w", pszSrcFile, __LINE__);
1060 if (fp) {
1061 fprintf(fp, "%s", ";FM/2-built FM2Play listfile\n");
1062 for (x = 0; wk->li->list[x]; x++)
1063 fprintf(fp, "%s\n", wk->li->list[x]);
1064 fprintf(fp, ";end\n");
1065 fclose(fp);
1066 RunFM2Util("FM2PLAY.EXE", "/#$FM2PLAY.$$$");
1067 break;
1068 }
1069 }
1070 }
1071 /* intentional fallthru */
1072 case IDM_FAKEEXTRACT:
1073 case IDM_FAKEEXTRACTM:
1074 if (wk->li->type == IDM_MCIPLAY ||
1075 (*wk->li->arcname && wk->li->info &&
1076 wk->li->info->extract && *wk->li->targetpath)) {
1077
1078 CHAR szBuffer[1025];
1079 CHAR fbuf[CCHMAXPATH];
1080 register INT x;
1081
1082 if (wk->li->type == IDM_FAKEEXTRACT ||
1083 wk->li->type == IDM_FAKEEXTRACTM) {
1084 strcpy(szBuffer,
1085 (wk->li->info->exwdirs) ?
1086 wk->li->info->exwdirs : wk->li->info->extract);
1087 strcat(szBuffer, " ");
1088 BldQuotedFileName(szBuffer + strlen(szBuffer), wk->li->arcname);
1089 }
1090 else {
1091 if (DosSearchPath(SEARCH_IGNORENETERRS | SEARCH_ENVIRONMENT |
1092 SEARCH_CUR_DIRECTORY,
1093 "PATH", "FM2PLAY.EXE", fbuf, CCHMAXPATH - 1))
1094 strcpy(szBuffer, "UTILS\\FM2PLAY.EXE");
1095 else
1096 strcpy(szBuffer, "FM2PLAY.EXE");
1097 }
1098 p = &szBuffer[strlen(szBuffer)];
1099 strcat(szBuffer, " ");
1100 x = 0;
1101 while (wk->li->list[x]) {
1102 pp = wk->li->list[x];
1103 while (*pp) {
1104 if (*pp == '/')
1105 *pp = '\\';
1106 pp++;
1107 }
1108 BldQuotedFileName(szBuffer + strlen(szBuffer), wk->li->list[x]);
1109 x++;
1110 if (!wk->li->list[x] || strlen(szBuffer) +
1111 strlen(wk->li->list[x]) + 5 > 1024) {
1112 runemf2(SEPARATE | WINDOWED | BACKGROUND | MINIMIZED | WAIT,
1113 HWND_DESKTOP, pszSrcFile, __LINE__,
1114 (wk->li->type == IDM_FAKEEXTRACT ||
1115 wk->li->type == IDM_FAKEEXTRACTM) ?
1116 wk->li->targetpath : NULL,
1117 NULL,
1118 "%s", szBuffer);
1119 DosSleep(1);
1120 *p = 0;
1121 }
1122 strcat(szBuffer, " ");
1123 }
1124 if (wk->li->type == IDM_MCIPLAY)
1125 break;
1126 strcpy(szBuffer, wk->li->targetpath);
1127 if (wk->li->targetpath[strlen(wk->li->targetpath) - 1] != '\\')
1128 strcat(szBuffer, "\\");
1129 p = szBuffer + strlen(szBuffer);
1130 for (x = 0; wk->li->list[x]; x++) {
1131 strcpy(p, wk->li->list[x]);
1132 xfree(wk->li->list[x], pszSrcFile, __LINE__);
1133 wk->li->list[x] = xstrdup(szBuffer, pszSrcFile, __LINE__);
1134 }
1135 if (wk->li->list[0])
1136 Broadcast(hab2,
1137 wk->hwndCnr,
1138 UM_UPDATERECORDLIST, MPFROMP(wk->li->list), MPVOID);
1139 }
1140 break;
1141
1142 case IDM_SETICON:
1143 if (*wk->li->targetpath) {
1144
1145 ICONINFO ici;
1146
1147 memset(&ici, 0, sizeof(ICONINFO));
1148 ici.cb = sizeof(ICONINFO);
1149 ici.fFormat = ICON_FILE;
1150 ici.pszFileName = wk->li->list[0];
1151 if (!WinSetFileIcon((PSZ) wk->li->targetpath,
1152 (PICONINFO) & ici)) {
1153 ici.fFormat = ICON_CLEAR;
1154 WinSetFileIcon((PSZ) wk->li->targetpath, (PICONINFO) & ici);
1155 }
1156 Broadcast(hab2,
1157 wk->hwndCnr,
1158 UM_UPDATERECORD, MPFROMP(wk->li->targetpath), MPVOID);
1159 }
1160 break;
1161
1162 case IDM_APPENDTOCLIP:
1163 case IDM_SAVETOCLIP:
1164 ListToClipboardHab(hab2,
1165 wk->li->list,
1166 (wk->li->type == IDM_APPENDTOCLIP));
1167 break;
1168
1169 case IDM_ARCHIVEM:
1170 case IDM_ARCHIVE:
1171 {
1172 DIRCNRDATA ad;
1173 CHAR szBuffer[1025];
1174 ARC_TYPE *info = NULL;
1175 char *pch;
1176 register INT x;
1177
1178 memset(&ad, 0, sizeof(DIRCNRDATA));
1179 strcpy(ad.arcname, wk->li->targetpath);
1180 if (*wk->li->targetpath && IsFile(wk->li->targetpath) > 0) {
1181 info = find_type(wk->li->targetpath, NULL);
1182 ad.namecanchange = 0;
1183 }
1184 else {
1185 if (*wk->li->targetpath && !IsFile(wk->li->targetpath))
1186 if (wk->li->targetpath[strlen(wk->li->targetpath) - 1] !=
1187 '\\')
1188 strcat(wk->li->targetpath, "\\");
1189 ad.namecanchange = 1;
1190 }
1191 strcpy(ad.arcname, wk->li->targetpath);
1192 if (wk->li->type == IDM_ARCHIVEM)
1193 ad.fmoving = TRUE;
1194 if (!info) {
1195 ad.info = arcsighead; // Hide dups
1196 if (!WinDlgBox(HWND_DESKTOP,
1197 wk->hwndFrame,
1198 SBoxDlgProc,
1199 FM3ModHandle,
1200 ASEL_FRAME, (PVOID) & ad.info) || !ad.info) {
1201 break; /* we blew it */
1202 }
1203 }
1204 else
1205 ad.info = info;
1206 if (!ad.info || (!ad.info->create &&
1207 !ad.info->move &&
1208 !ad.info->createwdirs &&
1209 !ad.info->movewdirs &&
1210 !ad.info->createrecurse))
1211 break;
1212 if (!*wk->li->targetpath && *wk->directory) {
1213 strcpy(ad.arcname, wk->directory);
1214 if (ad.arcname[strlen(ad.arcname) - 1] != '\\')
1215 strcat(ad.arcname, "\\");
1216 }
1217 if (!WinDlgBox(HWND_DESKTOP, wk->hwndFrame, ArchiveDlgProc, FM3ModHandle, ARCH_FRAME, (PVOID) & ad) || !*ad.arcname || !*ad.command) /* we blew it */
1218 break;
1219 // Provide extension so containers work
1220 pch = strrchr(ad.arcname, '\\');
1221 if (pch)
1222 pch = strrchr(pch, '.');
1223 else
1224 pch = strrchr(ad.arcname, '.');
1225 if (!pch && ad.info->ext) {
1226 strcat(ad.arcname, ".");
1227 strcat(ad.arcname, ad.info->ext);
1228 }
1229 /* build the sucker */
1230 strcpy(szBuffer, ad.command);
1231 strcat(szBuffer, " ");
1232 BldQuotedFileName(szBuffer + strlen(szBuffer), ad.arcname);
1233 p = &szBuffer[strlen(szBuffer)];
1234 if (ad.mask.szMask) {
1235 strcat(szBuffer, " ");
1236 strcat(szBuffer, ad.mask.szMask);
1237 }
1238 strcat(szBuffer, " ");
1239 x = 0;
1240 while (wk->li->list[x]) {
1241 FILESTATUS3 fsa;
1242 memset(&fsa, 0, sizeof(FILESTATUS3));
1243 DosError(FERR_DISABLEHARDERR);
1244 DosQueryPathInfo(wk->li->list[x],
1245 FIL_STANDARD,
1246 &fsa, (ULONG) sizeof(FILESTATUS3));
1247 if (fsa.attrFile & FILE_DIRECTORY) {
1248 BldQuotedFullPathName(szBuffer + strlen(szBuffer), wk->li->list[x], "*");
1249 }
1250 else
1251 BldQuotedFileName(szBuffer + strlen(szBuffer), wk->li->list[x]);
1252 x++;
1253 if (!wk->li->list[x] ||
1254 strlen(szBuffer) + strlen(wk->li->list[x]) + 5 > 1024) {
1255 runemf2(SEPARATE | WINDOWED | WAIT |
1256 (fArcStuffVisible ? 0 : (BACKGROUND | MINIMIZED)),
1257 HWND_DESKTOP, pszSrcFile, __LINE__, NULL, NULL,
1258 "%s", szBuffer);
1259 DosSleep(1);
1260 *p = 0;
1261 }
1262 strcat(szBuffer, " ");
1263 }
1264 Broadcast(hab2,
1265 wk->hwndCnr,
1266 UM_UPDATERECORDLIST, MPFROMP(wk->li->list), MPVOID);
1267 Broadcast(hab2,
1268 wk->hwndCnr,
1269 UM_UPDATERECORD, MPFROMP(ad.arcname), MPVOID);
1270 }
1271 break;
1272
1273 case IDM_VIEW:
1274 if (!TestBinary(wk->li->list[0])) {
1275 wk->li->type = IDM_VIEWTEXT;
1276 goto SkipViewing;
1277 }
1278 else
1279 wk->li->type = IDM_VIEWBINARY;
1280 /* intentional fallthru */
1281 case IDM_VIEWBINARY:
1282 if (*binview) {
1283 ExecOnList((HWND) 0,
1284 binview,
1285 WINDOWED | SEPARATE, NULL, wk->li->list, NULL,
1286 pszSrcFile, __LINE__);
1287 break;
1288 }
1289 /* else intentional fallthru */
1290 case IDM_VIEWTEXT:
1291 SkipViewing:
1292 if (*viewer)
1293 ExecOnList((HWND) 0, viewer,
1294 WINDOWED | SEPARATE |
1295 ((fViewChild) ? CHILD : 0),
1296 NULL, wk->li->list, NULL,
1297 pszSrcFile, __LINE__);
1298 else {
1299
1300 CHAR *temp;
1301 register INT x;
1302 ULONG viewtype;
1303
1304 viewtype = (wk->li->type == IDM_VIEWTEXT) ? 8 :
1305 (wk->li->type == IDM_VIEWBINARY) ? 16 : 0;
1306 for (x = 0; wk->li->list[x]; x++) {
1307 temp = xstrdup(wk->li->list[x], pszSrcFile, __LINE__);
1308 if (temp && WinIsWindow(hab2, wk->hwndCnr)) {
1309 if (!PostMsg(wk->hwndCnr,
1310 UM_LOADFILE,
1311 MPFROMLONG(5 + viewtype), MPFROMP(temp)))
1312 xfree(temp, pszSrcFile, __LINE__);
1313 }
1314 DosSleep(1);
1315 }
1316 }
1317 break;
1318
1319 case IDM_EDIT:
1320 if (!TestBinary(wk->li->list[0])) {
1321 wk->li->type = IDM_EDITTEXT;
1322 goto SkipEditing;
1323 }
1324 else
1325 wk->li->type = IDM_EDITBINARY;
1326 /* intentional fallthru */
1327 case IDM_EDITBINARY:
1328 if (*bined) {
1329 ExecOnList((HWND) 0,
1330 bined,
1331 WINDOWED | SEPARATE, NULL, wk->li->list, NULL,
1332 pszSrcFile, __LINE__);
1333 break;
1334 }
1335 /* else intentional fallthru */
1336 case IDM_EDITTEXT:
1337 SkipEditing:
1338 if (*editor)
1339 ExecOnList((HWND) 0,
1340 editor,
1341 WINDOWED | SEPARATE, NULL, wk->li->list, NULL,
1342 pszSrcFile, __LINE__);
1343 else {
1344
1345 CHAR *temp;
1346 register INT x;
1347 ULONG viewtype;
1348
1349 viewtype = (wk->li->type == IDM_EDITTEXT) ? 8 :
1350 (wk->li->type == IDM_EDITBINARY) ? 16 : 0;
1351 for (x = 0; wk->li->list[x]; x++) {
1352 temp = xstrdup(wk->li->list[x], pszSrcFile, __LINE__);
1353 if (temp && WinIsWindow(hab2, wk->hwndCnr)) {
1354 if (!PostMsg(wk->hwndCnr,
1355 UM_LOADFILE,
1356 MPFROMLONG(4 + viewtype), MPFROMP(temp)))
1357 xfree(temp, pszSrcFile, __LINE__);
1358 }
1359 DosSleep(1);
1360 }
1361 }
1362 break;
1363
1364 case IDM_SHADOW2:
1365 case IDM_OBJECT:
1366 case IDM_SHADOW:
1367 {
1368 CHAR objectpath[CCHMAXPATH];
1369 APIRET rc;
1370
1371 if (!*wk->li->targetpath || IsFile(wk->li->targetpath)) {
1372 GetDesktopName(objectpath, sizeof(objectpath));
1373 rc = WinDlgBox(HWND_DESKTOP,
1374 wk->hwndFrame,
1375 ObjCnrDlgProc,
1376 FM3ModHandle,
1377 OBJCNR_FRAME, MPFROMP(objectpath));
1378 if (rc) {
1379 if (rc > 1)
1380 strcpy(objectpath, "<WP_DESKTOP>");
1381 }
1382 else
1383 break;
1384 }
1385 else
1386 strcpy(objectpath, wk->li->targetpath);
1387 AddNote(GetPString(IDS_MAKINGOBJSTEXT));
1388 MakeShadows(wk->hwndFrame,
1389 wk->li->list,
1390 (wk->li->type == IDM_SHADOW) +
1391 (wk->li->type == IDM_SHADOW2) * 2,
1392 objectpath, NULL);
1393 AddNote(GetPString(IDS_MADEOBJSTEXT));
1394 }
1395 break;
1396
1397 case IDM_PRINT:
1398 if (WinDlgBox(HWND_DESKTOP,
1399 wk->hwndFrame,
1400 PrintDlgProc,
1401 FM3ModHandle, PRN_FRAME, MPFROMP(wk->li))) {
1402 if (wk->li && wk->li->list && wk->li->list[0]) {
1403 strcpy(wk->li->targetpath, printer);
1404 if (_beginthread(PrintListThread, NULL, 65536, (PVOID) wk->li)
1405 == -1)
1406 Runtime_Error(pszSrcFile, __LINE__,
1407 GetPString(IDS_COULDNTSTARTTHREADTEXT));
1408 else
1409 wk->li = NULL; /* prevent LISTINFO li from being freed */
1410 }
1411 }
1412 break;
1413
1414 case IDM_ATTRS:
1415 if (WinDlgBox(HWND_DESKTOP,
1416 wk->hwndFrame,
1417 AttrListDlgProc,
1418 FM3ModHandle, ATR_FRAME, MPFROMP(wk->li))) {
1419 if (wk->li && wk->li->list && wk->li->list[0])
1420 Broadcast(hab2,
1421 wk->hwndCnr,
1422 UM_UPDATERECORDLIST, MPFROMP(wk->li->list), MPVOID);
1423 }
1424 break;
1425
1426 case IDM_PERMDELETE:
1427 case IDM_DELETE:
1428 {
1429 CHECKLIST cl;
1430 INT isdir = 0, sysdir = 0, ro = 0, hs = 0;
1431 register INT x;
1432 FILESTATUS3 fsa;
1433 CHAR prompt[CCHMAXPATH * 3];
1434 APIRET error;
1435
1436 for (x = 0; wk->li->list[x]; x++) {
1437 if (IsRoot(wk->li->list[x])) {
1438 wk->li->list = RemoveFromList(wk->li->list,
1439 wk->li->list[x]);
1440 if (!wk->li->list)
1441 break;
1442 x--;
1443 continue;
1444 }
1445 DosError(FERR_DISABLEHARDERR);
1446 if (DosQueryPathInfo(wk->li->list[x],
1447 FIL_STANDARD, &fsa,
1448 (ULONG) sizeof(FILESTATUS3))) {
1449 wk->li->list = RemoveFromList(wk->li->list,
1450 wk->li->list[x]);
1451 if (!wk->li->list)
1452 break;
1453 x--;
1454 continue;
1455 }
1456 if (fsa.attrFile & FILE_DIRECTORY) {
1457 isdir++;
1458 if (stristr(wk->li->list[x], ":\\OS2\\") ||
1459 !stricmp(wk->li->list[x] + 1, ":\\OS2"))
1460 sysdir++;
1461 }
1462 else {
1463 if (fsa.attrFile & (FILE_HIDDEN | FILE_SYSTEM))
1464 hs++;
1465 if (fsa.attrFile & FILE_READONLY)
1466 ro++;
1467 }
1468 }
1469 if (!wk->li->list)
1470 break;
1471 if (fConfirmDelete || isdir || hs || ro) {
1472 memset(&cl, 0, sizeof(cl));
1473 cl.size = sizeof(cl);
1474 cl.list = wk->li->list;
1475 cl.prompt = prompt;
1476 cl.flags |= CHECK_FILES;
1477 cl.cmd = wk->li->type;
1478 sprintf(prompt,
1479 GetPString(IDS_DELPROMPT1TEXT),
1480 (wk->li->type == IDM_DELETE) ?
1481 NullStr :
1482 GetPString(IDS_PERMANENTLYTEXT),
1483 &"s"[wk->li->list[1] == NULL]);
1484 if (isdir) {
1485 sprintf(&prompt[strlen(prompt)],
1486 GetPString(IDS_DELPROMPT2TEXT),
1487 isdir,
1488 (isdir > 1) ?
1489 GetPString(IDS_ARETEXT) :
1490 GetPString(IDS_ISTEXT),
1491 (isdir == 1) ?
1492 GetPString(IDS_ATEXT) :
1493 NullStr,
1494 (isdir > 1) ?
1495 GetPString(IDS_IESTEXT) : GetPString(IDS_YTEXT));
1496 if (sysdir)
1497 sprintf(&prompt[strlen(prompt)],
1498 GetPString(IDS_DELPROMPT3TEXT),
1499 sysdir,
1500 (sysdir == 1) ?
1501 GetPString(IDS_YTEXT) : GetPString(IDS_IESTEXT));
1502 }
1503 if (ro)
1504 sprintf(&prompt[strlen(prompt)],
1505 GetPString(IDS_DELPROMPT4TEXT),
1506 ro,
1507 &"s"[ro == 1],
1508 (ro > 1) ?
1509 GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
1510 if (hs)
1511 sprintf(&prompt[strlen(prompt)],
1512 GetPString(IDS_DELPROMPT5TEXT),
1513 hs,
1514 &"s"[hs == 1],
1515 (hs > 1) ?
1516 GetPString(IDS_ARETEXT) : GetPString(IDS_ISTEXT));
1517 if (ro || hs || sysdir)
1518 DosBeep(300, 100); // Wake up user
1519 strcat(prompt, GetPString(IDS_DELPROMPT6TEXT));
1520 error = WinDlgBox(HWND_DESKTOP,
1521 wk->hwndFrame,
1522 CheckListProc,
1523 FM3ModHandle, CHECK_FRAME, MPFROMP(&cl));
1524 if (!error || error == 65535)
1525 break;
1526 wk->li->list = cl.list;
1527 if (!wk->li->list || !wk->li->list[0])
1528 break;
1529 }
1530 for (x = 0; wk->li->list[x]; x++) {
1531 fsa.attrFile = 0;
1532 DosError(FERR_DISABLEHARDERR);
1533 DosQueryPathInfo(wk->li->list[x],
1534 FIL_STANDARD,
1535 &fsa, (ULONG) sizeof(FILESTATUS3));
1536 if (fsa.attrFile & FILE_DIRECTORY) {
1537 sprintf(prompt,
1538 GetPString(IDS_DELETINGTEXT), wk->li->list[x]);
1539 AddNote(prompt);
1540 error = (APIRET) wipeallf("%s%s*",
1541 wk->li->list[x],
1542 (*wk->li->list[x] &&
1543 wk->li->
1544 list[x][strlen(wk->li->list[x]) -
1545 1] !=
1546 '\\') ? "\\" : NullStr);
1547 DosError(FERR_DISABLEHARDERR);
1548 if (!error)
1549 error = DosDeleteDir(wk->li->list[x]);
1550 else
1551 DosDeleteDir(wk->li->list[x]);
1552 }
1553 else {
1554 sprintf(prompt,
1555 GetPString(IDS_DELETINGTEXT), wk->li->list[x]);
1556 AddNote(prompt);
1557 DosError(FERR_DISABLEHARDERR);
1558 if (wk->li->type == IDM_DELETE)
1559 error = DosDelete(wk->li->list[x]);
1560 else
1561 error = DosForceDelete(wk->li->list[x]);
1562 if (error) {
1563 DosError(FERR_DISABLEHARDERR);
1564 make_deleteable(wk->li->list[x]);
1565 if (wk->li->type == IDM_DELETE)
1566 error = DosDelete(wk->li->list[x]);
1567 else
1568 error = DosForceDelete(wk->li->list[x]);
1569 }
1570 }
1571 if (error) {
1572 if (LogFileHandle)
1573 fprintf(LogFileHandle,
1574 GetPString(IDS_DELETEFAILED1TEXT),
1575 wk->li->list[x], error);
1576 if (Dos_Error(MB_ENTERCANCEL,
1577 error,
1578 wk->hwndFrame,
1579 pszSrcFile,
1580 __LINE__,
1581 GetPString(IDS_DELETEFAILED2TEXT),
1582 wk->li->list[x]) == MBID_CANCEL)
1583 break;
1584 }
1585 else {
1586 if (LogFileHandle)
1587 fprintf(LogFileHandle,
1588 GetPString(IDS_DELETEDTEXT), wk->li->list[x]);
1589 sprintf(prompt,
1590 GetPString(IDS_DELETEDTEXT), wk->li->list[x]);
1591 AddNote(prompt);
1592 }
1593 if (fSyncUpdates ||
1594 AddToList(wk->li->list[x], &files, &numfiles, &numalloc))
1595 Broadcast(hab2,
1596 wk->hwndCnr,
1597 UM_UPDATERECORD,
1598 MPFROMP(wk->li->list[x]), MPVOID);
1599 }
1600 }
1601 break;
1602 } // switch
1603 if (files) {
1604 Broadcast(hab2,
1605 wk->hwndCnr,
1606 UM_UPDATERECORDLIST, MPFROMP(files), MPVOID);
1607 FreeList(files);
1608 }
1609 if (WinIsWindow(hab2, wk->hwndCnr))
1610 PostMsg(wk->hwndCnr, UM_RESCAN, MPVOID, MPVOID);
1611
1612 WinDestroyMsgQueue(hmq2);
1613 }
1614 DecrThreadUsage();
1615 WinTerminate(hab2);
1616 }
1617 }
1618 if (wk->li)
1619 FreeListInfo(wk->li);
1620 xfree(wk, pszSrcFile, __LINE__);
1621# ifdef FORTIFY
1622 Fortify_LeaveScope();
1623# endif
1624 DosPostEventSem(CompactSem);
1625 }
1626}
1627#pragma alloc_text(MASSACTION,MassAction)
1628#pragma alloc_text(ACTION,Action)
1629#pragma alloc_text(UNDO,FreeUndo,Undo)
Note: See TracBrowser for help on using the repository browser.