source: trunk/dll/arccnrs.c@ 358

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

Use Runtime_Error

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 128.2 KB
RevLine 
[27]1
2/***********************************************************************
3
4 $Id: arccnrs.c 358 2006-07-26 21:29:54Z root $
5
[123]6 Archive containers
7
[28]8 Copyright (c) 1993-98 M. Kimes
[300]9 Copyright (c) 2001, 2006 Steven H. Levine
[27]10
[130]11 11 Jun 02 SHL Ensure archive name not garbage
12 22 May 03 SHL ArcObjWndProc: fix UM_RESCAN now that we understand it
13 01 Aug 04 SHL Rework lstrip/rstrip usage
14 23 May 05 SHL Use QWL_USER
[156]15 25 May 05 SHL Rename comnam to szCommonName and fix typo
16 25 May 05 SHL Use ULONGLONG and CommaFmtULL
[212]17 05 Jun 05 SHL Drop obsolete, localize
18 05 Jun 05 SHL Correct last sort logic
19 05 Jun 05 SHL Use QWL_USER
[229]20 22 Jun 05 SHL ArcSort: correct typo in last sort fix
[249]21 13 Aug 05 SHL FillArcCnr: optimize
[300]22 08 Dec 05 SHL FillArcCnr: allow list start and end markers to be empty (i.e. tar)
23 08 Dec 05 SHL ArcCnrWndProc: suppress IDM_EXTRACT if no simple extract (i.e. tar)
24 30 Dec 05 SHL ArcCnrWndProc: correct date/time column display setup
25 29 May 06 SHL Comments
[358]26 14 Jul 06 SHL Use Runtime_Error
[27]27
28***********************************************************************/
29
[2]30#define INCL_DOS
31#define INCL_DOSERRORS
32#define INCL_WIN
33#define INCL_GPI
[156]34#define INCL_LONGLONG
35#include <os2.h>
[2]36
37#include <stdarg.h>
38#include <stdio.h>
39#include <stdlib.h>
40#include <string.h>
41#include <ctype.h>
42#include <time.h>
43#include <direct.h>
44#include <share.h>
45#include <limits.h>
[156]46
[2]47#include "fm3dll.h"
48#include "fm3dlg.h"
49#include "fm3str.h"
50#include "mle.h"
51
52#pragma data_seg(DATA1)
[358]53
54static INT DefArcSortFlags;
55static PSZ pszSrcFile = __FILE__;
56
[2]57#pragma alloc_text(ARCCNRS,ArcCnrWndProc,ArcObjWndProc,ArcClientWndProc)
58#pragma alloc_text(ARCCNRS,ArcTextProc,FillArcCnr,ArcFilter)
59#pragma alloc_text(ARCCNRS,ArcSort,ArcFrameWndProc,IsArcThere,ArcErrProc)
60#pragma alloc_text(STARTUP,StartArcCnr)
61
[212]62static MRESULT EXPENTRY ArcErrProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
[172]63{
[2]64 ARCDUMP *ad;
65
[172]66 switch (msg)
67 {
[2]68 case WM_INITDLG:
69 if(!mp2)
70 WinDismissDlg(hwnd,0);
71 else {
72 ad = (ARCDUMP *)mp2;
[130]73 WinSetWindowPtr(hwnd,QWL_USER,ad);
[2]74 if(ad->errmsg)
75 WinSetDlgItemText(hwnd,
76 ARCERR_TEXT,
77 ad->errmsg);
78 if(!ad->info->test)
79 WinEnableWindow(WinWindowFromID(hwnd,ARCERR_TEST),FALSE);
80 if(ad->listname) {
81 MLEsetlimit(WinWindowFromID(hwnd,ARCERR_MLE),-1L);
82 MLEsetformat(WinWindowFromID(hwnd,ARCERR_MLE),MLFIE_NOTRANS);
83 MLEsetcurpos(WinWindowFromID(hwnd,ARCERR_MLE),
84 MLEgetlen(WinWindowFromID(hwnd,ARCERR_MLE)));
85 MLEinsert(WinWindowFromID(hwnd,ARCERR_MLE),
86 GetPString(IDS_ARCHIVERREPORTTEXT));
87 MLEinsertfile(WinWindowFromID(hwnd,ARCERR_MLE),ad->listname);
88 }
89 }
90 break;
91
92 case WM_COMMAND:
93 switch(SHORT1FROMMP(mp1)) {
94 case DID_CANCEL:
95 WinDismissDlg(hwnd,0);
96 break;
97
98 case IDM_HELP:
99 if(hwndHelp)
100 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
101 MPFROM2SHORT(HELP_ARCERR,0),
102 MPFROMSHORT(HM_RESOURCEID));
103 break;
104
105 case DID_OK:
[130]106 ad = WinQueryWindowPtr(hwnd,QWL_USER);
[2]107 WinDlgBox(HWND_DESKTOP,hwnd,ArcReviewDlgProc,FM3ModHandle,
108 AD_FRAME,MPFROMP(ad));
109 WinDismissDlg(hwnd,0);
110 break;
111
112 case ARCERR_VIEW:
[130]113 ad = WinQueryWindowPtr(hwnd,QWL_USER);
[2]114 {
115 CHAR *list[2];
116
117 list[0] = ad->arcname;
118 list[1] = NULL;
119 if(TestBinary(ad->arcname)) {
120 if(*binview)
121 ExecOnList((HWND)0,binview,WINDOWED | SEPARATE,NULL,list,NULL);
122 else
123 StartMLEEditor(HWND_DESKTOP,16 + 4 + 1,ad->arcname,hwnd);
124 }
125 else {
126 if(*viewer)
127 ExecOnList((HWND)0,viewer,WINDOWED | SEPARATE |
128 ((fViewChild) ? CHILD : 0),
129 NULL,list,NULL);
130 else
131 StartMLEEditor(HWND_DESKTOP,8 + 4 + 1,ad->arcname,hwnd);
132 }
133 }
134 break;
135
136 case ARCERR_TEST:
[130]137 ad = WinQueryWindowPtr(hwnd,QWL_USER);
[2]138 runemf2(SEPARATEKEEP | WINDOWED | MAXIMIZED,
139 hwnd,NULL,NULL,"%s %s%s%s",ad->info->test,
140 ((needs_quoting(ad->arcname)) ? "\"" : NullStr),
141 ad->arcname,
142 ((needs_quoting(ad->arcname)) ? "\"" : NullStr));
143 break;
144 }
145 return 0;
146 }
147 return WinDefDlgProc(hwnd,msg,mp1,mp2);
148}
149
150
[212]151static SHORT APIENTRY ArcSort (PMINIRECORDCORE pmrc1,PMINIRECORDCORE pmrc2,PVOID pStorage)
[172]152{
[229]153 PARCITEM pai1 = (PARCITEM)pmrc1;
[212]154 PARCITEM pai2 = (PARCITEM)pmrc2;
155 DIRCNRDATA *pdcd = (DIRCNRDATA *)pStorage;
[2]156 SHORT ret = 0;
157 CHAR *pext,*ppext;
[212]158 INT sortFlags;
[2]159
[212]160 if (!pdcd)
161 {
162 HWND hwndCnr = pai1->hwndCnr;
163 pdcd = (DIRCNRDATA *)WinQueryWindowPtr(hwndCnr,QWL_USER);
[358]164 if (!pdcd) {
165 Runtime_Error(pszSrcFile, __LINE__, "no data");
[212]166 return ret;
167 }
168 }
169
170 sortFlags = pdcd->sortFlags; // Optimize
171
172 if(sortFlags) {
173 switch(sortFlags & (~SORT_REVERSE)) {
[2]174 case SORT_FIRSTEXTENSION:
[212]175 pext = strchr(pai1->szFileName,'.');
176 ppext = strchr(pai2->szFileName,'.');
[2]177 if(!pext)
178 pext = NullStr;
179 if(!ppext)
180 ppext = NullStr;
181 ret = stricmp(pext,ppext);
182 break;
183
184 case SORT_LASTEXTENSION:
[212]185 pext = strrchr(pai1->szFileName,'.');
186 ppext = strrchr(pai2->szFileName,'.');
[2]187 if(!pext)
188 pext = NullStr;
189 if(!ppext)
190 ppext = NullStr;
191 ret = stricmp(pext,ppext);
192 break;
193
194 case SORT_LWDATE:
[212]195 ret = (pai1->date.year < pai2->date.year) ? 1 :
196 (pai1->date.year > pai2->date.year) ? -1 :
197 (pai1->date.month < pai2->date.month) ? 1 :
198 (pai1->date.month > pai2->date.month) ? -1 :
199 (pai1->date.day < pai2->date.day) ? 1 :
200 (pai1->date.day > pai2->date.day) ? -1 :
201 (pai1->time.hours < pai2->time.hours) ? 1 :
202 (pai1->time.hours > pai2->time.hours) ? -1 :
203 (pai1->time.minutes < pai2->time.minutes) ? 1 :
204 (pai1->time.minutes > pai2->time.minutes) ? -1 :
205 (pai1->time.seconds < pai2->time.seconds) ? 1 :
206 (pai1->time.seconds > pai2->time.seconds) ? -1 : 0;
[2]207 break;
208
209 case SORT_SIZE:
[212]210 ret = (pai1->cbFile < pai2->cbFile) ? 1 : (pai1->cbFile == pai2->cbFile) ?
[2]211 0 : -1;
212 if(!ret)
[212]213 ret = (pai1->cbComp < pai2->cbComp) ? 1 : (pai1->cbComp == pai2->cbComp) ?
[2]214 0 : -1;
215 break;
216
217 case SORT_EASIZE:
[212]218 ret = (pai1->cbComp < pai2->cbComp) ? 1 : (pai1->cbComp == pai2->cbComp) ?
[2]219 0 : -1;
220 if(!ret)
[212]221 ret = (pai1->cbFile < pai2->cbFile) ? 1 : (pai1->cbFile == pai2->cbFile) ?
[2]222 0 : -1;
223 break;
224 }
225 if(!ret)
[212]226 ret = (SHORT)stricmp(pai1->szFileName,pai2->szFileName);
227 if(ret && (sortFlags & SORT_REVERSE))
[2]228 ret = (ret > 0) ? -1 : 1;
229 return ret;
230 }
[212]231 return (SHORT)stricmp(pai1->szFileName,pai2->szFileName);
[2]232}
233
234
[212]235static INT APIENTRY ArcFilter (PMINIRECORDCORE rmini,PVOID arg)
[172]236{
[2]237 DIRCNRDATA *dcd = (DIRCNRDATA *)arg;
238 PARCITEM r;
239 register INT x;
240 INT ret = FALSE;
241
242 if(dcd && *dcd->mask.szMask) {
243 r = (PARCITEM)rmini;
244 if(dcd->mask.pszMasks[1]) {
245 for(x = 0;dcd->mask.pszMasks[x];x++) {
246 if(*dcd->mask.pszMasks[x]) {
247 if(*dcd->mask.pszMasks[x] != '/') {
248 if(wildcard(r->szFileName,dcd->mask.pszMasks[x],FALSE))
249 ret = TRUE;
250 }
251 else {
252 if(wildcard(r->szFileName,dcd->mask.pszMasks[x] + 1,FALSE)) {
253 ret = FALSE;
254 break;
255 }
256 }
257 }
258 }
259 }
260 else {
261 if(wildcard(r->szFileName,dcd->mask.szMask,FALSE))
262 ret = TRUE;
263 }
264 }
265 else
266 ret = TRUE;
267 return ret;
268}
269
270
[212]271static MRESULT EXPENTRY ArcFrameWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
[172]272{
[2]273 return CommonFrameWndProc(ARC_CNR,hwnd,msg,mp1,mp2);
274}
275
276
[212]277static BOOL IsArcThere (HWND hwnd, CHAR *arcname)
[172]278{
[2]279 if(arcname) {
280 if(IsFile(arcname) != 1) {
281 saymsg(MB_CANCEL,hwnd,
282 GetPString(IDS_SAYWHATTEXT),
283 GetPString(IDS_ARCNOTTHERETEXT),
284 arcname);
285 return FALSE;
286 }
287 return TRUE;
288 }
289 return FALSE;
290}
291
292
[156]293static INT FillArcCnr (HWND hwndCnr,CHAR *arcname,ARC_TYPE **arcinfo,
[300]294 ULONGLONG *pullTotalBytes)
[44]295{
[2]296 FILE *fp;
[249]297 HFILE oldstdout;
298 HFILE newstdout;
[2]299 CHAR s[CCHMAXPATH * 2],lonename[CCHMAXPATH + 2],
300 *nsize,*osize,*fdate,*fname,*p,*pp,arctemp[33];
[300]301 BOOL gotstart;
302 BOOL gotend;
303 BOOL wasquote;
304 BOOL nomove = FALSE; // fixme to be gone?
[2]305 INT highest = 0,x,counter = 0,numarcfiles = 0;
[249]306 PARCITEM lastpai;
307 ARC_TYPE *info;
308 ARC_TYPE *tinfo;
[2]309 ULONG apptype;
[358]310 APIRET rc;
[2]311
312 if(!arcname || !arcinfo)
313 return 0;
[300]314
[2]315 info = *arcinfo;
316 if(!info)
[249]317 info = find_type(arcname,NULL);
[2]318 for(x = 0;x < 99;x++) {
319 sprintf(arctemp,"%s.%03x",ArcTempRoot,(clock() & 4095L));
320 if(IsFile(arctemp) == 1)
321 DosSleep(rand() % 100);
322 else
323 break;
324 }
[300]325
[2]326ReTry:
327
328#ifdef DEBUG
[27]329 if (info && info->id)
330 WinSetWindowText(WinQueryWindow(WinQueryWindow(hwndCnr,QW_PARENT),QW_PARENT),info->id);
[2]331#endif
332
333 tinfo = NULL;
334 numarcfiles = counter = highest = 0;
335 gotstart = gotend = FALSE;
336 lastpai = NULL;
[156]337 *pullTotalBytes = 0;
[358]338 if (!info || !info->list)
339 Runtime_Error(pszSrcFile, __LINE__, "no data");
340 else {
[2]341 WinSendMsg(hwndCnr,
342 CM_REMOVERECORD,
343 MPVOID,
344 MPFROM2SHORT(0,
345 CMA_FREE | CMA_INVALIDATE | CMA_ERASE));
346 *arcinfo = info;
347 highest = info->osizepos;
348 if(info->nsizepos > highest)
349 highest = info->nsizepos;
350 if(info->fdpos > highest)
351 highest = info->fdpos;
352 if(info->fnpos > highest)
353 highest = info->fnpos;
354 if(highest > 50)
355 saymsg(MB_ENTER | MB_ICONEXCLAMATION,HWND_DESKTOP,
356 GetPString(IDS_SHAMETEXT),
357 "%s",
358 GetPString(IDS_BUNGEDUPTEXT));
359 if(info->fnpos == -1)
360 highest = 32767;
[300]361
[2]362 DosError(FERR_DISABLEHARDERR);
363 DosForceDelete(arctemp);
364 DosError(FERR_DISABLEHARDERR);
[300]365
[2]366 strcpy(s,info->list);
367 p = strchr(s,' ');
368 if(p)
369 *p = 0;
370 DosError(FERR_DISABLEHARDERR);
371 if(!DosQAppType(s,&apptype) &&
372 ((apptype & FAPPTYP_DOS) ||
373 (apptype & FAPPTYP_WINDOWSREAL) ||
374 (apptype & FAPPTYP_WINDOWSPROT) ||
375 (apptype & 0x1000))) {
376 p = GetCmdSpec(TRUE);
377 runemf2(SEPARATE | INVISIBLE | MINIMIZED | BACKGROUND | WAIT,
378 hwndCnr,
379 NULL,
380 "DOS_BACKGROUND_EXECUTION=1",
381 "%s /C %s %s%s%s > %s",
382 p,
383 info->list,
384 (needs_quoting(arcname)) ? "\"" : NullStr,
385 arcname,
386 (needs_quoting(arcname)) ? "\"" : NullStr,
387 arctemp);
388 }
389 else {
[358]390 fp = xfopen(arctemp,"w",pszSrcFile,__LINE__);
391 if(!fp)
392 return 0;
393 else {
[2]394 newstdout = -1;
395 DosError(FERR_DISABLEHARDERR);
[358]396 rc = DosDupHandle(fileno(stdout),&newstdout);
397 if (rc) {
398 Dos_Error(MB_CANCEL,rc,hwndCnr,pszSrcFile,__LINE__,"DosDupHandle");
399 return 0;
400 }
401 else {
[2]402 oldstdout = fileno(stdout);
403 DosError(FERR_DISABLEHARDERR);
[358]404 rc = DosDupHandle(fileno(fp),&oldstdout);
405 if (rc)
406 {
407 Dos_Error(MB_CANCEL,rc,hwndCnr,pszSrcFile,__LINE__,"DosDupHandle");
408 return 0;
409 }
410 else {
[2]411 runemf2(SEPARATE | INVISIBLE | FULLSCREEN | BACKGROUND | WAIT,
412 hwndCnr,NULL,NULL,"%s %s%s%s",info->list,
413 (needs_quoting(arcname)) ? "\"" : NullStr,arcname,
414 (needs_quoting(arcname)) ? "\"" : NullStr);
415 oldstdout = fileno(stdout);
416 DosError(FERR_DISABLEHARDERR);
417 DosDupHandle(newstdout,&oldstdout);
418 DosClose(newstdout);
419 fclose(fp);
420 }
421 }
422 }
423 }
[300]424
[2]425 DosError(FERR_DISABLEHARDERR);
426 fp = _fsopen(arctemp,"r",SH_DENYWR);
[300]427
[358]428 if (fp) {
[300]429 gotstart = !info->startlist || !*info->startlist; // If list has no start marker
430
[2]431 while(!feof(fp) && !gotend) {
432 if(!fgets(s,CCHMAXPATH * 2,fp))
433 break;
434 s[(CCHMAXPATH * 2) - 1] = 0;
435 stripcr(s);
436 if(!gotstart) {
[300]437 if (!strcmp(s,info->startlist))
438 gotstart = TRUE;
[2]439 }
440 else if(info->endlist &&
441 !strcmp(s,info->endlist))
442 gotend = TRUE;
[300]443 else {
444 /* add to container */
[2]445 fname = NULL;
[123]446 bstrip(s);
[2]447 if(info->nameisfirst) {
448 strncpy(lonename,s,CCHMAXPATH + 2);
449 lonename[CCHMAXPATH + 1] = 0;
450 fname = lonename;
451 if(!fgets(s,CCHMAXPATH * 2,fp))
452 break;
453 s[(CCHMAXPATH * 2) - 1] = 0;
[123]454 bstripcr(s);
[2]455 if(*fname == '\"') {
456 memmove(fname,fname + 1,strlen(fname) + 1);
457 p = strchr(fname,'\"');
458 if(p)
459 *p = 0;
460 }
461 }
462 nsize = NULL;
463 osize = fdate = NullStr;
464 p = s;
465 for(x = 0;x <= highest;x++) {
466 pp = p;
467 while(*pp && (*pp == ' ' || *pp == '\t')) /* skip leading */
468 pp++;
469 if(!*pp)
470 break;
471 wasquote = FALSE;
472 p = pp;
473 while(*p && (wasquote ||
474 ((x != info->fnpos || !info->nameislast) ?
475 (*p != ' ' && *p != '\t') : TRUE))) {
476 if(*p == '\"') {
477 if(!wasquote) {
478 wasquote = TRUE;
479 memmove(p,p + 1,strlen(p));
480 while(*p == ' ' || *p == '\t')
481 p++;
482 }
483 else {
484 memmove(p,p + 1,strlen(p));
485 break;
486 }
487 }
488 else if(*p)
489 p++;
490 }
491 if(*p) {
492 *p = 0;
493 p++;
494 }
495 if(x == info->nsizepos)
496 nsize = pp;
497 else if(x == info->osizepos)
498 osize = pp;
499 else if(x == info->fdpos) {
500 fdate = pp;
501 if(info->fdflds > 1 &&
502 info->fdflds < 24) {
503
504 INT y;
505
506 if(*p) {
507 p--;
508 *p = ' ';
509 for(y = 0;y < info->fdflds - 1;y++) {
510 while(*p && (*p == ' ' || *p == '\t'))
511 p++;
512 while(*p && (*p != ' ' && *p != '\t'))
513 p++;
514 x++;
515 }
516 if(*p) {
517 *p = 0;
518 p++;
519 }
520 }
521 }
522 }
523 else if(x == info->fnpos) {
524 fname = pp;
525 if(pp && *pp == '*' && !*(pp + 1)) /* workaround for LH.EXE */
526 fname = NULL;
527 if(info->nameislast)
528 break;
529 }
530 else if((!p || !*p) && info->fnpos == -1) {
531 fname = pp;
532 break;
533 }
534 }
535 if(info->nameisnext) {
536 if(!fgets(lonename,CCHMAXPATH + 2,fp))
537 break;
538 lonename[CCHMAXPATH + 1] = 0;
[123]539 bstripcr(lonename);
[2]540 fname = lonename;
541 }
542 if(fname && *fname) {
543
544 RECORDINSERT ri;
545 PARCITEM pai;
546
547#ifdef DEBUG
[27]548 saymsg(MB_ENTER,hwndCnr,DEBUG_STRING,
549 "fname: %s\r\rpp: %s\r\rp: %s\r\rlonename: %s\r\rhighest: %ld\r\rx: %ld\r\rfdate: %s",
550 (fname) ? fname : "NULL",
551 (pp) ? pp : "NULL",
552 (p) ? p : "NULL",
553 lonename,
554 highest,
555 x,
556 (fdate) ? fdate : "NULL");
[2]557#endif
558
559 pai = WinSendMsg(hwndCnr,
560 CM_ALLOCRECORD,
561 MPFROMLONG(EXTRA_ARCRECORD_BYTES),
562 MPFROMLONG(1L));
[358]563 if (!pai) {
564 Runtime_Error(pszSrcFile, __LINE__, "CM_ALLOCRECORD");
565 break;
566 }
567 else {
[2]568 memset(pai,0,sizeof(ARCITEM));
569 pai->hwndCnr = hwndCnr;
[358]570 if (*fname == '*') {
[2]571 fname++;
572 pai->flags = ARCFLAGS_REALDIR;
573 }
574 if(fname[strlen(fname) - 1] == '\\' ||
575 fname[strlen(fname) - 1] == '/')
576 pai->flags = ARCFLAGS_REALDIR;
577 strcpy(pai->szFileName,fname);
578 if(fdate)
579 strcpy(pai->szDate,fdate);
580 pai->pszFileName = pai->szFileName;
581 pai->rc.pszIcon = pai->pszFileName;
582 pai->rc.hptrIcon = ((pai->flags & ARCFLAGS_REALDIR) != 0) ?
583 hptrDir :
584 hptrFile;
585 pai->pszDate = pai->szDate;
[358]586 if (osize)
[2]587 pai->cbFile = atol(osize);
[358]588 if (nsize)
[2]589 pai->cbComp = atol(nsize);
[358]590 if (info->datetype && fdate && *fdate)
[2]591 ArcDateTime(fdate,
592 info->datetype,
593 &pai->date,
594 &pai->time);
595 memset(&ri,0,sizeof(RECORDINSERT));
596 ri.cb = sizeof(RECORDINSERT);
597 ri.pRecordOrder = (PRECORDCORE) CMA_END;
598 ri.pRecordParent = (PRECORDCORE)NULL;
599 ri.zOrder = (USHORT)CMA_TOP;
600 ri.cRecordsInsert = 1L;
601 ri.fInvalidateRecord = FALSE;
[358]602 if (WinSendMsg(hwndCnr,
[2]603 CM_INSERTRECORD,
604 MPFROMP(pai),
605 MPFROMP(&ri)))
[358]606 {
[156]607 *pullTotalBytes += pai->cbFile;
[358]608 }
[2]609 if(!lastpai)
610 lastpai = pai;
611 numarcfiles++;
[358]612 if (!(++counter % 50)) {
[2]613 WinSendMsg(hwndCnr,
614 CM_INVALIDATERECORD,
615 lastpai,
616 MPFROM2SHORT(10,
617 CMA_ERASE | CMA_REPOSITION));
618 lastpai = pai;
619 }
620 }
621 }
622 }
[300]623 } // while !eof
624
[2]625 fclose(fp);
[300]626
627 if (!numarcfiles || !gotstart || (!gotend && info->endlist && *info->endlist))
[249]628 {
[2]629 ARCDUMP ad;
630
631 tinfo = info;
632 do {
633 tinfo = tinfo->next;
634 if(tinfo)
635 tinfo = find_type(arcname,tinfo);
636 if(tinfo) {
637 DosError(FERR_DISABLEHARDERR);
638 DosForceDelete(arctemp);
639 info = tinfo;
640 goto ReTry;
641 }
642 } while(tinfo);
[358]643 DosBeep(750,50); // fixme to know why?
[2]644 {
645 CHAR errstr[CCHMAXPATH + 256];
646
647 sprintf(errstr,GetPString(IDS_ARCERRORINFOTEXT),
648 arcname,
649 (!gotstart) ? GetPString(IDS_NOGOTSTARTTEXT) : NullStr,
650 (!numarcfiles) ? GetPString(IDS_NOARCFILESFOUNDTEXT) : NullStr,
651 (!gotend) ? GetPString(IDS_NOENDOFLISTTEXT) : NullStr);
652 memset(&ad,0,sizeof(ARCDUMP));
653 ad.info = info;
654 strcpy(ad.listname,arctemp);
655 strcpy(ad.arcname,arcname);
656 ad.errmsg = errstr;
657 WinDlgBox(HWND_DESKTOP,
658 hwndCnr,
659 ArcErrProc,
660 FM3ModHandle,
661 ARCERR_FRAME,
662 MPFROMP(&ad));
663 }
664 }
[249]665 else if (!nomove && tinfo) {
666 /* if we got a false hit, move working hit to top */
667 tinfo = info->next;
668 info->next = arcsighead;
669 arcsighead->prev = info;
670 if(tinfo)
671 tinfo->next->prev = info->prev;
672 info->prev->next = tinfo;
673 info->prev = NULL;
674 arcsighead = info;
[300]675 rewrite_archiverbb2(NULL); // Rewrite with warning
[2]676 }
[300]677 } // if opened
[2]678 DosError(FERR_DISABLEHARDERR);
679 DosForceDelete(arctemp);
680 }
681
682 return numarcfiles;
683}
684
685
[172]686MRESULT EXPENTRY ArcTextProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
687{
[2]688 static BOOL emphasized = FALSE;
689 static HWND hwndButtonPopup = (HWND)0;
690 static ULONG timestamp = ULONG_MAX;
691 static USHORT lastid = 0;
692
693 switch(msg) {
694 case WM_CREATE:
695 return CommonTextProc(hwnd,msg,mp1,mp2);
696
697 case WM_COMMAND:
698 return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
699 ARC_CNR),
700 msg,
701 mp1,
702 mp2);
703
704 case UM_CONTEXTMENU:
705 case WM_CONTEXTMENU:
706 {
707 USHORT id;
708
709 id = WinQueryWindowUShort(hwnd,QWS_ID);
710 switch(id) {
711 case DIR_SELECTED:
712 case DIR_VIEW:
713 case DIR_SORT:
714 {
715 POINTL ptl = {0,0};
716 SWP swp;
717 DIRCNRDATA *dcd;
718
719 if(hwndButtonPopup)
720 WinDestroyWindow(hwndButtonPopup);
721 if(id == DIR_SELECTED)
722 id = DIR_RESTORE;
723 if(id == lastid) {
724
725 ULONG check;
726
727 DosQuerySysInfo(QSV_MS_COUNT,QSV_MS_COUNT,&check,sizeof(check));
728 if(check < timestamp + 500) {
729 lastid = 0;
730 goto MenuAbort;
731 }
732 }
733 hwndButtonPopup = WinLoadMenu(HWND_DESKTOP,
734 FM3ModHandle,
735 id);
736 if(hwndButtonPopup) {
737 WinSetWindowUShort(hwndButtonPopup,
738 QWS_ID,
739 id);
740 dcd = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd,
741 QW_PARENT),
[212]742 ARC_CNR),
743 QWL_USER);
[2]744 if(id == DIR_SORT) {
745 if(dcd)
746 SetSortChecks(hwndButtonPopup,
747 dcd->sortFlags);
748 WinSendMsg(hwndButtonPopup,
749 MM_DELETEITEM,
750 MPFROM2SHORT(IDM_SORTNONE,
751 FALSE),
752 MPVOID);
753 WinSendMsg(hwndButtonPopup,
754 MM_DELETEITEM,
755 MPFROM2SHORT(IDM_SORTNAME,
756 FALSE),
757 MPVOID);
758 WinSendMsg(hwndButtonPopup,
759 MM_DELETEITEM,
760 MPFROM2SHORT(IDM_SORTLADATE,
761 FALSE),
762 MPVOID);
763 WinSendMsg(hwndButtonPopup,
764 MM_DELETEITEM,
765 MPFROM2SHORT(IDM_SORTCRDATE,
766 FALSE),
767 MPVOID);
768 WinSendMsg(hwndButtonPopup,
769 MM_DELETEITEM,
770 MPFROM2SHORT(IDM_SORTDIRSFIRST,
771 FALSE),
772 MPVOID);
773 WinSendMsg(hwndButtonPopup,
774 MM_DELETEITEM,
775 MPFROM2SHORT(IDM_SORTDIRSLAST,
776 FALSE),
777 MPVOID);
778 WinSendMsg(hwndButtonPopup,
779 MM_DELETEITEM,
780 MPFROM2SHORT(IDM_SORTSUBJECT,
781 FALSE),
782 MPVOID);
783 WinSendMsg(hwndButtonPopup,
784 MM_SETITEMTEXT,
785 MPFROM2SHORT(IDM_SORTEASIZE,0),
786 MPFROMP(GetPString(IDS_COMPRESSEDSIZEMENUTEXT)));
787 WinSendMsg(hwndButtonPopup,
788 MM_SETITEMTEXT,
789 MPFROM2SHORT(IDM_SORTLWDATE,0),
790 MPFROMP(GetPString(IDS_DATEMENUTEXT)));
791 }
792 ptl.x = 0;
793 if(WinPopupMenu(HWND_OBJECT,
794 HWND_OBJECT,
795 hwndButtonPopup,
796 -32767,
797 -32767,
798 0,
799 0)) {
800 WinQueryWindowPos(hwndButtonPopup,
801 &swp);
802 ptl.y = -(swp.cy + 2);
803 }
804 else {
805 WinQueryWindowPos(hwnd,
806 &swp);
807 ptl.y = swp.cy + 2;
808 }
809 if(WinPopupMenu(hwnd,
810 hwnd,
811 hwndButtonPopup,
812 ptl.x,
813 ptl.y,
814 0,
815 PU_HCONSTRAIN | PU_VCONSTRAIN |
816 PU_KEYBOARD | PU_MOUSEBUTTON1)) {
817 CenterOverWindow(hwndButtonPopup);
818 PaintRecessedWindow(hwnd,
819 (HPS)0,
820 FALSE,
821 FALSE);
822 }
823 }
824 }
825 break;
826 default:
827 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
828 ARC_CNR),
829 WM_CONTROL,
830 MPFROM2SHORT(ARC_CNR,
831 CN_CONTEXTMENU),
832 MPVOID);
833 break;
834 }
835 }
836MenuAbort:
837 if(msg == UM_CONTEXTMENU)
838 return 0;
839 break;
840
841 case WM_MENUEND:
842 if(hwndButtonPopup == (HWND)mp2) {
843 lastid = WinQueryWindowUShort((HWND)mp2,QWS_ID);
844 WinDestroyWindow(hwndButtonPopup);
845 hwndButtonPopup = (HWND)0;
846 DosQuerySysInfo(QSV_MS_COUNT,QSV_MS_COUNT,&timestamp,sizeof(timestamp));
847 switch(lastid) {
848 case DIR_VIEW:
849 case DIR_SORT:
850 case DIR_RESTORE:
851 case DIR_SELECTED:
852 PaintRecessedWindow(hwnd,(HPS)0,TRUE,FALSE);
853 break;
854 }
855 }
856 break;
857
858 case WM_MOUSEMOVE:
859 {
860 USHORT id = WinQueryWindowUShort(hwnd,QWS_ID);
861 char *s = NULL;
862
863 if(fOtherHelp) {
864 if((!hwndBubble ||
[130]865 WinQueryWindowULong(hwndBubble,QWL_USER) != hwnd) &&
[2]866 !WinQueryCapture(HWND_DESKTOP)) {
867 switch(id) {
868 case DIR_TOTALS:
869 s = GetPString(IDS_ARCCNRTOTALSHELPTEXT);
870 break;
871 case DIR_SELECTED:
872 s = GetPString(IDS_ARCCNRSELECTEDHELPTEXT);
873 break;
874 case DIR_VIEW:
875 s = GetPString(IDS_ARCCNRVIEWHELPTEXT);
876 break;
877 case DIR_SORT:
878 s = GetPString(IDS_DIRCNRSORTHELP);
879 break;
880 case DIR_FILTER:
881 s = GetPString(IDS_DIRCNRFILTERHELP);
882 break;
883 case DIR_FOLDERICON:
884 s = GetPString(IDS_ARCCNRFOLDERHELPTEXT);
885 break;
886 default:
887 break;
888 }
889 if(s)
890 MakeBubble(hwnd,TRUE,s);
891 else if(hwndBubble)
892 WinDestroyWindow(hwndBubble);
893 }
894 }
895 switch(id) {
896 case DIR_FILTER:
897 case DIR_SORT:
898 case DIR_VIEW:
899 case DIR_SELECTED:
900 case DIR_FOLDERICON:
901 return CommonTextButton(hwnd,msg,mp1,mp2);
902 }
903 }
904 break;
905
906 case WM_BUTTON3UP:
907 case WM_BUTTON1UP:
908 case WM_BUTTON1DOWN:
909 case WM_BUTTON3DOWN:
910 {
911 USHORT id;
912
913 id = WinQueryWindowUShort(hwnd,QWS_ID);
914 switch(id) {
915 case DIR_FILTER:
916 case DIR_SORT:
917 case DIR_VIEW:
918 case DIR_SELECTED:
919 case DIR_FOLDERICON:
920 return CommonTextButton(hwnd,msg,mp1,mp2);
921 }
922 }
923 break;
924
925 case UM_CLICKED:
926 case UM_CLICKED3:
927 {
928 USHORT id,cmd = 0;
929
930 id = WinQueryWindowUShort(hwnd,QWS_ID);
931 switch(id) {
932 case DIR_FOLDERICON:
933 switch(msg) {
934 case WM_BUTTON3CLICK:
935 case WM_CHORD:
936 cmd = IDM_RESCAN;
937 break;
938 default:
939 if((SHORT2FROMMP(mp2) & KC_ALT) != 0)
940 cmd = IDM_WINDOWDLG;
941 else
942 cmd = IDM_WALKDIR;
943 break;
944 }
945 break;
946 case DIR_VIEW:
947 case DIR_SORT:
948 case DIR_SELECTED:
949 PostMsg(hwnd,
950 UM_CONTEXTMENU,
951 MPVOID,
952 MPVOID);
953 break;
954 case DIR_FILTER:
955 cmd = IDM_FILTER;
956 break;
957 default:
958 break;
959 }
960 if(cmd)
961 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
962 ARC_CNR),
963 WM_COMMAND,
964 MPFROM2SHORT(cmd,0),
965 MPVOID);
966 }
967 return 0;
968
969 case WM_BEGINDRAG:
970 case DM_DROP:
971 case DM_DRAGOVER:
972 case DM_DRAGLEAVE:
973 case DM_DROPHELP:
974 if(msg == DM_DRAGOVER) {
975 if(!emphasized) {
976 emphasized = TRUE;
977 DrawTargetEmphasis(hwnd,emphasized);
978 }
979 }
980 else if(msg != WM_BEGINDRAG) {
981 if(emphasized) {
982 emphasized = FALSE;
983 DrawTargetEmphasis(hwnd,emphasized);
984 }
985 }
986 switch(WinQueryWindowUShort(hwnd,QWS_ID)) {
987 case DIR_FOLDERICON:
988 switch(msg) {
989 case DM_DRAGOVER:
990 if(AcceptOneDrop(mp1,mp2))
991 return MRFROM2SHORT(DOR_DROP,
992 DO_MOVE);
993 return MRFROM2SHORT(DOR_NODROP,0); /* Drop not valid */
994 case DM_DROPHELP:
995 DropHelp(mp1,
996 mp2,
997 hwnd,
998 GetPString(IDS_ARCCNRFOLDERDROPHELPTEXT));
999 return 0;
1000 case DM_DROP:
1001 {
1002 char szFrom[CCHMAXPATH + 2];
1003
1004 if(emphasized) {
1005 emphasized = FALSE;
1006 DrawTargetEmphasis(hwnd,emphasized);
1007 }
1008 if(GetOneDrop(mp1,mp2,szFrom,sizeof(szFrom)))
1009 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
1010 ARC_CNR),
1011 WM_COMMAND,
1012 MPFROM2SHORT(IDM_SWITCH,0),
1013 MPFROMP(szFrom));
1014 }
1015 return 0;
1016 default:
1017 return PFNWPStatic(hwnd,msg,mp1,mp2);
1018 }
1019 default:
1020 {
1021 CNRDRAGINFO cnd;
1022 USHORT dcmd;
1023
1024 switch(msg) {
1025 case DM_DROP:
1026 dcmd = CN_DROP;
1027 break;
1028 case DM_DRAGOVER:
1029 dcmd = CN_DRAGOVER;
1030 break;
1031 case DM_DRAGLEAVE:
1032 dcmd = CN_DRAGLEAVE;
1033 break;
1034 case DM_DROPHELP:
1035 dcmd = CN_DROPHELP;
1036 break;
1037 case WM_BEGINDRAG:
1038 dcmd = CN_INITDRAG;
1039 break;
1040 }
1041 cnd.pDragInfo = (PDRAGINFO)mp1;
1042 cnd.pRecord = NULL;
1043 return WinSendMsg(WinQueryWindow(hwnd,QW_PARENT),
1044 WM_CONTROL,
1045 MPFROM2SHORT(ARC_CNR,dcmd),
1046 MPFROMP(&cnd));
1047 }
1048 }
1049 }
1050 return PFNWPStatic(hwnd,msg,mp1,mp2);
1051}
1052
1053
1054MRESULT EXPENTRY ArcClientWndProc (HWND hwnd,ULONG msg,MPARAM mp1,
1055 MPARAM mp2) {
1056
1057 switch(msg) {
1058 case UM_CONTAINERHWND:
1059 return MRFROMLONG(WinWindowFromID(hwnd,ARC_CNR));
1060
1061 case UM_VIEWSMENU:
[300]1062 // fixme to disble menu items as needed
[2]1063 return MRFROMLONG(CheckMenu(&ArcCnrMenu,ARCCNR_POPUP));
1064
1065 case UM_FILESMENU:
[300]1066 // fixme to disble menu items as needed
[2]1067 return MRFROMLONG(CheckMenu(&ArcMenu,ARC_POPUP));
1068
1069 case MM_PORTHOLEINIT:
1070 case WM_INITMENU:
1071 case UM_INITMENU:
1072 case UM_COMMAND:
1073 case UM_LOADFILE:
1074 case UM_UPDATERECORD:
1075 case UM_UPDATERECORDLIST:
1076 case WM_COMMAND:
1077 case WM_CONTROL:
1078 case WM_CLOSE:
1079 return WinSendMsg(WinWindowFromID(hwnd,ARC_CNR),msg,mp1,mp2);
1080
1081 case WM_PSETFOCUS:
1082 case WM_SETFOCUS:
1083 if(mp2)
1084 PostMsg(hwnd,UM_FOCUSME,MPVOID,MPVOID);
1085 break;
1086
1087 case UM_FOCUSME:
1088 WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,ARC_CNR));
1089 break;
1090
1091 case WM_PAINT:
1092 {
1093 HPS hps;
1094 RECTL rcl;
1095
1096 hps = WinBeginPaint(hwnd,(HPS)0,NULL);
1097 if(hps) {
1098 WinQueryWindowRect(hwnd,&rcl);
1099 WinFillRect(hps,&rcl,CLR_PALEGRAY);
1100 CommonTextPaint(hwnd,hps);
1101 WinEndPaint(hps);
1102 }
1103 }
1104 break;
1105
1106 case UM_SIZE:
1107 case WM_SIZE:
1108 if(msg == UM_SIZE) {
1109
1110 SWP swp;
1111
1112 WinQueryWindowPos(hwnd,&swp);
1113 mp1 = MPFROM2SHORT(swp.cx,swp.cy);
1114 mp2 = MPFROM2SHORT(swp.cx,swp.cy);
1115 }
1116 {
1117 USHORT cx,cy,bx;
1118
1119 cx = SHORT1FROMMP(mp2);
1120 cy = SHORT2FROMMP(mp2);
1121 WinSetWindowPos(WinWindowFromID(hwnd,ARC_CNR),HWND_TOP,
1122 0,
1123 22,
1124 cx,
1125 cy - (24 + 22),
1126 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1127 WinSetWindowPos(WinWindowFromID(hwnd,ARC_EXTRACTDIR),HWND_TOP,
1128 0,
1129 0,
1130 cx,
1131 22,
1132 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1133 WinSetWindowPos(WinWindowFromID(hwnd,DIR_FOLDERICON),HWND_TOP,
1134 2,
1135 cy - 22,
1136 24,
1137 20,
1138 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1139 WinSetWindowPos(WinWindowFromID(hwnd,DIR_TOTALS),HWND_TOP,
1140 29,
1141 cy - 22,
1142 (cx / 3) - 2,
1143 20,
1144 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1145 WinSetWindowPos(WinWindowFromID(hwnd,DIR_SELECTED),HWND_TOP,
1146 29 + (cx / 3) + 2,
1147 cy - 22,
1148 (cx / 3) - 2,
1149 20,
1150 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1151 bx = (cx - (29 + (((cx / 3) + 2) * 2))) / 3;
1152 WinSetWindowPos(WinWindowFromID(hwnd,DIR_VIEW),HWND_TOP,
1153 29 + (((cx / 3) + 2) * 2),
1154 cy - 22,
1155 bx - 4,
1156 20,
1157 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1158 WinSetWindowPos(WinWindowFromID(hwnd,DIR_SORT),HWND_TOP,
1159 29 + (((cx / 3) + 2) * 2) + bx,
1160 cy - 22,
1161 bx - 4,
1162 20,
1163 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1164 WinSetWindowPos(WinWindowFromID(hwnd,DIR_FILTER),HWND_TOP,
1165 29 + (((cx / 3) + 2) * 2) + (bx * 2),
1166 cy - 22,
1167 bx - 4,
1168 20,
1169 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1170 }
1171 CommonTextPaint(hwnd,(HPS)0);
1172 if(msg == UM_SIZE) {
1173 WinSetWindowPos(WinQueryWindow(hwnd,QW_PARENT),HWND_TOP,0,0,0,0,
1174 SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE);
1175 return 0;
1176 }
1177 break;
1178 }
1179 return WinDefWindowProc(hwnd,msg,mp1,mp2);
1180}
1181
1182
[172]1183MRESULT EXPENTRY ArcObjWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
1184{
[2]1185 DIRCNRDATA *dcd;
[358]1186 PSZ psz;
[2]1187
1188 switch(msg) {
1189 case DM_PRINTOBJECT:
1190 case DM_DISCARDOBJECT:
1191 dcd = INSTDATA(hwnd);
1192 if(dcd) {
1193
1194 LISTINFO *li;
1195 CNRDRAGINFO cni;
1196
1197 cni.pRecord = NULL;
1198 cni.pDragInfo = (PDRAGINFO)mp1;
1199 li = DoFileDrop(dcd->hwndCnr,
1200 dcd->directory,
1201 FALSE,
1202 MPVOID,
1203 MPFROMP(&cni));
1204 if(li) {
1205 li->type = (msg == DM_DISCARDOBJECT) ?
1206 IDM_DELETE :
1207 IDM_PRINT;
1208 if(!li->list ||
1209 !li->list[0] ||
1210 !PostMsg(hwnd,
1211 UM_ACTION,
1212 MPFROMP(li),
1213 MPVOID))
1214 FreeListInfo(li);
1215 else
1216 return MRFROMLONG(DRR_SOURCE);
1217 }
1218 }
1219 return MRFROMLONG(DRR_TARGET);
1220
1221 case DM_RENDERPREPARE:
1222 return (MRESULT)TRUE;
1223
1224 case DM_RENDER:
[130]1225 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]1226 if(dcd && dcd->info && dcd->info->extract && dcd->arcname) {
1227
1228 PDRAGTRANSFER pdt = (PDRAGTRANSFER)mp1;
1229 CHAR filename[CCHMAXPATH];
1230 ULONG len;
1231
1232 if(pdt->hwndClient && pdt->pditem && pdt->hstrSelectedRMF &&
[358]1233 pdt->hstrRenderToName)
1234 {
1235 if (pdt->usOperation == DO_COPY || pdt->usOperation == DO_MOVE) {
1236 *filename = 0;
1237 len = DrgQueryStrName(pdt->hstrSelectedRMF,CCHMAXPATH,filename);
1238 filename[len] = 0;
1239 if (!strnicmp(filename,"OS2FILE,",8)) {
1240 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"RMF = \"%s\"",filename);
1241 }
1242 else {
1243 *filename = 0;
1244 len = DrgQueryStrName(pdt->hstrRenderToName,CCHMAXPATH,filename);
1245 filename[len] = 0;
1246 if(len && *filename) {
1247 psz = xstrdup(filename,pszSrcFile,__LINE__);
1248 if (psz) {
1249 PostMsg(hwnd,UM_RENDER,MPFROMP(pdt),MPFROMP(psz));
1250 return (MRESULT)TRUE;
1251 }
1252 }
1253 else {
1254 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"No render-to name given.");
1255 }
1256 }
1257 }
1258 pdt->fsReply = DMFL_RENDERRETRY;
[2]1259 }
1260 }
1261 return(MRESULT)FALSE;
1262
1263 case UM_RENDER:
1264 {
1265 PDRAGTRANSFER pdt = (PDRAGTRANSFER)mp1;
1266 USHORT usRes = DMFL_RENDERFAIL;
1267
[130]1268 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]1269 if(dcd && dcd->info && dcd->info->extract && dcd->arcname) {
1270
1271 CHAR *filename = (CHAR *)mp2,*p;
1272 ULONG len;
1273 CHAR membername[CCHMAXPATH],construct[CCHMAXPATH * 2];
1274
1275 *membername = 0;
1276 len = DrgQueryStrName(pdt->pditem->hstrSourceName,
1277 CCHMAXPATH,membername);
1278 membername[len] = 0;
1279 if(*membername && len && filename) {
1280 unlinkf("%s",filename);
1281 strcpy(construct,filename);
1282 p = strrchr(filename,'\\');
1283 if(!p)
1284 *construct = 0;
1285 else {
1286 if(p == filename || *(p - 1) == ':')
1287 p++;
1288 *p = 0;
1289 }
[110]1290 // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"%s %s %s\r[%s]",dcd->info->extract,dcd->arcname,membername,construct);
[2]1291 runemf2(SEPARATE | WINDOWED | WAIT |
1292 ((fArcStuffVisible) ? 0 : (BACKGROUND | MINIMIZED)) |
1293 WAIT,dcd->hwndClient,construct,NULL,"%s %s%s%s %s%s%s",
1294 dcd->info->extract,
1295 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
1296 dcd->arcname,
1297 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
1298 (needs_quoting(membername)) ? "\"" : NullStr,
1299 membername,
1300 (needs_quoting(membername)) ? "\"" : NullStr);
1301 if(*construct && construct[strlen(construct) - 1] != '\\')
1302 strcat(construct,"\\");
1303 strcat(construct,membername);
1304 if(IsFile(construct) != -1) {
1305 rename(construct,filename);
1306 unlinkf("%s",construct);
1307 if(IsFile(filename) != -1)
1308 usRes = DMFL_RENDEROK;
1309 }
1310 }
1311 }
1312 if(mp2)
1313 free((CHAR *)mp2);
1314 PostMsg(pdt->hwndClient,DM_RENDERCOMPLETE,MPFROMP(pdt),
1315 MPFROM2SHORT(usRes,0));
1316 }
1317 return 0;
1318
1319 case UM_SETUP:
[130]1320 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]1321 if(dcd) {
1322 /* set unique id */
1323 WinSetWindowUShort(hwnd,QWS_ID,ARCOBJ_FRAME + (ARC_FRAME - dcd->id));
[123]1324 dcd->hwndObject = hwnd; // pass back hwnd
[2]1325 if(ParentIsDesktop(hwnd,dcd->hwndParent))
[156]1326 DosSleep(250); // Avoid race?
[2]1327 }
1328 else
1329 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID);
1330 return 0;
1331
1332 case UM_RESCAN:
1333 /*
1334 * populate container
1335 */
[130]1336 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]1337 if(dcd) {
1338 if(mp1)
[61]1339 strcpy(dcd->arcname,(CHAR *)mp1); // Update name on request
[2]1340 WinSetWindowText(dcd->hwndFrame,"AV/2");
[61]1341 WinSetWindowText(WinWindowFromID(dcd->hwndFrame,FID_TITLEBAR),dcd->arcname);
[156]1342 dcd->ullTotalBytes = dcd->totalfiles =
[2]1343 dcd->selectedfiles = dcd->selectedbytes = 0;
1344 WinSetDlgItemText(dcd->hwndClient,DIR_TOTALS,"0");
1345 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,"0 / 0k");
1346 dcd->totalfiles = FillArcCnr(dcd->hwndCnr,
1347 dcd->arcname,
1348 &dcd->info,
[156]1349 &dcd->ullTotalBytes);
[2]1350 if(!dcd->totalfiles)
1351 PostMsg(dcd->hwndCnr,
1352 WM_CLOSE,
1353 MPVOID,
1354 MPVOID);
1355 else {
1356 dcd->arcfilled = TRUE;
1357 if(!PostMsg(dcd->hwndCnr,
1358 UM_RESCAN,
1359 MPVOID,
1360 MPVOID))
1361 WinSendMsg(dcd->hwndCnr,
1362 UM_RESCAN,
1363 MPVOID,
1364 MPVOID);
1365 PostMsg(dcd->hwndCnr,
1366 UM_SETUP2,
1367 MPVOID,
1368 MPVOID);
1369 WinSendMsg(dcd->hwndCnr,
1370 CM_INVALIDATERECORD,
1371 MPVOID,
1372 MPFROM2SHORT(0,CMA_ERASE | CMA_REPOSITION));
1373 }
1374 }
1375 return 0;
1376
1377 case UM_SELECT:
[130]1378 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]1379 if(dcd) {
1380 switch(SHORT1FROMMP(mp1)) {
1381 case IDM_SELECTALL:
1382 case IDM_SELECTALLFILES:
1383 SelectAll(dcd->hwndCnr,TRUE,TRUE,NULL,NULL,FALSE);
1384 break;
1385 case IDM_DESELECTALL:
1386 case IDM_DESELECTALLFILES:
1387 DeselectAll(dcd->hwndCnr,TRUE,TRUE,NULL,NULL,FALSE);
1388 break;
1389 case IDM_DESELECTMASK:
1390 case IDM_SELECTMASK:
1391 {
1392 MASK mask;
1393 PARCITEM pci = (PARCITEM)mp2;
1394
1395 memset(&mask,0,sizeof(MASK));
1396 mask.fNoAttribs = TRUE;
1397 mask.fNoDirs = TRUE;
1398 strcpy(mask.prompt,
1399 GetPString((SHORT1FROMMP(mp1) == IDM_SELECTMASK) ?
1400 IDS_SELECTFILTERTEXT :
1401 IDS_DESELECTFILTERTEXT));
1402 if(pci && (INT)pci != -1)
1403 strcpy(mask.szMask,pci->szFileName);
1404 if(WinDlgBox(HWND_DESKTOP,dcd->hwndCnr,PickMaskDlgProc,
1405 FM3ModHandle,MSK_FRAME,MPFROMP(&mask))) {
1406 if(SHORT1FROMMP(mp1) == IDM_SELECTMASK)
1407 SelectAll(dcd->hwndCnr,TRUE,TRUE,mask.szMask,NULL,FALSE);
1408 else
1409 DeselectAll(dcd->hwndCnr,TRUE,TRUE,mask.szMask,NULL,FALSE);
1410 }
1411 }
1412
1413 case IDM_INVERT:
1414 InvertAll(dcd->hwndCnr);
1415 break;
1416 }
1417 }
1418 return 0;
1419
1420 case UM_ENTER:
[130]1421 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]1422 if(dcd) {
1423
1424 CHAR *s = (CHAR *)mp1,*p,*pp,filename[CCHMAXPATH];
1425
1426 if(s) {
[358]1427 if (!dcd->info->extract) {
1428 Runtime_Error(pszSrcFile, __LINE__, "no extract");
[2]1429 free(s);
1430 return 0;
1431 }
1432 runemf2(SEPARATE | WINDOWED |
1433 ((fArcStuffVisible) ? 0 : (BACKGROUND | MINIMIZED)) |
1434 WAIT,dcd->hwndClient,dcd->workdir,NULL,"%s %s%s%s %s%s%s",
1435 ((dcd->info->exwdirs) ? dcd->info->exwdirs :
1436 dcd->info->extract),
1437 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
1438 dcd->arcname,
1439 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
1440 (needs_quoting(s)) ? "\"" : NullStr,
1441 s,
1442 (needs_quoting(s)) ? "\"" : NullStr);
1443
1444 if(!dcd->info->exwdirs) {
1445 p = s;
1446 p = strrchr(s,'\\');
1447 pp = strrchr(s,'/');
1448 if(p && pp)
1449 p = max(p,pp);
1450 else if(!p)
1451 p = pp;
1452 if(p)
1453 memmove(s,p + 1,strlen(p + 1));
1454 }
1455 sprintf(filename,"%s\\%s",dcd->workdir,s);
1456 p = filename;
1457 while(*p) {
1458 if(*p == '/')
1459 *p = '\\';
1460 p++;
1461 }
1462 free(s);
1463 if(IsFile(filename) == 1)
1464 WinSendMsg(dcd->hwndCnr,UM_ENTER,MPFROMP(filename),MPVOID);
1465 }
1466 }
1467 return 0;
1468
1469 case UM_COMMAND:
1470 if(mp1) {
1471 if(PostMsg(hwnd,UM_ACTION,mp1,mp2))
1472 return (MRESULT)TRUE;
1473 }
1474 return 0;
1475
1476 case UM_ACTION:
1477 DosError(FERR_DISABLEHARDERR);
[130]1478 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]1479 if(dcd) {
1480
1481 LISTINFO *li = (LISTINFO *)mp1;
1482 register INT x;
1483
1484 if(li && li->list && li->list[0]) {
1485 switch(li->type) {
1486 case IDM_ARCHIVE:
1487 case IDM_ARCHIVEM:
1488 {
1489 DIRCNRDATA ad;
1490 CHAR szBuffer[1025],*p;
1491
[358]1492 if (!li->list[1] && !stricmp(li->list[0],dcd->arcname)) {
1493 Runtime_Error(pszSrcFile, __LINE__, "arc to self");
[2]1494 break;
1495 }
1496 ad = *dcd;
1497 ad.namecanchange = 0;
1498 ad.fmoving = (li->type == IDM_ARCHIVEM);
1499 if(!WinDlgBox(HWND_DESKTOP,dcd->hwndClient,
1500 ArchiveDlgProc,FM3ModHandle,
1501 ARCH_FRAME,(PVOID)&ad) ||
1502 !*ad.arcname ||
1503 !*ad.command) /* we blew it */
1504 break;
1505 /* build the sucker */
1506 strcpy(szBuffer,ad.command);
1507 strcat(szBuffer," ");
1508 if(needs_quoting(ad.arcname))
1509 strcat(szBuffer,"\"");
1510 strcat(szBuffer,ad.arcname);
1511 if(needs_quoting(ad.arcname))
1512 strcat(szBuffer,"\"");
1513 p = &szBuffer[strlen(szBuffer)];
1514 if(ad.mask.szMask) {
1515 strcat(szBuffer," ");
1516 if(needs_quoting(ad.mask.szMask))
1517 strcat(szBuffer,"\"");
1518 strcat(szBuffer,ad.mask.szMask);
1519 if(needs_quoting(ad.mask.szMask))
1520 strcat(szBuffer,"\"");
1521 }
1522 strcat(szBuffer," ");
1523 x = 0;
1524 while(li->list[x]) {
1525 if(needs_quoting(li->list[x]))
1526 strcat(szBuffer,"\"");
1527 strcat(szBuffer,li->list[x]);
1528 if(!IsFile(li->list[x])) {
1529 if(szBuffer[strlen(szBuffer) - 1] != '\\')
1530 strcat(szBuffer,"\\");
1531 strcat(szBuffer,"*");
1532 }
1533 if(needs_quoting(li->list[x]))
1534 strcat(szBuffer,"\"");
1535 x++;
1536 if(!li->list[x] || strlen(szBuffer) +
1537 strlen(li->list[x]) + 5 > 1024) {
1538 runemf2(SEPARATE | WINDOWED |
1539 ((fArcStuffVisible) ? 0 :
1540 (BACKGROUND | MINIMIZED)) |
1541 WAIT,hwnd,NULL,NULL,"%s",szBuffer);
1542 *p = 0;
1543 }
1544 strcat(szBuffer," ");
1545 }
1546 PostMsg(dcd->hwndCnr,
1547 UM_RESCAN,
1548 MPFROMSHORT(1),
1549 MPVOID);
1550 Broadcast(WinQueryAnchorBlock(hwnd),
1551 hwndMain,
1552 UM_UPDATERECORD,
1553 MPFROMP(ad.arcname),
1554 MPVOID);
1555 Broadcast(WinQueryAnchorBlock(hwnd),
1556 hwndMain,
1557 UM_UPDATERECORDLIST,
1558 MPFROMP(li->list),
1559 MPVOID);
1560 }
1561 break;
1562
1563 case IDM_REFRESH:
1564 case IDM_DELETE:
1565 {
1566 CHAR cl[1001],*endofit;
1567 INT z;
1568 CHECKLIST ck;
1569 CHAR prompt[CCHMAXPATH + 257];
1570
1571 if(!dcd->info->delete)
1572 break;
1573 memset(&ck,0,sizeof(ck));
1574 ck.size = sizeof(ck);
1575 ck.list = li->list;
1576 ck.cmd = li->type;
1577 ck.prompt = prompt;
1578 sprintf(prompt,GetPString(IDS_ARCCNRDELREFTEXT),
1579 (li->type == IDM_DELETE) ?
1580 GetPString(IDS_DELETELOWERTEXT) :
1581 GetPString(IDS_REFRESHLOWERTEXT),
1582 &"s"[li->list[1] == NULL],
1583 dcd->arcname,
1584 (li->type == IDM_DELETE) ?
1585 GetPString(IDS_DELETELOWERTEXT) :
1586 GetPString(IDS_REFRESHLOWERTEXT));
1587 if(!WinDlgBox(HWND_DESKTOP,hwnd,CheckListProc,
1588 FM3ModHandle,
1589 CHECK_FRAME,MPFROMP(&ck)))
1590 break;
1591 li->list = ck.list;
1592 if(!li->list || !li->list[0])
1593 break;
1594 if(li->type == IDM_DELETE)
1595 sprintf(cl,"%s %s%s%s",dcd->info->delete,
1596 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
1597 dcd->arcname,
1598 (needs_quoting(dcd->arcname)) ? "\"" : NullStr);
1599 else
1600 sprintf(cl,"%s %s%s%s",dcd->info->create,
1601 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
1602 dcd->arcname,
1603 (needs_quoting(dcd->arcname)) ? "\"" : NullStr);
1604 endofit = &cl[strlen(cl)];
1605 z = 0;
1606 do {
1607 for(x = z;li->list[x] &&
1608 strlen(cl) + strlen(li->list[x]) < 999;x++) {
1609 strcat(cl," ");
1610 if(needs_quoting(li->list[x]))
1611 strcat(cl,"\"");
1612 strcat(cl,li->list[x]);
1613 if(needs_quoting(li->list[x]))
1614 strcat(cl,"\"");
1615 }
1616 z = x;
1617 runemf2(SEPARATE | WINDOWED |
1618 ((fArcStuffVisible) ? 0 : (BACKGROUND | MINIMIZED)) |
1619 WAIT,hwnd,NullStr,NULL,"%s",cl);
1620 *endofit = 0;
1621 } while(li->list[x]);
1622 PostMsg(dcd->hwndCnr,
1623 UM_RESCAN,
1624 MPFROMSHORT(1),
1625 MPVOID);
1626 Broadcast(WinQueryAnchorBlock(hwnd),
1627 hwndMain,
1628 UM_UPDATERECORD,
1629 MPFROMP(dcd->arcname),
1630 MPVOID);
1631 }
1632 break;
1633
1634 case IDM_PRINT:
1635 case IDM_VIRUSSCAN:
1636 case IDM_VIEW:
1637 case IDM_MCIPLAY:
1638 case IDM_VIEWARCHIVE:
1639 case IDM_VIEWTEXT:
1640 case IDM_VIEWBINARY:
1641 case IDM_EDIT:
1642 case IDM_EDITTEXT:
1643 case IDM_EDITBINARY:
1644 case IDM_EXEC:
1645 case IDM_EXTRACTWDIRS:
1646 case IDM_EXTRACT:
1647 {
1648 CHAR cl[1001],*endofit,*ptr;
1649 INT z;
1650
1651 if((li->type == IDM_EXTRACT && !li->info->extract) ||
1652 ((li->type == IDM_VIEW || li->type == IDM_VIEWTEXT ||
1653 li->type == IDM_VIEWBINARY || li->type == IDM_EDIT ||
1654 li->type == IDM_VIEWARCHIVE || li->type == IDM_EDITTEXT ||
1655 li->type == IDM_EDITBINARY || li->type == IDM_MCIPLAY) &&
1656 (!li->info->extract && !li->info->exwdirs)) ||
1657 (li->type != IDM_EXTRACT && li->type != IDM_EDIT &&
1658 li->type != IDM_VIEW && li->type != IDM_VIEWTEXT &&
1659 li->type != IDM_VIEWBINARY &&
1660 li->type != IDM_VIEWARCHIVE &&
1661 li->type != IDM_EDITTEXT &&
1662 li->type != IDM_EDITBINARY &&
1663 li->type != IDM_MCIPLAY &&
1664 !li->info->exwdirs)) {
[358]1665 Runtime_Error(pszSrcFile, __LINE__, "no cmd for request");
[2]1666 break;
1667 }
1668 if(li->type == IDM_EXTRACT || li->type == IDM_EXTRACTWDIRS) {
1669
1670 CHAR fullname[CCHMAXPATH * 2];
1671 CHAR **exfiles = NULL;
1672 INT numfiles = 0,numalloc = 0;
1673
1674 for(x = 0;li->list[x];x++) {
1675 sprintf(fullname,"%s%s%s",
1676 li->targetpath,
1677 (li->targetpath[strlen(li->targetpath) - 1] == '\\') ?
1678 NullStr : "\\",
1679 li->list[x]);
1680 if(IsFile(fullname) != -1) {
1681 AddToList(li->list[x],&exfiles,&numfiles,
1682 &numalloc);
1683 li->list = RemoveFromList(li->list,li->list[x]);
1684 if(!li->list)
1685 break;
1686 x--;
1687 }
1688 }
1689 if(exfiles && numfiles) {
1690
1691 CHECKLIST ckl;
1692 CHAR prompt[(CCHMAXPATH * 2) + 256];
1693
1694 memset(&ckl,0,sizeof(ckl));
1695 ckl.size = sizeof(ckl);
1696 ckl.list = exfiles;
1697 ckl.prompt = prompt;
1698 ckl.cmd = li->type;
1699 sprintf(prompt,
1700 GetPString(IDS_REPLACEWARNTEXT),
1701 &"s"[numfiles == 1],
1702 li->arcname,
1703 &"s"[numfiles != 1],
1704 li->targetpath);
1705 if(!WinDlgBox(HWND_DESKTOP,hwnd,CheckListProc,
1706 FM3ModHandle,
1707 CHECK_FRAME,MPFROMP(&ckl))) {
1708 if(ckl.list)
1709 FreeList(ckl.list);
1710 break;
1711 }
1712 else if(ckl.list)
1713 li->list = CombineLists(li->list,ckl.list);
1714 }
1715 }
1716 if(!li->list || !li->list[0])
1717 break;
1718 sprintf(cl,"%s %s%s%s",(li->type == IDM_EXTRACT ||
1719 ((li->type == IDM_VIEW || li->type == IDM_VIEWTEXT ||
1720 li->type == IDM_VIEWBINARY ||
1721 li->type == IDM_VIEWARCHIVE ||
1722 li->type == IDM_PRINT || li->type == IDM_EDIT ||
1723 li->type == IDM_EDITTEXT ||
1724 li->type == IDM_EDITBINARY &&
1725 li->type == IDM_MCIPLAY) &&
1726 !li->info->exwdirs)) ?
1727 li->info->extract : li->info->exwdirs,
1728 (needs_quoting(li->arcname)) ? "\"" : NullStr,
1729 li->arcname,
1730 (needs_quoting(li->arcname)) ? "\"" : NullStr);
1731 endofit = &cl[strlen(cl)];
1732 z = 0;
1733 do {
1734 for(x = z;li->list[x] &&
1735 strlen(cl) + strlen(li->list[x]) < 999;x++) {
1736 strcat(cl," ");
1737 if(needs_quoting(li->list[x]))
1738 strcat(cl,"\"");
1739 strcat(cl,li->list[x]);
1740 if(needs_quoting(li->list[x]))
1741 strcat(cl,"\"");
1742 ptr = li->list[x];
1743 while(*ptr) {
1744 if(*ptr == '/')
1745 *ptr = '\\';
1746 ptr++;
1747 }
1748 }
1749 z = x;
1750 runemf2(SEPARATE | WINDOWED |
1751 ((fArcStuffVisible) ? 0 : (BACKGROUND | MINIMIZED)) |
1752 WAIT,hwnd,li->targetpath,NULL,"%s",cl);
1753 *endofit = 0;
1754 } while(li->list[x]);
1755 if(li->type == IDM_EXTRACT || li->type == IDM_EXTRACTWDIRS) {
1756 /* update windows */
1757 for(x = 0;li->list[x];x++) {
1758
1759 CHAR *temp,*p;
1760
1761 temp = li->list[x];
1762 p = temp;
1763 while(*p) {
1764 if(*p == '/')
1765 *p = '\\';
1766 p++;
1767 }
[358]1768 p = xmalloc(strlen(temp) + strlen(li->targetpath) + 2,pszSrcFile,__LINE__);
1769 if (p) {
[2]1770 strcpy(p,li->targetpath);
1771 if(p[strlen(p) - 1] != '\\')
1772 strcat(p,"\\");
1773 strcat(p,temp);
1774 li->list[x] = p;
1775 free(temp);
1776 }
1777 }
[358]1778 if (fFolderAfterExtract) {
[2]1779
1780 CHAR objectpath[CCHMAXPATH],*p;
1781 APIRET rc;
1782
1783 GetDesktopName(objectpath,sizeof(objectpath));
1784 rc = WinDlgBox(HWND_DESKTOP,dcd->hwndParent,ObjCnrDlgProc,
1785 FM3ModHandle,OBJCNR_FRAME,
1786 MPFROMP(objectpath));
1787 if(rc) {
1788 if(rc > 1)
1789 strcpy(objectpath,"<WP_DESKTOP>");
1790 p = NULL;
1791 if(li->arcname) {
1792 p = strrchr(li->arcname,'\\');
1793 if(p)
1794 p++;
1795 }
1796 MakeShadows(dcd->hwndParent,li->list,2,objectpath,p);
1797 }
1798 }
1799 Broadcast(WinQueryAnchorBlock(hwnd),
1800 hwndMain,
1801 UM_UPDATERECORDLIST,
1802 MPFROMP(li->list),
1803 MPVOID);
1804 }
1805 else if(li->type == IDM_EXEC)
1806 ExecOnList(hwnd,
1807 li->runfile,
1808 WINDOWED | SEPARATEKEEP | PROMPT,
1809 li->targetpath,
1810 NULL,
1811 GetPString(IDS_EXECARCFILETITLETEXT));
1812 else if(li->type == IDM_VIRUSSCAN)
1813 ExecOnList(hwnd,virus,PROMPT | WINDOWED | SEPARATEKEEP,
1814 li->targetpath,NULL,
1815 GetPString(IDS_VIRUSSCANARCHIVETITLETEXT));
1816 else if(li->type == IDM_VIEW || li->type == IDM_VIEWTEXT ||
1817 li->type == IDM_VIEWBINARY || li->type == IDM_EDIT ||
1818 li->type == IDM_EDITTEXT ||
1819 li->type == IDM_VIEWARCHIVE ||
1820 li->type == IDM_EDITBINARY ||
1821 li->type == IDM_MCIPLAY ||
1822 li->type == IDM_PRINT) {
1823
1824 CHAR *temp,*p;
1825
1826 for(x = 0;li->list[x];x++) {
[358]1827 if (!li->info->exwdirs) {
[2]1828 temp = li->list[x];
1829 p = strrchr(li->list[x],'\\');
[358]1830 if (p) {
[2]1831 p++;
[358]1832 li->list[x] = xstrdup(p,pszSrcFile,__LINE__);
1833 if (!li->list[x])
1834 li->list[x] = temp;
1835 else {
[2]1836 free(temp);
[358]1837 }
[2]1838 }
1839 }
1840 sprintf(cl,"%s%s%s",li->targetpath,
1841 (li->targetpath[strlen(li->targetpath) - 1] == '\\') ?
1842 NullStr : "\\",li->list[x]);
1843 temp = li->list[x];
[358]1844 li->list[x] = xstrdup(cl,pszSrcFile,__LINE__);
1845 if (!li->list[x])
1846 li->list[x] = temp;
1847 else
[2]1848 free(temp);
1849 }
1850 if(li->type == IDM_VIEW || li->type == IDM_EDIT) {
1851
1852 BOOL isit = TestBinary(li->list[0]);
1853
1854 if(isit) {
1855 if(li->type == IDM_VIEW)
1856 li->type = IDM_VIEWBINARY;
1857 else
1858 li->type = IDM_EDITBINARY;
1859 }
1860 else {
1861 if(li->type == IDM_VIEW)
1862 li->type = IDM_VIEWTEXT;
1863 else
1864 li->type = IDM_EDITTEXT;
1865 }
1866 }
1867 if(li->type == IDM_MCIPLAY) {
1868
1869 FILE *fp;
1870
[358]1871 fp = xfopen("$FM2PLAY.$$$","w",pszSrcFile,__LINE__);
1872 if (fp) {
[2]1873 fprintf(fp,"%s",";AV/2-built FM2Play listfile\n");
1874 for(x = 0;li->list[x];x++)
1875 fprintf(fp,"%s\n",li->list[x]);
1876 fprintf(fp,";end\n");
1877 fclose(fp);
1878 runemf2(SEPARATE | WINDOWED,HWND_DESKTOP,NULL,
1879 NULL,"%sFM2PLAY.EXE /@$FM2PLAY.$$$",
1880 (fAddUtils) ? "UTILS\\" : NullStr);
1881 }
1882 }
1883 else if(li->type == IDM_PRINT) {
1884 strcpy(li->targetpath,printer);
[358]1885 if (_beginthread(PrintList,NULL,65536,(PVOID)li) != -1) {
1886 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT));
[2]1887 li = NULL;
[358]1888 }
[2]1889 }
1890 else if(li->type == IDM_VIEWARCHIVE) {
1891
1892 ARC_TYPE *info;
1893
1894 for(x = 0;li->list[x];x++) {
1895 if(IsFile(li->list[x]) == 1) {
[300]1896 info = NULL; // Do not hide dups - fixme to know why?
1897 if (WinDlgBox(HWND_DESKTOP,HWND_DESKTOP,
1898 SBoxDlgProc,FM3ModHandle,ASEL_FRAME,
1899 (PVOID)&info) &&
1900 info)
1901 {
[2]1902 StartArcCnr(HWND_DESKTOP,
1903 HWND_DESKTOP,
1904 li->list[x],
1905 4,
1906 info);
[300]1907 }
[2]1908 }
1909 }
1910 }
1911 else if((li->type == IDM_VIEWTEXT && *viewer) ||
1912 (li->type == IDM_VIEWBINARY && *binview) ||
1913 (li->type == IDM_EDITTEXT && *editor) ||
1914 (li->type == IDM_EDITBINARY && *bined)) {
[156]1915 DosSleep(100);
[2]1916 ExecOnList(hwnd,((li->type == IDM_VIEWTEXT) ? viewer :
1917 (li->type == IDM_VIEWBINARY) ? binview :
1918 (li->type == IDM_EDITTEXT) ? editor :
1919 bined),
1920 WINDOWED | SEPARATE,li->targetpath,li->list,
1921 NULL);
1922 }
1923 else {
1924 if(li->hwnd) {
1925
1926 ULONG viewtype;
1927
1928 for(x = 0;li->list[x];x++) {
1929 if(x == 0) {
1930 if(li->type == IDM_VIEWBINARY ||
1931 li->type == IDM_EDITBINARY)
1932 viewtype = 16;
1933 else
1934 viewtype = 8;
1935 }
1936 else
1937 viewtype = 0;
[358]1938 temp = xstrdup(li->list[x],pszSrcFile,__LINE__);
1939 if (temp) {
1940 if (!PostMsg(WinQueryWindow(li->hwnd,QW_PARENT),
1941 UM_LOADFILE,
1942 MPFROMLONG(4L +
[2]1943 (li->type == IDM_VIEWTEXT ||
1944 li->type == IDM_VIEWBINARY) +
1945 viewtype),
[358]1946 MPFROMP(temp)))
[2]1947 free(temp);
1948 }
1949 }
1950 }
1951 }
1952 }
1953 }
1954 break;
1955
1956 case IDM_FIND:
1957 {
1958 INT numfiles = 0,numalloced = 0;
1959 CHAR **list2 = NULL,fullname[CCHMAXPATH * 2],*p;
1960
1961 for(x = 0;li->list[x];x++) {
1962 p = li->list[x];
1963 while(*p) {
1964 if(*p == '/')
1965 *p = '\\';
1966 p++;
1967 }
1968 sprintf(fullname,"%s%s%s",dcd->directory,
1969 (dcd->directory[strlen(dcd->directory) - 1] == '\\') ?
1970 NullStr : "\\",li->list[x]);
1971 if(IsFile(fullname) != -1)
1972 if(AddToList(fullname,&list2,&numfiles,&numalloced))
1973 break;
1974 if(strchr(li->list[x],'\\')) {
1975 p = strrchr(li->list[x],'\\');
1976 if(p) {
1977 p++;
1978 if(*p) {
1979 sprintf(fullname,"%s%s%s",dcd->directory,
1980 (dcd->directory[strlen(dcd->directory) - 1] == '\\') ?
1981 NullStr : "\\",p);
1982 if(IsFile(fullname) != -1)
1983 if(AddToList(fullname,&list2,&numfiles,&numalloced))
1984 break;
1985 }
1986 }
1987 }
1988 }
[358]1989 if (!numfiles || !list2)
1990 Runtime_Error(pszSrcFile, __LINE__, "no files or list");
1991 else {
[2]1992 WinSendMsg(dcd->hwndCnr,WM_COMMAND,
1993 MPFROM2SHORT(IDM_COLLECTOR,0),MPVOID);
1994 DosSleep(128L);
1995 if(Collector) {
1996 if(!PostMsg(Collector,WM_COMMAND,
1997 MPFROM2SHORT(IDM_COLLECTOR,0),
1998 MPFROMP(list2)))
1999 FreeList(list2);
2000 }
2001 else
2002 FreeList(list2);
2003 }
2004 }
2005 break;
2006 }
2007 }
2008 FreeListInfo(li);
2009 }
2010 return 0;
2011
2012 case WM_CLOSE:
2013 WinDestroyWindow(hwnd);
2014 break;
2015
2016 case WM_DESTROY:
[130]2017 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]2018 if(dcd) {
2019 if(*dcd->workdir) {
2020 DosSleep(33L);
2021 wipeallf("%s\\*",dcd->workdir);
2022 if(rmdir(dcd->workdir)) {
2023 DosSleep(256L);
2024 wipeallf("%s\\*",dcd->workdir);
2025 rmdir(dcd->workdir);
2026 }
2027 }
2028 FreeList(dcd->lastselection);
2029 WinSendMsg(dcd->hwndCnr,UM_CLOSE,MPVOID,MPVOID);
2030 free(dcd);
[130]2031 WinSetWindowPtr(dcd->hwndCnr,QWL_USER,NULL);
[2]2032 }
2033 if(!PostMsg((HWND)0,WM_QUIT,MPVOID,MPVOID))
2034 WinSendMsg((HWND)0,WM_QUIT,MPVOID,MPVOID);
2035 break;
2036 }
2037 return WinDefWindowProc(hwnd,msg,mp1,mp2);
2038}
2039
2040
[212]2041static MRESULT EXPENTRY ArcCnrWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
[172]2042{
[130]2043 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]2044
2045 switch(msg) {
2046 case DM_PRINTOBJECT:
2047 case DM_DISCARDOBJECT:
2048 if(dcd)
2049 return WinSendMsg(dcd->hwndObject,
2050 msg,
2051 mp1,
2052 mp2);
2053 else
2054 return MRFROMLONG(DRR_TARGET);
2055
2056 case WM_CHAR:
2057 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
2058 if(SHORT1FROMMP(mp1) & KC_KEYUP)
2059 return (MRESULT)TRUE;
2060 if(SHORT1FROMMP(mp1) & KC_VIRTUALKEY) {
2061 switch(SHORT2FROMMP(mp2)) {
2062 case VK_DELETE:
2063 PostMsg(hwnd,
2064 WM_COMMAND,
2065 MPFROM2SHORT(IDM_DELETE,0),
2066 MPVOID);
2067 break;
2068 }
2069 }
2070 if(shiftstate || fNoSearch)
2071 break;
2072 if(SHORT1FROMMP(mp1) & KC_CHAR) {
2073
2074 ULONG thistime,len;
2075 SEARCHSTRING srch;
2076 PCNRITEM pci;
2077
2078 if(!dcd)
2079 break;
2080 switch(SHORT1FROMMP(mp2)) {
2081 case '\x1b':
2082 case '\r':
2083 case '\n':
2084 dcd->lasttime = 0;
[156]2085 *dcd->szCommonName = 0;
[2]2086 break;
2087 default:
2088 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd));
2089 if(thistime > dcd->lasttime + 1250)
[156]2090 *dcd->szCommonName = 0;
[2]2091 dcd->lasttime = thistime;
[156]2092 if(SHORT1FROMMP(mp2) == ' ' && !*dcd->szCommonName)
[2]2093 break;
2094KbdRetry:
[156]2095 len = strlen(dcd->szCommonName);
[2]2096 if(len >= CCHMAXPATH - 1) {
[156]2097 *dcd->szCommonName = 0;
[2]2098 len = 0;
2099 }
[156]2100 dcd->szCommonName[len] = toupper(SHORT1FROMMP(mp2));
2101 dcd->szCommonName[len + 1] = 0;
[2]2102 memset(&srch,0,sizeof(SEARCHSTRING));
2103 srch.cb = (ULONG)sizeof(SEARCHSTRING);
[156]2104 srch.pszSearch = dcd->szCommonName;
[2]2105 srch.fsPrefix = TRUE;
2106 srch.fsCaseSensitive = FALSE;
2107 srch.usView = CV_ICON;
2108 pci = WinSendMsg(hwnd,
2109 CM_SEARCHSTRING,
2110 MPFROMP(&srch),
2111 MPFROMLONG(CMA_FIRST));
2112 if(pci && (INT)pci != -1) {
2113
2114 USHORT attrib = CRA_CURSORED;
2115
2116 /* make found item current item */
[156]2117 if(!stricmp(pci->pszFileName,dcd->szCommonName))
[2]2118 attrib |= CRA_SELECTED;
2119 WinSendMsg(hwnd,
2120 CM_SETRECORDEMPHASIS,
2121 MPFROMP(pci),
2122 MPFROM2SHORT(TRUE,attrib));
2123 /* make sure that record shows in viewport */
2124 ShowCnrRecord(hwnd,(PMINIRECORDCORE)pci);
2125 return (MRESULT)TRUE;
2126 }
2127 else {
2128 if(SHORT1FROMMP(mp2) == ' ') {
[156]2129 dcd->szCommonName[len] = 0;
[2]2130 break;
2131 }
[156]2132 *dcd->szCommonName = 0;
[2]2133 dcd->lasttime = 0;
2134 if(len) // retry as first letter if no match
2135 goto KbdRetry;
2136 }
2137 break;
2138 }
2139 }
2140 break;
2141
2142 case WM_MOUSEMOVE:
2143 case WM_BUTTON1UP:
2144 case WM_BUTTON2UP:
2145 case WM_BUTTON3UP:
2146 case WM_CHORD:
2147 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
2148 break;
2149
2150 case WM_BUTTON1MOTIONEND:
2151 {
2152 CNRINFO cnri;
2153
2154 memset(&cnri,0,sizeof(CNRINFO));
2155 cnri.cb = sizeof(CNRINFO);
2156 if(WinSendMsg(hwnd,
2157 CM_QUERYCNRINFO,
2158 MPFROMP(&cnri),
2159 MPFROMLONG(sizeof(CNRINFO)))) {
2160 if(cnri.flWindowAttr & CV_DETAIL)
2161 PrfWriteProfileData(fmprof,
2162 appname,
2163 "ArcCnrSplitBar",
2164 (PVOID)&cnri.xVertSplitbar,
2165 sizeof(LONG));
2166 }
2167 }
2168 break;
2169
2170 case WM_PRESPARAMCHANGED:
2171 PresParamChanged(hwnd,"ArcCnr",mp1,mp2);
2172 break;
2173
2174 case UM_UPDATERECORD:
2175 case UM_UPDATERECORDLIST:
2176 if(dcd &&
2177 !IsArcThere(hwnd,dcd->arcname))
2178 PostMsg(hwnd,
2179 WM_CLOSE,
2180 MPVOID,
2181 MPVOID);
2182 return 0;
2183
2184 case WM_SETFOCUS:
2185 /*
2186 * put name of our window (archive name) on status line
2187 */
2188 if(dcd &&
2189 hwndStatus &&
2190 mp2)
2191 WinSendMsg(hwnd,
2192 UM_RESCAN,
2193 MPVOID,
2194 MPVOID);
2195 break;
2196
2197 case UM_SETUP2:
2198 if(dcd &&
2199 dcd->info) {
[300]2200 if(dcd->info->fdpos == -1 || !dcd->info->datetype)
[2]2201 dcd->sortFlags &= (~SORT_LWDATE);
2202 if(dcd->info->nsizepos == -1)
2203 dcd->sortFlags &= (~SORT_EASIZE);
2204 if(dcd->info->osizepos == -1)
2205 dcd->sortFlags &= (~SORT_SIZE);
2206 AdjustCnrColVis(hwnd,
2207 GetPString(IDS_OLDSIZECOLTEXT),
[300]2208 dcd->info->osizepos != -1,
[2]2209 FALSE);
2210 AdjustCnrColVis(hwnd,
2211 GetPString(IDS_NEWSIZECOLTEXT),
[300]2212 dcd->info->nsizepos != -1,
[2]2213 FALSE);
[300]2214 // Display unsullied date/time string if type 0
[2]2215 AdjustCnrColVis(hwnd,
2216 GetPString(IDS_DATETIMECOLTEXT),
[300]2217 dcd->info->fdpos != -1 && !dcd->info->datetype,
[2]2218 FALSE);
[300]2219 // Display parsed date/time columns if type specified
[2]2220 AdjustCnrColVis(hwnd,
2221 GetPString(IDS_TIMECOLTEXT),
[300]2222 dcd->info->fdpos != -1 && dcd->info->datetype,
[2]2223 FALSE);
2224 AdjustCnrColVis(hwnd,
2225 GetPString(IDS_DATECOLTEXT),
[300]2226 dcd->info->fdpos != -1 && dcd->info->datetype,
[2]2227 FALSE);
2228 WinSendMsg(hwnd,
2229 CM_INVALIDATEDETAILFIELDINFO,
2230 MPVOID,
2231 MPVOID);
2232 }
2233 return 0;
2234
2235 case UM_RESCAN:
2236 if(dcd) {
2237
2238 CNRINFO cnri;
[156]2239 CHAR s[CCHMAXPATH * 2],tb[81],tf[81];
[2]2240 PARCITEM pci;
2241
2242 if(mp1) {
2243 PostMsg(dcd->hwndObject,
2244 UM_RESCAN,
2245 MPVOID,
2246 MPVOID);
2247 return 0;
2248 }
2249 memset(&cnri,0,sizeof(CNRINFO));
2250 cnri.cb = sizeof(CNRINFO);
2251 WinSendMsg(hwnd,
2252 CM_QUERYCNRINFO,
2253 MPFROMP(&cnri),
2254 MPFROMLONG(sizeof(CNRINFO)));
2255 dcd->totalfiles = cnri.cRecords;
2256 commafmt(tf,sizeof(tf),dcd->selectedfiles);
[156]2257 if (dcd->ullTotalBytes)
2258 CommaFmtULL(tb,sizeof(tb),dcd->selectedbytes,'K');
2259 else
2260 *tb = 0;
2261 sprintf(s,"%s%s%s",
2262 tf,
2263 *tb ? " / " : NullStr,
2264 tb);
[2]2265 WinSetDlgItemText(dcd->hwndClient,
2266 DIR_SELECTED,
2267 s);
2268 commafmt(tf,sizeof(tf),dcd->totalfiles);
[156]2269 if (dcd->ullTotalBytes)
2270 CommaFmtULL(tb,sizeof(tb),dcd->ullTotalBytes,'K');
2271 else
2272 *tb = 0;
2273 sprintf(s,"%s%s%s",
2274 tf,
2275 *tb ? " / " : NullStr,
2276 tb);
[2]2277 WinSetDlgItemText(dcd->hwndClient,
2278 DIR_TOTALS,
2279 s);
2280 if(hwndStatus &&
[156]2281 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent))
2282 {
2283 sprintf(s," [%s%s%s]%s%s%s %s",
2284 tf,
2285 *tb ? " / " : NullStr,
2286 tb,
[2]2287 (*dcd->mask.szMask) ? " (" : NullStr,
2288 (*dcd->mask.szMask) ? dcd->mask.szMask : NullStr,
2289 (*dcd->mask.szMask) ? ")" : NullStr,dcd->arcname);
2290 WinSetWindowText(hwndStatus,s);
2291 if(!ParentIsDesktop(hwnd,dcd->hwndParent)) {
2292 pci = WinSendMsg(hwnd,
2293 CM_QUERYRECORDEMPHASIS,
2294 MPFROMLONG(CMA_FIRST),
2295 MPFROMSHORT(CRA_CURSORED));
2296 if(pci && (INT)pci != -1) {
2297 if(fSplitStatus && hwndStatus2) {
[156]2298 if (dcd->ullTotalBytes)
2299 CommaFmtULL(tb,sizeof(tb),pci->cbFile,' ');
2300 else
2301 *tb = 0;
2302 sprintf(s,"%s%s%s%s",
2303 *tb ? " " : NullStr,
2304 tb,
2305 *tb ? " " : NullStr,
[2]2306 pci->szFileName);
2307 WinSetWindowText(hwndStatus2,s);
2308 }
2309 if(fMoreButtons)
2310 WinSetWindowText(hwndName,
2311 pci->szFileName);
2312 }
2313 else {
2314 WinSetWindowText(hwndStatus2,NullStr);
2315 WinSetWindowText(hwndName,NullStr);
2316 }
2317 WinSetWindowText(hwndDate,NullStr);
2318 WinSetWindowText(hwndAttr,NullStr);
2319 }
2320 }
2321 if((dcd->arcfilled &&
2322 !dcd->totalfiles) ||
2323 !IsArcThere(hwnd,dcd->arcname))
2324 PostMsg(hwnd,
2325 WM_CLOSE,
2326 MPVOID,
2327 MPVOID);
2328 }
2329 return 0;
2330
2331 case UM_SETUP:
2332 if(dcd) {
2333 if(!dcd->hwndObject) {
2334 /*
2335 * first time through -- set things up
2336 */
2337 {
2338 CHAR *p,*pp;
2339 ULONG z,was;
[358]2340 APIRET rc;
[2]2341
[156]2342 rc = DosCreateDir(dcd->workdir,0);
[2]2343 if(rc) {
2344 if(rc == ERROR_ACCESS_DENIED) {
2345 p = strrchr(dcd->workdir,'.');
2346 if(p) {
2347 p++;
2348 pp = p;
2349 was = strtoul(p,&pp,16);
2350 for(z = 0;z < 99;z++) {
2351 was++;
2352 sprintf(p,"%03x");
[156]2353 rc = DosCreateDir(dcd->workdir,0);
[2]2354 if(!rc || rc != ERROR_ACCESS_DENIED)
2355 break;
2356 }
2357 }
2358 }
2359 if(rc)
2360 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID);
2361 return 0;
2362 }
2363 }
2364 RestorePresParams(hwnd,"ArcCnr");
2365 dcd->mask.fNoAttribs = TRUE;
2366 dcd->mask.fNoDirs = TRUE;
2367 *dcd->mask.prompt = 0;
2368 {
2369 PFIELDINFO pfi, pfiLastLeftCol;
2370 ULONG numcols = CON_COLS;
2371
2372 pfi = WinSendMsg(hwnd,
2373 CM_ALLOCDETAILFIELDINFO,
2374 MPFROMLONG(numcols),
2375 NULL);
2376 if(pfi) {
2377
2378 PFIELDINFO pfiFirst;
2379 FIELDINFOINSERT fii;
2380
2381 pfiFirst = pfi;
2382 pfi->flData = CFA_STRING | CFA_LEFT | CFA_FIREADONLY;
2383 pfi->flTitle = CFA_CENTER;
2384 pfi->pTitleData = GetPString(IDS_FILENAMECOLTEXT);
2385 pfi->offStruct = FIELDOFFSET(ARCITEM, pszFileName);
2386 pfiLastLeftCol = pfi;
2387 pfi = pfi->pNextFieldInfo;
2388 pfi->flData = CFA_ULONG | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
2389 pfi->flTitle = CFA_CENTER;
2390 pfi->pTitleData = GetPString(IDS_OLDSIZECOLTEXT);
2391 pfi->offStruct = FIELDOFFSET(ARCITEM, cbFile);
2392 pfi = pfi->pNextFieldInfo;
2393 pfi->flData = CFA_ULONG | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
2394 pfi->flTitle = CFA_CENTER;
2395 pfi->pTitleData = GetPString(IDS_NEWSIZECOLTEXT);
2396 pfi->offStruct = FIELDOFFSET( ARCITEM, cbComp );
2397 pfi = pfi->pNextFieldInfo;
2398 pfi->flData = CFA_STRING | CFA_CENTER | CFA_SEPARATOR | CFA_FIREADONLY;
2399 pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
2400 pfi->pTitleData = GetPString(IDS_DATETIMECOLTEXT);
2401 pfi->offStruct = FIELDOFFSET(ARCITEM, pszDate);
2402 pfi = pfi->pNextFieldInfo;
2403 pfi->flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
2404 pfi->flTitle = CFA_CENTER;
2405 pfi->pTitleData = GetPString(IDS_DATECOLTEXT);
2406 pfi->offStruct = FIELDOFFSET(ARCITEM, date);
2407 pfi = pfi->pNextFieldInfo;
2408 pfi->flData = CFA_TIME | CFA_RIGHT | CFA_FIREADONLY;
2409 pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
2410 pfi->pTitleData = GetPString(IDS_TIMECOLTEXT);
2411 pfi->offStruct = FIELDOFFSET( ARCITEM, time );
2412 memset( &fii, 0, sizeof( FIELDINFOINSERT ) );
2413 fii.cb = sizeof( FIELDINFOINSERT );
2414 fii.pFieldInfoOrder = (PFIELDINFO) CMA_FIRST;
2415 fii.cFieldInfoInsert = (SHORT) numcols;
2416 fii.fInvalidateFieldInfo = TRUE;
2417 WinSendMsg(hwnd,
2418 CM_INSERTDETAILFIELDINFO,
2419 MPFROMP(pfiFirst),
2420 MPFROMP(&fii));
2421 PostMsg(hwnd,
2422 UM_SETUP2,
2423 MPVOID,
2424 MPVOID);
2425 {
2426 CNRINFO cnri;
2427
2428 memset(&cnri,0,sizeof(cnri));
2429 cnri.cb = sizeof( CNRINFO );
2430 cnri.pFieldInfoLast = pfiLastLeftCol;
2431 cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET + 32;
2432 {
2433 ULONG size;
2434
2435 size = sizeof(LONG);
2436 PrfQueryProfileData(fmprof,appname,"ArcCnrSplitBar",
2437 &cnri.xVertSplitbar,&size);
2438 if(cnri.xVertSplitbar <= 0)
2439 cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET + 32;
2440 }
2441 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT |
2442 CV_NAME));
2443 cnri.flWindowAttr |= (CV_DETAIL | CA_DETAILSVIEWTITLES |
2444 CV_FLOW);
2445 cnri.flWindowAttr &= (~(CA_ORDEREDTARGETEMPH |
2446 CA_MIXEDTARGETEMPH));
2447 cnri.pSortRecord = (PVOID)ArcSort;
2448 WinSendMsg(hwnd,
2449 CM_SETCNRINFO,
2450 MPFROMP(&cnri),
2451 MPFROMLONG(CMA_PFIELDINFOLAST |
2452 CMA_XVERTSPLITBAR |
2453 CMA_PSORTRECORD |
2454 CMA_FLWINDOWATTR));
2455 }
2456 }
2457 }
2458 WinSendMsg(hwnd,
2459 CM_SORTRECORD,
2460 MPFROMP(ArcSort),
2461 MPFROMP(dcd));
[358]2462 if(_beginthread(MakeObjWin,NULL,245760,(PVOID)dcd) == -1) {
2463 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT));
2464 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID);
[2]2465 return 0;
2466 }
2467 else
2468 DosSleep(1L);
2469 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2470 DIR_FILTER),
2471 &dcd->mask,
2472 TRUE);
2473 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2474 DIR_SORT),
2475 dcd->sortFlags,
2476 TRUE);
[212]2477 DefArcSortFlags = dcd->sortFlags; // Remember for new windows
[2]2478 }
2479 }
2480 else {
2481 PostMsg(hwnd,
2482 WM_CLOSE,
2483 MPVOID,
2484 MPVOID);
2485 return 0;
2486 }
2487 return 0;
2488
2489 case UM_SETDIR:
2490 if(dcd) {
2491
2492 CHAR s[CCHMAXPATH],*p;
2493 ULONG ret = 0;
2494
2495 WinQueryDlgItemText(dcd->hwndClient,
2496 ARC_EXTRACTDIR,
2497 CCHMAXPATH,
2498 s);
[123]2499 bstrip(s);
[2]2500 MakeFullName(s);
2501 if(*s) {
[358]2502 while ((p = strchr(s,'/')) != NULL)
[2]2503 *p = '\\';
[358]2504 while (strlen(s) > 3 && s[strlen(s) - 1] == '\\')
[2]2505 s[strlen(s) - 1] = 0;
[358]2506 if (stricmp(s,dcd->directory)) {
2507 if (IsFullName(s)) {
2508 if (driveflags[toupper(*s) - 'A'] &
2509 (DRIVE_NOTWRITEABLE | DRIVE_IGNORE | DRIVE_INVALID)) {
2510 Runtime_Error(pszSrcFile, __LINE__, "drive %s bad", s);
[2]2511 WinSetDlgItemText(dcd->hwndClient,
2512 ARC_EXTRACTDIR,
2513 dcd->directory);
2514 return 0;
2515 }
2516 }
2517 if(!SetDir(dcd->hwndParent,hwnd,s,0)) {
2518 if(stricmp(dcd->directory,s)) {
2519 DosEnterCritSec();
2520 strcpy(lastextractpath,s);
2521 DosExitCritSec();
2522 }
2523 strcpy(dcd->directory,s);
2524 if((!isalpha(*s) || s[1] != ':') && *s != '.')
2525 saymsg(MB_ENTER | MB_ICONASTERISK,
2526 hwnd,
2527 GetPString(IDS_WARNINGTEXT),
2528 GetPString(IDS_SPECIFYDRIVETEXT));
2529 }
2530 else
2531 ret = 1;
2532 }
2533 }
2534 WinSetDlgItemText(dcd->hwndClient,
2535 ARC_EXTRACTDIR,
2536 dcd->directory);
2537 return (MRESULT)ret;
2538 }
2539 return 0;
2540
2541 case UM_ENTER:
2542 if(WinSendMsg(hwnd,
2543 UM_SETDIR,
2544 MPVOID,
2545 MPVOID))
2546 return 0;
2547 SetShiftState();
2548 if(dcd && (CHAR *)mp1) {
2549
2550 SWP swp;
2551 CHAR *filename = mp1;
2552
2553 if(IsFile(filename) != 1)
2554 return 0;
2555 WinQueryWindowPos(dcd->hwndFrame,&swp);
2556 DefaultViewKeys(hwnd,
2557 dcd->hwndFrame,
2558 dcd->hwndParent,
2559 &swp,
2560 filename);
2561 if(fUnHilite)
2562 UnHilite(hwnd,
2563 FALSE,
2564 &dcd->lastselection);
2565 }
2566 return 0;
2567
2568 case WM_MENUEND:
2569 if(dcd) {
2570
2571 HWND hwndMenu = (HWND)mp2;
2572
2573 if(hwndMenu == ArcCnrMenu ||
2574 hwndMenu == ArcMenu) {
2575 MarkAll(hwnd,
2576 TRUE,
2577 FALSE,
2578 TRUE);
2579 if(dcd->cnremphasized) {
2580 WinSendMsg(hwnd,
2581 CM_SETRECORDEMPHASIS,
2582 MPVOID,
2583 MPFROM2SHORT(FALSE,CRA_SOURCE));
2584 dcd->cnremphasized = FALSE;
2585 }
2586 }
2587 }
2588 break;
2589
2590 case MM_PORTHOLEINIT:
2591 if(dcd) {
2592 switch(SHORT1FROMMP(mp1)) {
2593 case 0:
2594 case 1:
2595 {
2596 ULONG wmsg;
2597
2598 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU;
2599 PortholeInit((HWND)WinSendMsg(dcd->hwndClient,
2600 wmsg,
2601 MPVOID,
2602 MPVOID),
2603 mp1,
2604 mp2);
2605 }
2606 break;
2607 }
2608 }
2609 break;
2610
2611 case UM_INITMENU:
2612 case WM_INITMENU:
2613 if(dcd) {
2614 switch(SHORT1FROMMP(mp1)) {
2615 case IDM_FILESMENU:
2616 if(dcd->info) {
2617 WinEnableMenuItem((HWND)mp2,
2618 IDM_DELETE,
[300]2619 dcd->info->delete != NULL);
[2]2620 WinEnableMenuItem((HWND)mp2,
2621 IDM_TEST,
[300]2622 dcd->info->test != NULL);
[2]2623 WinEnableMenuItem((HWND)mp2,
[300]2624 IDM_EXTRACT,
2625 dcd->info->extract != NULL);
2626 WinEnableMenuItem((HWND)mp2,
[2]2627 IDM_EXTRACTWDIRS,
[300]2628 dcd->info->exwdirs != NULL);
[2]2629 WinEnableMenuItem((HWND)mp2,
2630 IDM_ARCEXTRACTWDIRS,
[300]2631 dcd->info->exwdirs != NULL);
[2]2632 WinEnableMenuItem((HWND)mp2,
2633 IDM_ARCEXTRACTWDIRSEXIT,
[300]2634 dcd->info->exwdirs != NULL);
[2]2635 }
2636 break;
2637
2638 case IDM_VIEWSMENU:
2639 WinCheckMenuItem((HWND)mp2,
2640 IDM_MINIICONS,
2641 ((dcd->flWindowAttr & CV_MINI) != 0));
2642 WinEnableMenuItem((HWND)mp2,
2643 IDM_RESELECT,
2644 (dcd->lastselection != NULL));
2645 break;
2646
2647 case IDM_COMMANDSMENU:
2648 SetupCommandMenu((HWND)mp2,
2649 hwnd);
2650 break;
2651
2652 case IDM_SORTSUBMENU:
2653 SetSortChecks((HWND)mp2,
2654 dcd->sortFlags);
2655 break;
2656
2657 case IDM_WINDOWSMENU:
2658 /*
2659 * add switchlist entries to end of pulldown menu
2660 */
2661 SetupWinList((HWND)mp2,
2662 (hwndMain) ? hwndMain : (HWND)0,
2663 dcd->hwndFrame);
2664 break;
2665 }
2666 dcd->hwndLastMenu = (HWND)mp2;
2667 }
2668 if(msg == WM_INITMENU)
2669 break;
2670 return 0;
2671
2672 case UM_LOADFILE:
2673 if(dcd && mp2) {
2674
2675 HWND ret;
2676
2677 ret = StartMLEEditor(dcd->hwndParent,
2678 (INT)mp1,
2679 (CHAR *)mp2,
2680 dcd->hwndFrame);
2681 free((CHAR *)mp2);
2682 return MRFROMLONG(ret);
2683 }
2684 return 0;
2685
2686 case UM_COMMAND:
2687 if(mp1) {
2688 if(dcd) {
2689 if(!PostMsg(dcd->hwndObject,
2690 UM_COMMAND,
2691 mp1,
2692 mp2)) {
[358]2693 Runtime_Error(pszSrcFile, __LINE__, "post");
[2]2694 FreeListInfo((LISTINFO *)mp1);
2695 }
2696 else
2697 return (MRESULT)TRUE;
2698 }
2699 else
2700 FreeListInfo((LISTINFO *)mp1);
2701 }
2702 return 0;
2703
2704 case UM_OPENWINDOWFORME:
2705 if(dcd) {
2706 if(mp1 &&
2707 !IsFile((CHAR *)mp1))
2708 OpenDirCnr((HWND)0,
2709 hwndMain,
2710 dcd->hwndFrame,
2711 FALSE,
2712 (char *)mp1);
2713 else if(mp1 &&
2714 IsFile(mp1) == 1)
2715 StartArcCnr(HWND_DESKTOP,
2716 dcd->hwndFrame,
2717 (CHAR *)mp1,
2718 4,
2719 (ARC_TYPE *)mp2);
2720 }
2721 return 0;
2722
2723 case WM_COMMAND:
2724 DosError(FERR_DISABLEHARDERR);
2725 if(dcd) {
2726 if(SwitchCommand(dcd->hwndLastMenu,
2727 SHORT1FROMMP(mp1)))
2728 return 0;
2729 if(WinSendMsg(hwnd,
2730 UM_SETDIR,
2731 MPVOID,
2732 MPVOID))
2733 return 0;
2734 if(!IsArcThere(hwnd,
2735 dcd->arcname)) {
2736 PostMsg(hwnd,
2737 WM_CLOSE,
2738 MPVOID,
2739 MPVOID);
2740 return 0;
2741 }
2742 switch(SHORT1FROMMP(mp1)) {
2743 case IDM_TREEVIEW:
2744
2745 break;
2746
2747 case IDM_CONTEXTMENU:
2748 {
2749 PCNRITEM pci;
2750
2751 pci = (PCNRITEM)CurrentRecord(hwnd);
2752 PostMsg(hwnd,
2753 WM_CONTROL,
2754 MPFROM2SHORT(ARC_CNR,
2755 CN_CONTEXTMENU),
2756 MPFROMP(pci));
2757 }
2758 break;
2759
2760 case IDM_NEXTWINDOW:
2761 case IDM_PREVWINDOW:
2762 {
2763 HWND hwndActive;
2764
2765 hwndActive = WinQueryFocus(HWND_DESKTOP);
2766 WinSetFocus(HWND_DESKTOP,
2767 ((hwndActive == hwnd) ?
2768 WinWindowFromID(dcd->hwndClient,ARC_EXTRACTDIR) :
2769 hwnd));
2770 }
2771 break;
2772
2773 case IDM_FOLDERAFTEREXTRACT:
2774 fFolderAfterExtract = (fFolderAfterExtract) ? FALSE : TRUE;
2775 PrfWriteProfileData(fmprof,appname,"FolderAfterExtract",
2776 &fFolderAfterExtract,sizeof(BOOL));
2777 break;
2778
2779 case IDM_SHOWSELECT:
2780 QuickPopup(hwnd,dcd,CheckMenu(&ArcCnrMenu,ARCCNR_POPUP),
2781 IDM_SELECTSUBMENU);
2782 break;
2783
2784 case IDM_SHOWSORT:
2785 QuickPopup(hwnd,dcd,CheckMenu(&ArcCnrMenu,ARCCNR_POPUP),
2786 IDM_SORTSUBMENU);
2787 break;
2788
2789 case IDM_NOTEBOOK:
2790 if(!ParentIsDesktop(dcd->hwndParent,dcd->hwndParent))
2791 PostMsg(dcd->hwndParent,
2792 msg,
2793 mp1,
2794 mp2);
2795 else
2796 WinDlgBox(HWND_DESKTOP,
2797 hwnd,
2798 CfgDlgProc,
2799 FM3ModHandle,
2800 CFG_FRAME,
2801 (PVOID)"Archive");
2802 break;
2803
2804 case IDM_RESCAN:
[156]2805 dcd->ullTotalBytes = dcd->totalfiles =
[2]2806 dcd->selectedfiles = dcd->selectedbytes = 0;
2807 WinSetDlgItemText(dcd->hwndClient,DIR_TOTALS,"0");
2808 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,"0 / 0k");
2809 dcd->totalfiles = FillArcCnr(dcd->hwndCnr,
2810 dcd->arcname,
2811 &dcd->info,
[156]2812 &dcd->ullTotalBytes);
[2]2813 PostMsg(dcd->hwndCnr,
2814 UM_RESCAN,
2815 MPVOID,
2816 MPVOID);
2817 PostMsg(dcd->hwndCnr,
2818 UM_SETUP2,
2819 MPVOID,
2820 MPVOID);
2821 WinSendMsg(dcd->hwndCnr,
2822 CM_INVALIDATERECORD,
2823 MPVOID,
2824 MPFROM2SHORT(0,
2825 CMA_ERASE | CMA_REPOSITION));
2826 break;
2827
2828 case IDM_RESELECT:
2829 SelectList(hwnd,
2830 TRUE,
2831 FALSE,
2832 FALSE,
2833 NULL,
2834 NULL,
2835 dcd->lastselection);
2836 break;
2837
2838 case IDM_HELP:
2839 if(hwndHelp)
2840 WinSendMsg(hwndHelp,
2841 HM_DISPLAY_HELP,
2842 MPFROM2SHORT(HELP_ARCLIST,0),
2843 MPFROMSHORT(HM_RESOURCEID));
2844 break;
2845
2846 case IDM_WINDOWDLG:
2847 if(!ParentIsDesktop(dcd->hwndParent,dcd->hwndFrame))
2848 PostMsg(dcd->hwndParent,
2849 UM_COMMAND,
2850 MPFROM2SHORT(IDM_WINDOWDLG,0),
2851 MPVOID);
2852 break;
2853
2854 case IDM_SELECTALL:
2855 case IDM_SELECTALLFILES:
2856 case IDM_DESELECTALL:
2857 case IDM_DESELECTALLFILES:
2858 case IDM_SELECTMASK:
2859 case IDM_DESELECTMASK:
2860 case IDM_INVERT:
2861 {
2862 PARCITEM pci;
2863
2864 pci = (PARCITEM)WinSendMsg(hwnd,
2865 CM_QUERYRECORDEMPHASIS,
2866 MPFROMLONG(CMA_FIRST),
2867 MPFROMSHORT(CRA_CURSORED));
2868 if((INT)pci == -1)
2869 pci = NULL;
2870 if(SHORT1FROMMP(mp1) == IDM_HIDEALL) {
2871 if(pci) {
2872 if(!(pci->rc.flRecordAttr & CRA_SELECTED))
2873 pci->rc.flRecordAttr |= CRA_FILTERED;
2874 WinSendMsg(hwnd,
2875 CM_INVALIDATERECORD,
2876 MPFROMP(&pci),
2877 MPFROM2SHORT(1,
2878 CMA_ERASE | CMA_REPOSITION));
2879 break;
2880 }
2881 }
2882 PostMsg(dcd->hwndObject,
2883 UM_SELECT,
2884 mp1,
2885 MPFROMP(pci));
2886 }
2887 break;
2888
2889 case IDM_SORTSMARTNAME:
2890 case IDM_SORTNAME:
2891 case IDM_SORTFILENAME:
2892 case IDM_SORTSIZE:
2893 case IDM_SORTEASIZE:
2894 case IDM_SORTFIRST:
2895 case IDM_SORTLAST:
2896 case IDM_SORTLWDATE:
2897 dcd->sortFlags &= SORT_REVERSE;
2898 /* intentional fallthru */
2899 case IDM_SORTREVERSE:
2900 switch(SHORT1FROMMP(mp1)) {
2901 case IDM_SORTSMARTNAME:
2902 case IDM_SORTFILENAME:
2903 dcd->sortFlags |= SORT_FILENAME;
2904 break;
2905 case IDM_SORTSIZE:
2906 dcd->sortFlags |= SORT_SIZE;
2907 break;
2908 case IDM_SORTEASIZE:
2909 dcd->sortFlags |= SORT_EASIZE;
2910 break;
2911 case IDM_SORTFIRST:
2912 dcd->sortFlags |= SORT_FIRSTEXTENSION;
2913 break;
2914 case IDM_SORTLAST:
2915 dcd->sortFlags |= SORT_LASTEXTENSION;
2916 break;
2917 case IDM_SORTLWDATE:
2918 dcd->sortFlags |= SORT_LWDATE;
2919 break;
2920 case IDM_SORTREVERSE:
2921 if(dcd->sortFlags & SORT_REVERSE)
2922 dcd->sortFlags &= (~SORT_REVERSE);
2923 else
2924 dcd->sortFlags |= SORT_REVERSE;
2925 break;
2926 }
2927 WinSendMsg(hwnd,
2928 CM_SORTRECORD,
2929 MPFROMP(ArcSort),
2930 MPFROMP(dcd));
2931 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
2932 DIR_SORT),
2933 dcd->sortFlags,
2934 TRUE);
[212]2935 DefArcSortFlags = dcd->sortFlags; // Remember for new windows
[2]2936 break;
2937
2938 case IDM_COLLECTOR:
2939 if(!Collector) {
2940
2941 HWND hwndC;
2942 SWP swp;
2943
2944 if(ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile &&
2945 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2946 GetNextWindowPos(dcd->hwndParent,&swp,NULL,NULL);
2947 hwndC = StartCollector((fExternalCollector ||
2948 strcmp(realappname,FM3Str)) ?
2949 HWND_DESKTOP : dcd->hwndParent,4);
2950 if(hwndC) {
2951 if(!ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile &&
2952 (!fExternalCollector && !strcmp(realappname,FM3Str)))
2953 WinSetWindowPos(hwndC,
2954 HWND_TOP,
2955 swp.x,
2956 swp.y,
2957 swp.cx,
2958 swp.cy,
2959 SWP_MOVE | SWP_SIZE |
2960 SWP_SHOW | SWP_ZORDER);
2961 else if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
2962 fAutoTile &&
2963 !strcmp(realappname,FM3Str))
2964 TileChildren(dcd->hwndParent,TRUE);
2965 WinSetWindowPos(hwndC,
2966 HWND_TOP,
2967 0,
2968 0,
2969 0,
2970 0,
2971 SWP_ACTIVATE);
2972 DosSleep(128L);
2973 }
2974 }
2975 else
2976 StartCollector(dcd->hwndParent,4);
2977 break;
2978
2979 case IDM_ARCEXTRACTEXIT:
2980 case IDM_ARCEXTRACT:
2981 if(dcd->info->extract)
2982 runemf2(SEPARATE | WINDOWED |
2983 ((fArcStuffVisible) ? 0 : (BACKGROUND | MINIMIZED)),
2984 hwnd,dcd->directory,NULL,"%s %s%s%s",
2985 dcd->info->extract,
2986 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
2987 dcd->arcname,
2988 (needs_quoting(dcd->arcname)) ? "\"" : NullStr);
2989 if(SHORT1FROMMP(mp1) == IDM_ARCEXTRACTEXIT)
2990 PostMsg(hwnd,
2991 WM_CLOSE,
2992 MPVOID,
2993 MPVOID);
2994 break;
2995
2996 case IDM_ARCEXTRACTWDIRSEXIT:
2997 case IDM_ARCEXTRACTWDIRS:
2998 if(dcd->info->exwdirs)
2999 runemf2(SEPARATE | WINDOWED |
3000 ((fArcStuffVisible) ? 0 : (BACKGROUND | MINIMIZED)) ,
3001 hwnd,dcd->directory,NULL,"%s %s%s%s",
3002 dcd->info->exwdirs,
3003 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
3004 dcd->arcname,
3005 (needs_quoting(dcd->arcname)) ? "\"" : NullStr);
3006 if(SHORT1FROMMP(mp1) == IDM_ARCEXTRACTWDIRSEXIT)
3007 PostMsg(hwnd,
3008 WM_CLOSE,
3009 MPVOID,
3010 MPVOID);
3011 break;
3012
3013 case IDM_RESORT:
3014 WinSendMsg(hwnd,
3015 CM_SORTRECORD,
3016 MPFROMP(ArcSort),
3017 MPFROMP(dcd));
3018 break;
3019
3020 case IDM_FILTER:
3021 {
3022 BOOL empty = FALSE;
3023 PARCITEM pci;
3024
3025 if(!*dcd->mask.szMask) {
3026 empty = TRUE;
3027 pci = (PARCITEM)CurrentRecord(hwnd);
3028 if(pci && strchr(pci->szFileName,'.'))
3029 strcpy(dcd->mask.szMask,pci->szFileName);
3030 }
3031
3032 if(WinDlgBox(HWND_DESKTOP,hwnd,PickMaskDlgProc,
3033 FM3ModHandle,MSK_FRAME,MPFROMP(&dcd->mask))) {
3034 WinSendMsg(hwnd,CM_FILTER,MPFROMP(ArcFilter),
3035 MPFROMP(dcd));
3036 PostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
3037 }
3038 else if(empty)
3039 *dcd->mask.szMask = 0;
3040 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),
3041 DIR_FILTER),&dcd->mask,TRUE);
3042 }
3043 break;
3044
3045 case IDM_SWITCH:
3046 if(mp2) {
3047 if(stricmp(dcd->directory,(CHAR *)mp2)) {
3048 DosEnterCritSec();
3049 strcpy(lastextractpath,(CHAR *)mp2);
3050 MakeValidDir(lastextractpath);
3051 DosExitCritSec();
3052 }
3053 strcpy(dcd->directory,(CHAR *)mp2);
3054 MakeValidDir(dcd->directory);
3055 WinSetWindowText(dcd->hwndExtract,dcd->directory);
3056 }
3057 break;
3058
3059 case IDM_WALKDIR:
3060 {
3061 CHAR newdir[CCHMAXPATH];
3062
3063 strcpy(newdir,dcd->directory);
3064 if(!WinDlgBox(HWND_DESKTOP,dcd->hwndParent,WalkExtractDlgProc,
3065 FM3ModHandle,WALK_FRAME,
3066 MPFROMP(newdir)) || !*newdir)
3067 break;
3068 if(stricmp(newdir,dcd->directory)) {
3069 strcpy(dcd->directory,newdir);
3070 if(stricmp(lastextractpath,newdir))
3071 strcpy(lastextractpath,newdir);
3072 WinSetWindowText(dcd->hwndExtract,dcd->directory);
3073 }
3074 }
3075 break;
3076
3077 case IDM_TEST:
3078 if(dcd->info->test)
3079 runemf2(SEPARATEKEEP | WINDOWED | MAXIMIZED,
3080 hwnd,NULL,NULL,"%s %s%s%s",dcd->info->test,
3081 (needs_quoting(dcd->arcname)) ? "\"" : NullStr,
3082 dcd->arcname,
3083 (needs_quoting(dcd->arcname)) ? "\"" : NullStr);
3084 break;
3085
3086 case IDM_REFRESH:
3087 case IDM_DELETE:
3088 case IDM_PRINT:
3089 case IDM_VIEW:
3090 case IDM_VIEWTEXT:
3091 case IDM_VIEWBINARY:
3092 case IDM_VIEWARCHIVE:
3093 case IDM_EDIT:
3094 case IDM_EDITTEXT:
3095 case IDM_EDITBINARY:
3096 case IDM_EXTRACT:
3097 case IDM_EXTRACTWDIRS:
3098 case IDM_FIND:
3099 case IDM_EXEC:
3100 case IDM_VIRUSSCAN:
3101 {
3102 LISTINFO *li;
3103
[358]3104 li = xmallocz(sizeof(LISTINFO),pszSrcFile,__LINE__);
3105 if (li) {
[2]3106 li->type = SHORT1FROMMP(mp1);
3107 li->hwnd = hwnd;
3108 li->list = BuildArcList(hwnd);
[358]3109 if (li->type == IDM_REFRESH) {
[2]3110
3111 CHAR s[CCHMAXPATH],*p;
3112 INT x,y;
3113
[358]3114 for (x = 0;li->list && li->list[x];x++) {
[2]3115 sprintf(s,"%s%s%s",dcd->workdir,
3116 (dcd->workdir[strlen(dcd->workdir) - 1] == '\\') ?
3117 NullStr : "\\",li->list[x]);
[358]3118 if (IsFile(s) != 1) {
[2]3119 free(li->list[x]);
3120 li->list[x] = NULL;
[358]3121 for (y = x;li->list[y];y++)
[2]3122 li->list[y] = li->list[y + 1];
[358]3123 li->list = xrealloc(li->list,y * sizeof(CHAR *),pszSrcFile,__LINE__);
[2]3124 x--;
3125 }
3126 else {
[358]3127 p = xstrdup(s,pszSrcFile,__LINE__);
3128 if (p) {
[2]3129 free(li->list[x]);
3130 li->list[x] = p;
3131 }
3132 }
[358]3133 } // for
[2]3134 }
3135 strcpy(li->arcname,dcd->arcname);
3136 li->info = dcd->info;
3137 {
3138 PARCITEM pai;
3139
3140 if(SHORT1FROMMP(mp1) != IDM_EXEC)
3141 pai = (PARCITEM)CurrentRecord(hwnd);
3142 else
3143 pai = (PARCITEM)WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,
3144 MPFROMLONG(CMA_FIRST),
3145 MPFROMSHORT(CRA_CURSORED));
3146 if(pai && (INT)pai != -1)
3147 strcpy(li->runfile,pai->szFileName);
3148 else
3149 strcpy(li->runfile,li->list[0]);
3150 }
3151 switch(SHORT1FROMMP(mp1)) {
3152 case IDM_VIEW:
3153 case IDM_VIEWTEXT:
3154 case IDM_VIEWBINARY:
3155 case IDM_VIEWARCHIVE:
3156 case IDM_EDIT:
3157 case IDM_EDITTEXT:
3158 case IDM_EDITBINARY:
3159 case IDM_EXEC:
3160 case IDM_PRINT:
3161 case IDM_VIRUSSCAN:
3162 strcpy(li->targetpath,dcd->workdir);
3163 break;
3164 default:
3165 strcpy(li->targetpath,dcd->directory);
3166 break;
3167 }
3168 if(li->list) {
3169 if(!PostMsg(dcd->hwndObject,UM_ACTION,MPFROMP(li),
3170 MPVOID)) {
[358]3171 Runtime_Error(pszSrcFile, __LINE__, "post");
[2]3172 FreeListInfo(li);
3173 }
3174 else if(fUnHilite && SHORT1FROMMP(mp1) != IDM_EDIT)
3175 UnHilite(hwnd,TRUE,&dcd->lastselection);
3176 }
3177 else
3178 free(li);
3179 }
3180 }
3181 break;
3182 }
3183 }
3184 return 0;
3185
3186 case WM_CONTROL:
3187 DosError(FERR_DISABLEHARDERR);
3188 if(dcd) {
3189 switch(SHORT2FROMMP(mp1)) {
3190 case CN_BEGINEDIT:
3191 PostMsg(hwnd,
3192 CM_CLOSEEDIT,
3193 MPVOID,
3194 MPVOID);
3195 break;
3196
3197 case CN_ENDEDIT:
3198 if(!((PCNREDITDATA)mp2)->pRecord) {
3199
3200 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo;
3201 USHORT cmd = 0;
3202
3203 if(!pfi || pfi->offStruct == FIELDOFFSET(ARCITEM,pszFileName))
3204 cmd = IDM_SORTSMARTNAME;
3205 else if(pfi->offStruct == FIELDOFFSET(ARCITEM,cbFile))
3206 cmd = IDM_SORTSIZE;
3207 else if(pfi->offStruct == FIELDOFFSET(ARCITEM,cbComp))
3208 cmd = IDM_SORTEASIZE;
3209 else if(pfi->offStruct == FIELDOFFSET(ARCITEM,date))
3210 cmd = IDM_SORTLWDATE;
3211 else if(pfi->offStruct == FIELDOFFSET(ARCITEM,time))
3212 cmd = IDM_SORTLWDATE;
3213 if(cmd)
3214 PostMsg(hwnd,
3215 WM_COMMAND,
3216 MPFROM2SHORT(cmd,0),
3217 MPVOID);
3218 }
3219 break;
3220
3221 case CN_DROPHELP:
3222 saymsg(MB_ENTER,hwnd,
3223 GetPString(IDS_DROPHELPHDRTEXT),
3224 GetPString(IDS_ARCCNRDROPHELPTEXT),
3225 dcd->arcname);
3226 return 0;
3227
3228 case CN_DRAGLEAVE:
3229 if(mp2) {
3230
3231 PDRAGINFO pDInfo;
3232
3233 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;
3234 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
3235 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3236 }
3237 return 0;
3238
3239 case CN_DRAGAFTER:
3240 case CN_DRAGOVER:
3241 if(mp2) {
3242
3243 PDRAGITEM pDItem; /* Pointer to DRAGITEM */
3244 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */
3245 PARCITEM pci;
3246
3247 pci = (PARCITEM)((PCNRDRAGINFO)mp2)->pRecord;
3248 if(SHORT1FROMMP(mp1) == CN_DRAGAFTER)
3249 pci = NULL;
3250 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;
3251 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */
3252 if(*dcd->arcname) {
3253 if((driveflags[toupper(*dcd->arcname) - 'A'] & DRIVE_NOTWRITEABLE) ||
3254 !dcd->info ||
3255 !dcd->info->create) {
3256 DrgFreeDraginfo(pDInfo);
3257 return MRFROM2SHORT(DOR_NEVERDROP,0);
3258 }
3259 }
3260 if(pci) {
3261 DrgFreeDraginfo(pDInfo);
3262 return MRFROM2SHORT(DOR_NODROP,0);
3263 }
3264 pDItem = DrgQueryDragitemPtr(pDInfo, /* Access DRAGITEM */
3265 0); /* Index to DRAGITEM */
3266 if(DrgVerifyRMF(pDItem, /* Check valid rendering */
3267 DRM_OS2FILE, /* mechanisms and data */
3268 NULL) &&
3269 !(pDItem->fsControl & DC_PREPARE)) {
3270 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3271 return(MRFROM2SHORT(DOR_DROP, /* Return okay to drop */
3272 ((fCopyDefault) ?
3273 DO_COPY : DO_MOVE)));
3274 }
3275 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */
3276 }
3277 return(MRFROM2SHORT(DOR_NEVERDROP,0)); /* Drop not valid */
3278
3279 case CN_INITDRAG:
3280 if(mp2) {
3281
3282 BOOL wasemphasized = FALSE;
3283 PCNRDRAGINIT pcd = (PCNRDRAGINIT)mp2;
3284 PARCITEM pci;
3285
3286 if(pcd) {
3287 pci = (PARCITEM)pcd->pRecord;
3288 if(pci) {
3289 if(pci->rc.flRecordAttr & CRA_SELECTED)
3290 wasemphasized = TRUE;
3291 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
3292 fSplitStatus && hwndStatus2)
3293 WinSetWindowText(hwndStatus2,
3294 GetPString(IDS_DRAGARCMEMTEXT));
3295 if(DoFileDrag(hwnd,
3296 dcd->hwndObject,
3297 mp2,
3298 dcd->arcname,
3299 NULL,
3300 TRUE)) {
3301 if(fUnHilite && wasemphasized)
3302 UnHilite(hwnd,TRUE,&dcd->lastselection);
3303 }
3304 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
3305 fSplitStatus && hwndStatus2)
3306 PostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
3307 }
3308 else {
3309 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
3310 fSplitStatus && hwndStatus2)
3311 WinSetWindowText(hwndStatus2,
3312 GetPString(IDS_DRAGARCFILETEXT));
3313 DragOne(hwnd,
3314 dcd->hwndObject,
3315 dcd->arcname,
3316 FALSE);
3317 if(!ParentIsDesktop(hwnd,dcd->hwndParent) &&
3318 fSplitStatus && hwndStatus2)
3319 PostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
3320 }
3321 }
3322 }
3323 return 0;
3324
3325 case CN_DROP:
3326 if(mp2) {
3327
3328 LISTINFO *li;
3329
[358]3330 DosBeep(500,100); // fixme to know why beep?
[2]3331 li = DoFileDrop(hwnd,
3332 dcd->arcname,
3333 FALSE,
3334 mp1,
3335 mp2);
[358]3336 DosBeep(50,100); // fixme to know why beep?
[2]3337 if(li) {
3338 li->type = (li->type == DO_MOVE) ?
3339 IDM_ARCHIVEM :
3340 IDM_ARCHIVE;
3341 strcpy(li->targetpath,dcd->arcname);
3342 if(!li->list ||
3343 !li->list[0] ||
3344 !PostMsg(dcd->hwndObject,
3345 UM_ACTION,
3346 MPFROMP(li),
3347 MPVOID))
3348 FreeListInfo(li);
3349 }
3350 }
3351 return 0;
3352
3353 case CN_CONTEXTMENU:
3354 {
3355 PARCITEM pci = (PARCITEM)mp2;
3356
3357 if(pci) {
3358 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPFROMP(pci),
3359 MPFROM2SHORT(TRUE,CRA_CURSORED));
3360 MarkAll(hwnd,FALSE,FALSE,TRUE);
3361 dcd->hwndLastMenu = CheckMenu(&ArcMenu,ARC_POPUP);
3362 }
3363 else {
3364 dcd->hwndLastMenu = CheckMenu(&ArcCnrMenu,ARCCNR_POPUP);
3365 if(dcd->hwndLastMenu && !dcd->cnremphasized) {
3366 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPVOID,
3367 MPFROM2SHORT(TRUE,CRA_SOURCE));
3368 dcd->cnremphasized = TRUE;
3369 }
3370 }
3371 if(dcd->hwndLastMenu) {
3372 if(dcd->hwndLastMenu == ArcCnrMenu) {
3373 if(dcd->flWindowAttr & CV_MINI)
3374 WinCheckMenuItem(dcd->hwndLastMenu,IDM_MINIICONS,TRUE);
3375 }
3376 WinCheckMenuItem(dcd->hwndLastMenu,IDM_FOLDERAFTEREXTRACT,
3377 fFolderAfterExtract);
3378 if(!PopupMenu(hwnd,hwnd,dcd->hwndLastMenu)) {
3379 if(dcd->cnremphasized) {
3380 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPVOID,
3381 MPFROM2SHORT(FALSE,CRA_SOURCE));
3382 dcd->cnremphasized = TRUE;
3383 }
3384 MarkAll(hwnd,TRUE,FALSE,TRUE);
3385 }
3386 }
3387 }
3388 break;
3389
3390 case CN_EMPHASIS:
3391 if(mp2) {
3392
3393 PNOTIFYRECORDEMPHASIS pre = mp2;
3394 PARCITEM pci;
[156]3395 CHAR s[CCHMAXPATHCOMP + 91],tf[81],tb[81];
[2]3396
3397 pci = (PARCITEM)((pre) ? pre->pRecord : NULL);
3398 if(!pci) {
3399 if(!ParentIsDesktop(hwnd,dcd->hwndParent)) {
3400 if(hwndStatus2)
3401 WinSetWindowText(hwndStatus2,NullStr);
3402 if(fMoreButtons)
3403 WinSetWindowText(hwndName,NullStr);
3404 }
3405 break;
3406 }
3407 if(pre->fEmphasisMask & CRA_SELECTED) {
3408 if(pci->rc.flRecordAttr & CRA_SELECTED) {
3409 dcd->selectedbytes += pci->cbFile;
3410 dcd->selectedfiles++;
3411 }
3412 else if(dcd->selectedfiles) {
3413 dcd->selectedbytes -= pci->cbFile;
3414 dcd->selectedfiles--;
3415 }
3416 commafmt(tf,sizeof(tf),dcd->selectedfiles);
[156]3417 if (dcd->ullTotalBytes)
3418 CommaFmtULL(tb,sizeof(tb),dcd->selectedbytes,' ');
3419 else
3420 *tb = 0;
3421 sprintf(s,"%s%s%s",
3422 tf,
3423 *tb ? " / " : NullStr,
3424 tb);
[2]3425 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,s);
3426 }
3427 else if(WinQueryActiveWindow(dcd->hwndParent) ==
3428 dcd->hwndFrame &&
3429 !ParentIsDesktop(hwnd,dcd->hwndParent)) {
3430 if(pre->fEmphasisMask & CRA_CURSORED) {
3431 if(pci->rc.flRecordAttr & CRA_CURSORED) {
3432 if(fSplitStatus && hwndStatus2) {
[156]3433 if (dcd->ullTotalBytes)
3434 CommaFmtULL(tb,sizeof(tb),pci->cbFile,' ');
3435 else
3436 *tb = 0;
3437 sprintf(s,"%s%s%s%s",
3438 *tb ? " " : NullStr,
3439 tb,
3440 *tb ? " " : NullStr,
[2]3441 pci->szFileName);
3442 WinSetWindowText(hwndStatus2,s);
3443 }
3444 if(fMoreButtons)
3445 WinSetWindowText(hwndName,pci->szFileName);
3446 }
3447 }
3448 }
3449 }
3450 break;
3451
3452 case CN_ENTER:
3453 if(mp2) {
3454
3455 PARCITEM pci = (PARCITEM)((PNOTIFYRECORDENTER)mp2)->pRecord;
3456
3457 if(pci) {
3458
3459 CHAR *s;
3460
3461 if((pci->rc.flRecordAttr & CRA_INUSE) ||
3462 (pci->flags & (ARCFLAGS_REALDIR | ARCFLAGS_PSEUDODIR)))
3463 break;
[358]3464 s = xstrdup(pci->szFileName,pszSrcFile,__LINE__);
3465 if (s) {
[2]3466 if(!PostMsg(dcd->hwndObject,UM_ENTER,
3467 MPFROMP(s),MPVOID)) {
[358]3468 Runtime_Error(pszSrcFile, __LINE__, "post");
[2]3469 free(s);
3470 }
3471 }
3472 }
3473 }
3474 break;
3475 }
3476 }
3477 return 0;
3478
3479 case UM_FOLDUP:
3480 if(!PostMsg((HWND)0,
3481 WM_QUIT,
3482 MPVOID,
3483 MPVOID))
3484 DosExit(EXIT_PROCESS,1);
3485 return 0;
3486
3487 case UM_CLOSE:
3488 WinDestroyWindow(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),
3489 QW_PARENT));
3490 return 0;
3491
3492 case WM_SAVEAPPLICATION:
3493 if(dcd &&
3494 ParentIsDesktop(hwnd,dcd->hwndParent)) {
3495
3496 SWP swp;
3497
3498 WinQueryWindowPos(dcd->hwndFrame,&swp);
3499 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE)))
3500 PrfWriteProfileData(fmprof,
3501 appname,
3502 "AV2SizePos",
3503 &swp,
3504 sizeof(swp));
3505 }
3506 break;
3507
3508 case WM_CLOSE:
3509 WinSendMsg(hwnd,
3510 WM_SAVEAPPLICATION,
3511 MPVOID,
3512 MPVOID);
3513 if(dcd)
3514 dcd->stopflag++;
3515 if(dcd && dcd->hwndObject) {
3516 if(!PostMsg(dcd->hwndObject,
3517 WM_CLOSE,
3518 MPVOID,
3519 MPVOID))
3520 WinSendMsg(dcd->hwndObject,
3521 WM_CLOSE,
3522 MPVOID,
3523 MPVOID);
3524 }
[130]3525 dcd = WinQueryWindowPtr(hwnd,QWL_USER);
[2]3526 if(!dcd ||
3527 (!dcd->dontclose &&
3528 !dcd->amextracted &&
3529 ParentIsDesktop(hwnd,dcd->hwndParent))) {
3530 if(!PostMsg(hwnd,
3531 UM_FOLDUP,
3532 MPVOID,
3533 MPVOID))
3534 WinSendMsg(hwnd,
3535 UM_FOLDUP,
3536 MPVOID,
3537 MPVOID);
3538 }
3539 return 0;
3540
3541 case WM_DESTROY:
3542 if(ArcMenu)
3543 WinDestroyWindow(ArcMenu);
3544 if(ArcCnrMenu)
3545 WinDestroyWindow(ArcCnrMenu);
3546 ArcMenu = ArcCnrMenu = (HWND)0;
3547 EmptyCnr(hwnd);
3548 break;
3549 }
3550 return (dcd && dcd->oldproc) ? dcd->oldproc(hwnd,msg,mp1,mp2) :
3551 PFNWPCnr(hwnd,msg,mp1,mp2);
3552}
3553
3554
3555HWND StartArcCnr (HWND hwndParent,HWND hwndCaller,CHAR *arcname,INT flags,
[212]3556 ARC_TYPE *sinfo)
3557{
[2]3558 /*
3559 * bitmapped flags:
3560 * 1 = am extracted from another archive
3561 * 4 = don't kill proc on close
3562 */
3563
3564 HWND hwndFrame = (HWND)0,hwndClient;
3565 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
3566 FCF_SIZEBORDER | FCF_MINMAX |
3567 FCF_ICON | FCF_NOBYTEALIGN |
3568 FCF_ACCELTABLE;
3569 USHORT id;
3570 DIRCNRDATA *dcd;
3571 ARC_TYPE *info = sinfo;
3572 CHAR fullname[CCHMAXPATH],*p,temp;
3573 static USHORT idinc = 0;
3574
3575 if(!idinc)
3576 idinc = (rand() % 256);
3577 if(ParentIsDesktop(hwndParent,hwndParent))
3578 FrameFlags |= (FCF_TASKLIST | FCF_MENU);
3579 if(arcname) {
3580 DosError(FERR_DISABLEHARDERR);
3581 if(DosQueryPathInfo(arcname,
3582 FIL_QUERYFULLNAME,
3583 fullname,
3584 sizeof(fullname)))
3585 strcpy(fullname,arcname);
3586 p = fullname;
3587 while(*p) {
3588 if(*p == '/')
3589 *p = '\\';
3590 p++;
3591 }
3592 if(!info)
3593 info = find_type(fullname,
3594 arcsighead);
3595 if(!info)
3596 return hwndFrame;
3597 hwndFrame = WinCreateStdWindow(hwndParent,
3598 WS_VISIBLE,
3599 &FrameFlags,
3600 GetPString(IDS_WCARCCONTAINER),
3601 NULL,
3602 WS_VISIBLE | fwsAnimate,
3603 FM3ModHandle,
3604 ARC_FRAME,
3605 &hwndClient);
3606 if(hwndFrame && hwndClient) {
3607 id = ARC_FRAME + idinc++;
3608 if(idinc > 512)
3609 idinc = 0;
3610 WinSetWindowUShort(hwndFrame,QWS_ID,id);
[358]3611 dcd = xmallocz(sizeof(DIRCNRDATA),pszSrcFile,__LINE__);
3612 if (!dcd) {
3613 PostMsg(hwndClient,WM_CLOSE,MPVOID,MPVOID);
3614 hwndFrame = (HWND)0;
3615 }
3616 else {
[2]3617 dcd->size = sizeof(DIRCNRDATA);
3618 dcd->id = id;
3619 dcd->type = ARC_FRAME;
3620 save_dir2(dcd->workdir);
3621 if(dcd->workdir[strlen(dcd->workdir) - 1] != '\\')
3622 strcat(dcd->workdir,"\\");
3623 sprintf(dcd->workdir + strlen(dcd->workdir),"%s.%03x",
3624 ArcTempRoot,(clock() & 4095));
3625 strcpy(dcd->arcname,fullname);
3626 if(*extractpath) {
3627 if(!strcmp(extractpath,"*")) {
3628 p = strrchr(fullname,'\\');
3629 if(p) {
3630 if(p < fullname + 3)
3631 p++;
3632 temp = *p;
3633 *p = 0;
3634 strcpy(dcd->directory,fullname);
3635 *p = temp;
3636 }
3637 }
3638 else
3639 strcpy(dcd->directory,extractpath);
3640 }
3641 if(!*dcd->directory &&
3642 *lastextractpath) {
3643 DosEnterCritSec();
3644 strcpy(dcd->directory,lastextractpath);
3645 DosExitCritSec();
3646 }
3647 if(!*dcd->directory) {
3648 if(!ParentIsDesktop(hwndParent,hwndParent))
3649 TopWindowName(hwndParent,
3650 hwndCaller,
3651 dcd->directory);
3652 if(!*dcd->directory) {
3653 p = strrchr(fullname,'\\');
3654 if(p) {
3655 if(p < fullname + 3)
3656 p++;
3657 *p = 0;
3658 strcpy(dcd->directory,fullname);
3659 }
3660 }
3661 }
3662 if(!*dcd->directory ||
3663 IsFile(dcd->directory) ||
3664 (isalpha(*dcd->directory) &&
3665 (driveflags[toupper(*dcd->directory) - 'A'] & DRIVE_NOTWRITEABLE)))
3666 save_dir2(dcd->directory);
3667 dcd->hwndParent = (hwndParent) ? hwndParent :
3668 HWND_DESKTOP;
3669 dcd->hwndFrame = hwndFrame;
3670 dcd->hwndClient = hwndClient;
3671 dcd->amextracted = ((flags & 1) != 0);
3672 dcd->dontclose = ((flags & 4) != 0);
3673 dcd->info = info;
[212]3674 dcd->sortFlags = DefArcSortFlags;
[2]3675 {
3676 PFNWP oldproc;
3677
3678 oldproc = WinSubclassWindow(hwndFrame,
3679 (PFNWP)ArcFrameWndProc);
3680 WinSetWindowPtr(hwndFrame,
[212]3681 QWL_USER,
[2]3682 (PVOID)oldproc);
3683 }
3684 dcd->hwndCnr = WinCreateWindow(hwndClient,
3685 WC_CONTAINER,
3686 NULL,
3687 CCS_AUTOPOSITION | CCS_MINIICONS |
3688 CCS_MINIRECORDCORE | ulCnrType |
3689 WS_VISIBLE,
3690 0,
3691 0,
3692 0,
3693 0,
3694 hwndClient,
3695 HWND_TOP,
3696 (ULONG)ARC_CNR,
3697 NULL,
3698 NULL);
[358]3699 if (!dcd->hwndCnr) {
3700 PostMsg(hwndClient,
3701 WM_CLOSE,
3702 MPVOID,
3703 MPVOID);
3704 free(dcd);
3705 hwndFrame = (HWND)0;
3706 }
3707 else {
[2]3708 WinSetWindowPtr(dcd->hwndCnr,
[212]3709 QWL_USER,
[2]3710 (PVOID)dcd);
3711 {
3712 CHAR s[CCHMAXPATH + 8];
3713
[358]3714 sprintf(s,"AV/2: %s",dcd->arcname);
[2]3715 WinSetWindowText(hwndFrame,s);
[358]3716 WinSetWindowText(WinWindowFromID(hwndFrame,FID_TITLEBAR),s);
[2]3717 }
3718 dcd->oldproc = WinSubclassWindow(dcd->hwndCnr,
3719 (PFNWP)ArcCnrWndProc);
3720 {
3721 USHORT ids[] = {DIR_TOTALS,DIR_SELECTED,DIR_VIEW,DIR_SORT,
3722 DIR_FILTER,DIR_FOLDERICON,0};
3723
3724 CommonCreateTextChildren(dcd->hwndClient,
3725 GetPString(IDS_WCARCSTATUS),
3726 ids);
3727 }
3728 WinEnableWindow(WinWindowFromID(dcd->hwndClient,DIR_VIEW),
3729 FALSE);
3730 dcd->hwndExtract = WinCreateWindow(dcd->hwndClient,
3731 WC_ENTRYFIELD,
3732 NULL,
3733 ES_AUTOSCROLL,
3734 0,
3735 0,
3736 0,
3737 0,
3738 dcd->hwndClient,
3739 HWND_TOP,
3740 ARC_EXTRACTDIR,
3741 NULL,
3742 NULL);
3743 WinSendMsg(dcd->hwndExtract,
3744 EM_SETTEXTLIMIT,
3745 MPFROM2SHORT(CCHMAXPATH,0),
3746 MPVOID);
3747 WinSetWindowText(dcd->hwndExtract,
3748 dcd->directory);
3749 if(!PostMsg(dcd->hwndCnr,
3750 UM_SETUP,
3751 MPVOID,
3752 MPVOID))
3753 WinSendMsg(dcd->hwndCnr,
3754 UM_SETUP,
3755 MPVOID,
3756 MPVOID);
3757 if(FrameFlags & FCF_MENU) {
3758 if(!fToolbar) {
3759
3760 HWND hwndMenu = WinWindowFromID(hwndFrame,FID_MENU);
3761
3762 if(hwndMenu) {
3763 WinSendMsg(hwndMenu,MM_DELETEITEM,
3764 MPFROM2SHORT(IDM_VIEW,FALSE),
3765 MPVOID);
3766 WinSendMsg(hwndMenu,MM_DELETEITEM,
3767 MPFROM2SHORT(IDM_EXEC,FALSE),
3768 MPVOID);
3769 WinSendMsg(hwndMenu,MM_DELETEITEM,
3770 MPFROM2SHORT(IDM_RESCAN,FALSE),
3771 MPVOID);
3772 WinSendMsg(hwndMenu,MM_DELETEITEM,
3773 MPFROM2SHORT(IDM_DELETE,FALSE),
3774 MPVOID);
3775 WinSendMsg(hwndMenu,MM_DELETEITEM,
3776 MPFROM2SHORT(IDM_EXTRACT,FALSE),
3777 MPVOID);
3778 WinSendMsg(hwndMenu,MM_DELETEITEM,
3779 MPFROM2SHORT(IDM_TEST,FALSE),
3780 MPVOID);
3781 WinSendMsg(hwndMenu,MM_DELETEITEM,
3782 MPFROM2SHORT(IDM_VIRUSSCAN,FALSE),
3783 MPVOID);
3784 WinSendMsg(hwndMenu,MM_DELETEITEM,
3785 MPFROM2SHORT(IDM_WALKDIR,FALSE),
3786 MPVOID);
3787 WinSendMsg(hwndMenu,MM_DELETEITEM,
3788 MPFROM2SHORT(IDM_FILTER,FALSE),
3789 MPVOID);
3790 }
3791 }
3792 }
[358]3793 if (FrameFlags & FCF_TASKLIST) {
[2]3794
3795 SWP swp,swpD;
3796 ULONG size = sizeof(swp);
3797 LONG cxScreen,cyScreen;
3798
3799 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame),0,&swp);
3800 if(PrfQueryProfileData(fmprof,
3801 appname,
3802 "AV2SizePos",
3803 &swpD,
3804 &size)) {
3805 cxScreen = WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN);
3806 cyScreen = WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN);
3807 if(swp.x + swpD.cx > cxScreen)
3808 swp.x = cxScreen - swpD.cx;
3809 if(swp.y + swpD.cy > cyScreen)
3810 swp.y = cyScreen - swpD.cy;
3811 swp.cx = swpD.cx;
3812 swp.cy = swpD.cy;
3813 }
3814 WinSetWindowPos(hwndFrame,
3815 HWND_TOP,
3816 swp.x,
3817 swp.y,
3818 swp.cx,
3819 swp.cy,
3820 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER |
3821 SWP_ACTIVATE);
3822 }
3823 }
3824 }
3825 }
3826 }
3827 return hwndFrame;
3828}
Note: See TracBrowser for help on using the repository browser.