source: trunk/dll/worker.c@ 1131

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

Some additional toolbar enhancements and fixes (tickets 273, 274, 275)

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