source: trunk/dll/arccnrs.c@ 1242

Last change on this file since 1242 was 1242, checked in by John Small, 17 years ago

Ticket 288: Ensure DEBUG is passed to compiler and cleanup obsolete #ifdef DEBUG code

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