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