source: trunk/dll/worker.c@ 1063

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

Fortify ifdef reformat

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