source: trunk/dll/worker.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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