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