source: trunk/dll/worker.c@ 303

Last change on this file since 303 was 303, checked in by root, 19 years ago

29 May 06 SHL Comments

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