Changeset 306
- Timestamp:
- Jun 27, 2006, 2:24:18 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/avl.c
r287 r306 7 7 8 8 Copyright (c) 1993, 1998 M. Kimes 9 Copyright (c) 2004, 200 5Steven H.Levine9 Copyright (c) 2004, 2006 Steven H.Levine 10 10 11 11 01 Aug 04 SHL Rework lstrip/rstrip usage … … 15 15 18 Aug 05 SHL Comments 16 16 31 Dec 05 SHL indent -i2 17 08 Dec 05 SHL load_archivers: allow empty startlist 18 30 Dec 05 SHL load_archivers: use get_archiver_line?(), clean nits 19 29 May 06 SHL SBoxDlgProc: support move, add, delete 20 30 May 06 SHL load_archivers: add reload support 21 16 Jun 06 SHL load_archivers: support signatures containing 0s 17 22 18 23 ***********************************************************************/ 19 24 20 25 #define INCL_WIN 26 #define INCL_WINSTDDRAG 21 27 #define INCL_DOS 22 28 #include <os2.h> … … 32 38 #include "fm3str.h" 33 39 34 BOOL loadedarcs;35 36 40 #pragma alloc_text(MISC9,quick_find_type,find_type) 41 42 static void free_arc_type(ARC_TYPE *pat); 43 static void fill_listbox(HWND hwnd, BOOL fShowAll, SHORT sOldSelect); 44 45 //=== quick_find_type() === 37 46 38 47 ARC_TYPE *quick_find_type(CHAR * filespec, ARC_TYPE * topsig) … … 41 50 CHAR *p; 42 51 43 if (! loadedarcs)52 if (!arcsigsloaded) 44 53 load_archivers(); 45 54 p = strrchr(filespec, '.'); … … 61 70 } 62 71 return found; 72 } 73 74 //=== fill_listbox() fill or refill listbox from current archiver definitions === 75 76 static VOID fill_listbox(HWND hwnd, BOOL fShowAll, SHORT sOldSelect) 77 { 78 ARC_TYPE *pat; 79 BOOL found = FALSE; 80 SHORT sSelect; 81 82 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_DELETEALL, MPVOID, MPVOID); 83 84 for (pat = arcsighead; pat; pat = pat -> next) 85 { 86 /* 87 * this inner loop tests for a dup signature entry and assures 88 * that only the entry at the top of the list gets used for 89 * conversion; editing any is okay 90 */ 91 if (!fShowAll) 92 { 93 ARC_TYPE *pat2; 94 BOOL isDup = FALSE; 95 for (pat2 = arcsighead; 96 pat2 && pat -> siglen && pat2 != pat && !isDup; 97 pat2 = pat2 -> next) 98 { 99 isDup = pat2 -> siglen == pat -> siglen && 100 !memcmp(pat2 -> signature, pat -> signature, pat -> siglen); 101 } // for 102 if (isDup) 103 continue; 104 } 105 106 // If caller is editing archivers or entry useful to caller, show in listbox 107 if (fShowAll || (pat -> id && pat -> extract && pat -> create)) 108 { 109 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM, 110 MPFROM2SHORT(LIT_END, 0), 111 MPFROMP(pat -> id ? 112 pat -> id : "?")); 113 if (!found && *szDefArc && pat -> id && !strcmp(szDefArc, pat -> id)) 114 { 115 // Highlight default 116 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 117 MPFROMSHORT(sSelect), MPFROMSHORT(TRUE)); 118 found = TRUE; 119 } 120 } 121 else 122 { 123 // Complain about odd entry 124 if (!pat -> id || !*pat -> id) 125 { 126 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM, 127 MPFROM2SHORT(LIT_END, 0), 128 MPFROMP(GetPString(IDS_UNKNOWNUNUSABLETEXT))); 129 } 130 else 131 { 132 CHAR s[81]; 133 sprintf(s, "%0.12s %s", pat -> id, GetPString(IDS_UNUSABLETEXT)); 134 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM, 135 MPFROM2SHORT(LIT_END, 0), 136 MPFROMP(s)); 137 } 138 } 139 } // while scanning 140 141 // Try to reselect last selection unless user wants default selection 142 if (sOldSelect != LIT_NONE && !found) { 143 SHORT sItemCount = (SHORT)WinSendDlgItemMsg(hwnd,ASEL_LISTBOX,LM_QUERYITEMCOUNT, 144 MPVOID,MPVOID); 145 if (sOldSelect >= sItemCount) 146 sOldSelect = sItemCount - 1; 147 if (sOldSelect >= 0) { 148 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 149 MPFROMSHORT(sOldSelect), MPFROMSHORT(TRUE)); 150 } 151 } 152 153 if (found) 154 PosOverOkay(hwnd); 63 155 } 64 156 … … 73 165 CHAR buffer[80]; 74 166 75 if (! loadedarcs)167 if (!arcsigsloaded) 76 168 load_archivers(); 77 169 if (!topsig) … … 95 187 for (info = topsig; info; info = info -> next) 96 188 { 97 if ( !info -> signature || !*info -> signature)189 if (info -> siglen == 0) 98 190 { 99 191 // No signature -- check extension … … 112 204 } 113 205 // Try signature match 114 l = strlen(info -> signature);206 l = info -> siglen; 115 207 l = min(l, 79); 116 208 if (!DosChgFilePtr(handle, … … 140 232 } 141 233 142 #pragma alloc_text(AVL,load_archivers) 234 //=== free_arc_type() free allocated ARC_TYPE === 235 236 static void free_arc_type(ARC_TYPE *pat) 237 { 238 if (pat) 239 { 240 if (pat -> id) 241 free(pat -> id); 242 if (pat -> ext) 243 free(pat -> ext); 244 if (pat -> list) 245 free(pat -> list); 246 if (pat -> extract) 247 free(pat -> extract); 248 if (pat -> create) 249 free(pat -> create); 250 if (pat -> move) 251 free(pat -> move); 252 if (pat -> delete) 253 free(pat -> delete); 254 if (pat -> signature) 255 free(pat -> signature); 256 if (pat -> startlist) 257 free(pat -> startlist); 258 if (pat -> endlist) 259 free(pat -> endlist); 260 if (pat -> exwdirs) 261 free(pat -> exwdirs); 262 if (pat -> test) 263 free(pat -> test); 264 if (pat -> createrecurse) 265 free(pat -> createrecurse); 266 if (pat -> createwdirs) 267 free(pat -> createwdirs); 268 if (pat -> movewdirs) 269 free(pat -> movewdirs); 270 free(pat); 271 } 272 } 273 274 #pragma alloc_text(AVL,load_archivers, get_archiver_line) 275 276 //=== get_archiver_line() read line, strip comments and whitespace === 277 278 #define ARCHIVER_LINE_BYTES 256 279 280 static PSZ get_archiver_line(PSZ pszIn, FILE * pf) 281 { 282 PSZ psz = fgets(pszIn, ARCHIVER_LINE_BYTES, pf); 283 PSZ psz2; 284 285 if (psz) 286 { 287 psz2 = strchr(pszIn, ';'); 288 if (psz2) 289 *psz2 = 0; // Chop comment 290 bstripcr(pszIn); // Strip leading white and trailing white and CR/LF 291 292 } 293 return psz; 294 } 295 296 //=== get_archiver_line2() read line, strip whitespace === 297 298 static PSZ get_archiver_line2(PSZ pszIn, FILE * pf) 299 { 300 PSZ psz = fgets(pszIn, ARCHIVER_LINE_BYTES, pf); 301 302 if (psz) 303 bstripcr(pszIn); // Strip lead white and trailing white and CR/LF 304 305 return psz; 306 } 307 308 //=== load_archivers() load or reload archive definitions from archiver.bb2 === 143 309 144 310 INT load_archivers(VOID) 145 311 { 146 312 FILE *handle; 147 CHAR s[ 257];313 CHAR s[ARCHIVER_LINE_BYTES + 1]; 148 314 CHAR *p; 149 ARC_TYPE * info = NULL;150 ARC_TYPE * last = NULL;315 ARC_TYPE *pat; 316 ARC_TYPE *patLast; 151 317 INT numlines = NUMLINES; 152 INT x; 153 154 loadedarcs = TRUE; 318 INT i; 319 320 if (arcsighead) { 321 for (pat = arcsighead; pat;) { 322 patLast = pat; 323 pat = pat->next; 324 free_arc_type(patLast); 325 } 326 arcsighead = NULL; 327 } 328 329 arcsigsmodified = FALSE; 330 155 331 DosEnterCritSec(); 156 332 p = searchpath(GetPString(IDS_ARCHIVERBB2)); … … 166 342 strcpy(archiverbb2, p); 167 343 // Get lines per record count 168 if (! fgets(s, 256, handle))344 if (!get_archiver_line(s, handle)) 169 345 { 170 346 fclose(handle); 171 347 return -3; 172 348 } 173 p = strchr(s, ';');174 if (p)175 *p = 0; // Chop trailing comment176 177 bstripcr(s);178 349 if (*s) 179 350 numlines = atoi(s); … … 181 352 return -3; 182 353 // Parse rest 354 pat = NULL; 355 patLast = NULL; 183 356 while (!feof(handle)) 184 357 { 185 if (! fgets(s, 256, handle))358 if (!get_archiver_line(s, handle)) 186 359 break; // EOF 187 188 p = strchr(s, ';');189 if (p)190 *p = 0; // Chop comment191 192 bstripcr(s);193 360 // 1st non-blank line starts definition 194 361 // fixme to preserve comments 195 362 // fixme to avoid allocating empty fields 363 196 364 if (*s) 197 365 { 198 info= malloc(sizeof(ARC_TYPE));199 if (! info)366 pat = malloc(sizeof(ARC_TYPE)); 367 if (!pat) 200 368 break; // fixme to complain 201 369 202 memset(info, 0, sizeof(ARC_TYPE)); 370 memset(pat, 0, sizeof(ARC_TYPE)); 371 pat -> id = strdup(s); 372 if (!get_archiver_line(s, handle)) // line 2 373 374 break; 203 375 if (*s) 204 info -> id = strdup(s); 205 else 206 info -> id = NULL; 207 if (!fgets(s, 256, handle)) 208 break; 209 p = strchr(s, ';'); 210 if (p) 211 *p = 0; 212 bstripcr(s); 376 pat -> ext = strdup(s); 377 else 378 pat -> ext = NULL; 379 if (!get_archiver_line(s, handle)) // line 3 380 381 break; 382 pat -> file_offset = atol(s); 383 if (!get_archiver_line(s, handle)) // line 4 384 385 break; 213 386 if (*s) 214 info -> ext = strdup(s); 215 else 216 info -> ext = NULL; 217 if (!fgets(s, 256, handle)) 218 break; 219 p = strchr(s, ';'); 220 if (p) 221 *p = 0; 222 info -> file_offset = atol(s); 223 if (!fgets(s, 256, handle)) 224 break; 225 p = strchr(s, ';'); 226 if (p) 227 *p = 0; 228 bstripcr(s); 387 pat -> list = strdup(s); 388 else 389 pat -> list = NULL; 390 if (!pat -> list) 391 break; 392 if (!get_archiver_line(s, handle)) // line 5 393 394 break; 229 395 if (*s) 230 info -> list = strdup(s); 231 else 232 info -> list = NULL; 233 if (!info -> list) 234 break; 235 if (!fgets(s, 256, handle)) 236 break; 237 p = strchr(s, ';'); 238 if (p) 239 *p = 0; 240 bstripcr(s); 396 pat -> extract = strdup(s); 397 else 398 pat -> extract = NULL; 399 if (!get_archiver_line(s, handle)) // line 6 400 401 break; 241 402 if (*s) 242 info -> extract = strdup(s); 243 else 244 info -> extract = NULL; 245 if (!fgets(s, 256, handle)) 246 break; 247 p = strchr(s, ';'); 248 if (p) 249 *p = 0; 250 bstripcr(s); 403 pat -> exwdirs = strdup(s); 404 else 405 pat -> exwdirs = NULL; 406 if (!get_archiver_line(s, handle)) // line 7 407 408 break; 251 409 if (*s) 252 info -> exwdirs = strdup(s); 253 else 254 info -> exwdirs = NULL; 255 if (!fgets(s, 256, handle)) 256 break; 257 p = strchr(s, ';'); 258 if (p) 259 *p = 0; 260 bstripcr(s); 410 pat -> test = strdup(s); 411 else 412 pat -> test = NULL; 413 if (!get_archiver_line(s, handle)) // line 8 414 415 break; 261 416 if (*s) 262 info -> test = strdup(s); 263 else 264 info -> test = NULL; 265 if (!fgets(s, 256, handle)) 266 break; 267 p = strchr(s, ';'); 268 if (p) 269 *p = 0; 270 bstripcr(s); 417 pat -> create = strdup(s); 418 else 419 pat -> create = NULL; 420 if (!get_archiver_line(s, handle)) // line 9 421 422 break; 271 423 if (*s) 272 info -> create = strdup(s); 273 else 274 info -> create = NULL; 275 if (!fgets(s, 256, handle)) 276 break; 277 p = strchr(s, ';'); 278 if (p) 279 *p = 0; // Chop comment 280 281 bstripcr(s); 424 pat -> createwdirs = strdup(s); 425 else 426 pat -> createwdirs = NULL; 427 if (!get_archiver_line(s, handle)) // line 10 428 429 break; 282 430 if (*s) 283 info -> createwdirs = strdup(s); 284 else 285 info -> createwdirs = NULL; 286 if (!fgets(s, 256, handle)) 287 break; 288 p = strchr(s, ';'); 289 if (p) 290 *p = 0; 291 bstripcr(s); 431 pat -> createrecurse = strdup(s); 432 else 433 pat -> createrecurse = NULL; 434 if (!get_archiver_line(s, handle)) // line 11 435 436 break; 292 437 if (*s) 293 info -> createrecurse = strdup(s); 294 else 295 info -> createrecurse = NULL; 296 if (!fgets(s, 256, handle)) 297 break; 298 p = strchr(s, ';'); 299 if (p) 300 *p = 0; 301 bstripcr(s); 438 pat -> move = strdup(s); 439 else 440 pat -> move = NULL; 441 if (!get_archiver_line(s, handle)) // line 12 442 443 break; 302 444 if (*s) 303 info -> move = strdup(s); 304 else 305 info -> move = NULL; 306 if (!fgets(s, 256, handle)) 307 break; 308 p = strchr(s, ';'); 309 if (p) 310 *p = 0; 311 bstripcr(s); 445 pat -> movewdirs = strdup(s); 446 else 447 pat -> movewdirs = NULL; 448 if (!get_archiver_line(s, handle)) // line 13 449 450 break; 451 pat -> delete = strdup(s); 452 453 if (!get_archiver_line2(s, handle)) // line 14 454 break; 455 i = literal(s); // Translate \ escapes 456 if (i) 457 { 458 pat -> siglen = i; 459 pat -> signature = malloc(i); 460 if (!pat -> signature) 461 break; 462 memcpy(pat -> signature, s, i); // signature may not be a string 463 } 464 else { 465 pat -> siglen = 0; 466 pat -> signature = NULL; 467 } 468 if (!get_archiver_line2(s, handle)) // line 15 469 470 break; 312 471 if (*s) 313 info -> movewdirs = strdup(s); 314 else 315 info -> movewdirs = NULL; 316 if (!fgets(s, 256, handle)) 317 break; 318 p = strchr(s, ';'); 319 if (p) 320 *p = 0; 321 bstripcr(s); 322 info -> delete = strdup(s); 323 if (!fgets(s, 256, handle)) 324 break; 325 stripcr(s); 326 literal(s); 472 pat -> startlist = strdup(s); 473 else 474 pat -> startlist = NULL; 475 if (!get_archiver_line2(s, handle)) // line 16 476 477 break; 327 478 if (*s) 328 { 329 info -> signature = strdup(s); 330 if (!info -> signature) 331 break; 332 } 333 else 334 info -> signature = NULL; 335 if (!fgets(s, 256, handle)) 336 break; 337 stripcr(s); 338 info -> startlist = strdup(s); 339 if (!fgets(s, 256, handle)) 340 break; 341 stripcr(s); 342 if (*s) 343 info -> endlist = strdup(s); 344 else 345 info -> endlist = NULL; 346 if (!fgets(s, 256, handle)) 347 break; 348 p = strchr(s, ';'); 349 if (p) 350 *p = 0; 351 info -> osizepos = atoi(s); 352 if (!fgets(s, 256, handle)) 353 break; 354 p = strchr(s, ';'); 355 if (p) 356 *p = 0; 357 info -> nsizepos = atoi(s); 358 if (!fgets(s, 256, handle)) 359 break; 360 p = strchr(s, ';'); 361 if (p) 362 *p = 0; 363 info -> fdpos = atoi(s); 479 pat -> endlist = strdup(s); 480 else 481 pat -> endlist = NULL; 482 if (!get_archiver_line(s, handle)) // line 17 483 484 break; 485 pat -> osizepos = atoi(s); 486 if (!get_archiver_line(s, handle)) // line 18 487 488 break; 489 pat -> nsizepos = atoi(s); 490 if (!get_archiver_line(s, handle)) // line 19 491 492 break; 493 pat -> fdpos = atoi(s); 364 494 p = strchr(s, ','); 365 495 if (p) 366 496 { 367 497 p++; 368 info -> datetype = atoi(p); 369 } 370 if (!fgets(s, 256, handle)) 371 break; 372 p = strchr(s, ';'); 373 if (p) 374 *p = 0; 375 info -> fdflds = atoi(s); 376 if (!fgets(s, 256, handle)) 377 break; 378 p = strchr(s, ';'); 379 if (p) 380 *p = 0; 381 info -> fnpos = atoi(s); 498 pat -> datetype = atoi(p); 499 } 500 if (!get_archiver_line(s, handle)) // line 20 501 502 break; 503 pat -> fdflds = atoi(s); 504 if (!get_archiver_line(s, handle)) // line 21 505 506 break; 507 pat -> fnpos = atoi(s); 382 508 p = strchr(s, ','); 383 509 if (p) 384 510 { 385 511 p++; 386 info-> nameislast = (BOOL) (*p && atol(p) == 0) ? FALSE : TRUE;512 pat -> nameislast = (BOOL) (*p && atol(p) == 0) ? FALSE : TRUE; 387 513 p = strchr(p, ','); 388 514 if (p) 389 515 { 390 516 p++; 391 info-> nameisnext = (BOOL) (*p && atol(p) == 0) ? FALSE : TRUE;517 pat -> nameisnext = (BOOL) (*p && atol(p) == 0) ? FALSE : TRUE; 392 518 p = strchr(p, ','); 393 519 if (p) 394 520 { 395 521 p++; 396 info-> nameisfirst = (BOOL) (*p && atol(p) == 0) ? FALSE : TRUE;522 pat -> nameisfirst = (BOOL) (*p && atol(p) == 0) ? FALSE : TRUE; 397 523 } 398 524 } 399 525 } 400 526 // Ignore unknown lines - must be newer file format 401 for ( x = NUMLINES; x < numlines; x++)402 { 403 if (! fgets(s, 256, handle))527 for (i = NUMLINES; i < numlines; i++) 528 { 529 if (!get_archiver_line(s, handle)) 404 530 break; 405 531 } 406 532 407 info-> next = NULL;533 pat -> next = NULL; 408 534 409 535 if (!arcsighead) 410 536 { 411 arcsighead = last = info;412 info-> prev = NULL;413 } 414 else 415 { 416 last -> next = info;417 info -> prev = last;418 last = info;419 } 420 if ( info -> extract && !*info-> extract)421 { 422 free( info-> extract);423 info-> extract = NULL;424 } 425 } 426 427 info= NULL;428 } 537 arcsighead = patLast = pat; 538 pat -> prev = NULL; 539 } 540 else 541 { 542 patLast -> next = pat; 543 pat -> prev = patLast; 544 patLast = pat; 545 } 546 if (pat -> extract && !*pat -> extract) 547 { 548 free(pat -> extract); 549 pat -> extract = NULL; 550 } 551 } // if got definition 552 553 pat = NULL; 554 } // while lines 429 555 fclose(handle); 430 if (info) 431 { 432 // fixme to complain about partial definition 433 if (info -> id) 434 free(info -> id); 435 if (info -> ext) 436 free(info -> ext); 437 if (info -> list) 438 free(info -> list); 439 if (info -> extract) 440 free(info -> extract); 441 if (info -> create) 442 free(info -> create); 443 if (info -> move) 444 free(info -> move); 445 if (info -> delete) 446 free(info -> delete); 447 if (info -> signature) 448 free(info -> signature); 449 if (info -> startlist) 450 free(info -> startlist); 451 if (info -> endlist) 452 free(info -> endlist); 453 if (info -> exwdirs) 454 free(info -> exwdirs); 455 if (info -> test) 456 free(info -> test); 457 if (info -> createrecurse) 458 free(info -> createrecurse); 459 if (info -> createwdirs) 460 free(info -> createwdirs); 461 if (info -> movewdirs) 462 free(info -> movewdirs); 463 } 556 557 free_arc_type(pat); 558 464 559 if (!arcsighead) 465 560 return -4; 561 562 arcsigsloaded = TRUE; 563 466 564 return 0; 467 565 } 468 566 469 #pragma alloc_text(FMARCHIVE,SBoxDlgProc) 567 #define TEST_DRAG 0 // fixme to gone 568 569 #pragma alloc_text(FMARCHIVE,SBoxDlgProc,SDlgListboxSubclassProc) 570 571 static MRESULT EXPENTRY SDlgListboxSubclassProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 572 { 573 PFNWP pfnOldProc = (PFNWP)WinQueryWindowPtr(hwnd, QWL_USER); 574 575 PDRAGITEM pditem; 576 PDRAGINFO pdinfo; 577 BOOL ok; 578 579 static BOOL emphasized = FALSE; 580 static PSZ DRMDRF_LBOX = "<DRM_LBOX,DRF_UNKNOWN>"; 581 static PSZ DRM_LBOX = "DRM_LBOX"; 582 583 switch (msg) 584 { 585 case WM_BEGINDRAG: 586 { 587 LONG cur_ndx; 588 DRAGITEM ditem; 589 DRAGIMAGE dimage; 590 HWND hwndDrop; 591 592 fprintf(stderr, "SDlgListboxSubclassProc: BEGINDRAG\n"); 593 cur_ndx = WinQueryLboxSelectedItem(hwnd); 594 595 if (cur_ndx != LIT_NONE) { 596 pdinfo = DrgAllocDraginfo(1); 597 if(pdinfo) { 598 pdinfo->usOperation = DO_DEFAULT; 599 pdinfo->hwndSource = hwnd; 600 601 memset(&ditem,0,sizeof(DRAGITEM)); 602 ditem.hwndItem = hwnd; 603 ditem.ulItemID = 1; 604 ditem.hstrType = DrgAddStrHandle(DRT_UNKNOWN); 605 ditem.hstrRMF = DrgAddStrHandle(DRMDRF_LBOX); 606 ditem.hstrContainerName = DrgAddStrHandle(""); 607 ditem.hstrSourceName = DrgAddStrHandle(""); 608 ditem.hstrTargetName = DrgAddStrHandle(""); 609 // ditem.fsControl = 0; 610 ditem.fsSupportedOps = DO_MOVEABLE; 611 612 memset(&dimage,0,sizeof(DRAGIMAGE)); 613 dimage.cb = sizeof(DRAGIMAGE); 614 dimage.hImage = hptrFile; 615 dimage.cptl = 0; 616 dimage.fl = DRG_ICON; 617 dimage.sizlStretch.cx = 32; 618 dimage.sizlStretch.cy = 32; 619 dimage.cxOffset = -16; 620 dimage.cyOffset = 0; 621 DrgSetDragitem(pdinfo, 622 &ditem, 623 sizeof(DRAGITEM), 624 0); /* Index of DRAGITEM */ 625 hwndDrop = DrgDrag(hwnd, 626 pdinfo, 627 &dimage, 628 1, /* One DRAGIMAGE */ 629 VK_ENDDRAG, 630 NULL); 631 if (!hwndDrop) { 632 Win_Error(hwnd,hwnd,__FILE__,__LINE__,"DrgDrag"); 633 } 634 635 DrgFreeDraginfo(pdinfo); 636 // WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_ACTIVATE); 637 } 638 } 639 break; 640 } 641 642 case DM_DRAGOVER: 643 ok = FALSE; 644 if (!emphasized) 645 { 646 POINTL ptl; 647 POINTL ptl2; 648 emphasized = TRUE; 649 ptl.x = SHORT1FROMMP(mp2); 650 ptl.y = SHORT2FROMMP(mp2); 651 ptl2 = ptl; 652 WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl2, 1); 653 fprintf(stderr, "DRAGOVER mapped x y %d %d to %d %d\n", ptl.x, ptl.y, ptl2.x, ptl2.y); 654 WinPostMsg(hwnd, WM_BUTTON1CLICK, 655 MPFROM2SHORT((SHORT)ptl2.x, (SHORT)ptl2.y), 656 MPFROM2SHORT(HT_NORMAL, KC_NONE)); 657 fprintf(stderr, "DRAGOVER posted 0x%x WM_BUTTON1CLICK x y %d %d\n", hwnd, ptl2.x, ptl2.y); 658 } 659 pdinfo = (PDRAGINFO)mp1; /* Get DRAGINFO pointer */ 660 if (pdinfo) { 661 DrgAccessDraginfo(pdinfo); 662 pditem = DrgQueryDragitemPtr(pdinfo,0); 663 /* Check valid rendering mechanisms and data format */ 664 ok = DrgVerifyRMF(pditem, DRM_LBOX, NULL); 665 DrgFreeDraginfo(pdinfo); 666 if (ok) { 667 } 668 } 669 return ok ? MRFROM2SHORT(DOR_DROP, DO_MOVE) : MRFROM2SHORT(DOR_NEVERDROP, 0); 670 671 case DM_DRAGLEAVE: 672 if (emphasized) 673 { 674 emphasized = FALSE; 675 // fixme to draw listbox item emphasized 676 // DrawTargetEmphasis(hwnd, emphasized); 677 fprintf(stderr, "DRAGLEAVE\n"); 678 fflush(stderr); 679 } 680 return 0; 681 682 case DM_DROPHELP: 683 DropHelp(mp1, mp2, hwnd, "fixme to give some help"); 684 return 0; 685 686 case DM_DROP: 687 ok = FALSE; 688 fprintf(stderr, "DROP\n"); 689 fflush(stderr); 690 if (emphasized) 691 { 692 emphasized = FALSE; 693 // DrawTargetEmphasis(hwnd, emphasized); 694 } 695 pdinfo = (PDRAGINFO)mp1; /* Get DRAGINFO pointer */ 696 if (pdinfo) { 697 DrgAccessDraginfo(pdinfo); 698 pditem = DrgQueryDragitemPtr(pdinfo,0); 699 if (!pditem) 700 Win_Error(hwnd,hwnd,__FILE__,__LINE__,"DM_DROP"); 701 /* Check valid rendering mechanisms and data */ 702 ok = DrgVerifyRMF(pditem,DRM_LBOX,NULL) && ~pditem->fsControl & DC_PREPARE; 703 if (ok) { 704 // ret = FullDrgName(pditem,buffer,buflen); 705 /* note: targetfail is returned to source for all items */ 706 DrgSendTransferMsg(pdinfo->hwndSource,DM_ENDCONVERSATION, 707 MPFROMLONG(pditem->ulItemID), 708 MPFROMLONG(DMFL_TARGETSUCCESSFUL)); 709 } 710 DrgDeleteDraginfoStrHandles(pdinfo); 711 DrgFreeDraginfo(pdinfo); 712 } 713 return 0; 714 } // switch 715 return pfnOldProc ? pfnOldProc(hwnd, msg, mp1, mp2) : 716 WinDefWindowProc(hwnd, msg, mp1, mp2); 717 } 718 719 //=== SBoxDlgProc() Select archiver to use or edit, supports list reorder too === 470 720 471 721 MRESULT EXPENTRY SBoxDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 472 722 { 473 /* dlg proc that allows selecting an archiver entry */ 474 475 ARC_TYPE **info, *temp, *test; 476 SHORT sSelect, x; 477 CHAR text[256]; 723 ARC_TYPE **ppatReturn; // Where to return selected archiver 724 ARC_TYPE *pat; 725 SHORT sSelect; 726 SHORT sItemCount; 727 CHAR szItemText[256]; 728 CHAR szPCItemText[256]; // Parent or child item text 729 SHORT i; 730 APIRET apiret; 731 BOOL fShowAll; 732 733 static SHORT sLastSelect = LIT_NONE; 478 734 479 735 switch (msg) 480 736 { 481 737 case WM_INITDLG: 482 if (! loadedarcs)738 if (!arcsigsloaded) 483 739 load_archivers(); 484 if (!(ARC_TYPE **) 740 if (!(ARC_TYPE **)mp2) 485 741 { 486 742 DosBeep(100, 100); … … 488 744 break; 489 745 } 490 info = (ARC_TYPE **) mp2; 491 if (*info) 492 *info = arcsighead; 493 WinSetWindowPtr(hwnd, 0L, (PVOID) info); 494 temp = arcsighead; 495 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_DELETEALL, MPVOID, MPVOID); 496 /* this loop fills the listbox */ 497 { 498 BOOL found = FALSE; 499 500 while (temp) 501 { 502 /* 503 * this inner loop tests for a dupe signature entry and assures 504 * that only the entry at the top of the list gets used for 505 * conversion; editing any is okay 506 */ 507 if (*info) 508 { 509 test = arcsighead; 510 while (test && test != temp) 511 { 512 if (test -> signature && temp -> signature && 513 !strcmp(test -> signature, temp -> signature)) 514 goto ContinueHere; // Got match 515 516 test = test -> next; 517 } 518 } 519 520 if (!*info || (temp -> id && temp -> extract && temp -> create)) 521 { 522 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM, 523 MPFROM2SHORT(LIT_END, 0), 524 MPFROMP((temp -> id) ? 525 temp -> id : "?")); 526 if (!found && *szDefArc && temp -> id && !strcmp(szDefArc, temp -> id)) 527 { 528 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 529 MPFROMSHORT(sSelect), MPFROMSHORT(TRUE)); 530 found = TRUE; 531 } 532 } 746 /* Passed arg points to where to return selected archiver definition 747 * On input arg value controls selection list content 748 * If non-NULL, dup names are suppressed 749 * If NULL, all definitions are shown 750 */ 751 ppatReturn = (ARC_TYPE **)mp2; 752 fShowAll = *ppatReturn == NULL; 753 if (*ppatReturn) 754 *ppatReturn = arcsighead; // Preset to first 755 WinSetWindowPtr(hwnd, QWL_USER, (PVOID)ppatReturn); 756 fill_listbox(hwnd, fShowAll, sLastSelect); 757 758 #ifdef TEST_DRAG // fixme 759 { 760 HWND hwnd2 = WinWindowFromID(hwnd, ASEL_LISTBOX); 761 PFNWP pfn = WinSubclassWindow(hwnd2, 762 SDlgListboxSubclassProc); 763 WinSetWindowPtr(hwnd2, QWL_USER, (PVOID) pfn); 764 } 765 #endif // TEST_DRAG fixme 766 767 break; 768 769 case WM_COMMAND: 770 ppatReturn = (ARC_TYPE **) WinQueryWindowPtr(hwnd, QWL_USER); 771 switch (SHORT1FROMMP(mp1)) 772 { 773 case DID_OK: 774 sSelect = (SHORT)WinSendDlgItemMsg(hwnd, 775 ASEL_LISTBOX, 776 LM_QUERYSELECTION, 777 MPFROMSHORT(LIT_FIRST), 778 MPVOID); 779 if (sSelect == LIT_NONE) 780 { 781 DosBeep(100, 100); 782 return 0; 783 } 784 pat = arcsighead; 785 if (*ppatReturn) 786 { 787 // If dups hidden, find archiver with matching id 788 *szItemText = 0; 789 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT, 790 MPFROM2SHORT(sSelect, 255), MPFROMP(szItemText)); 791 if (!*szItemText) 792 pat = NULL; 533 793 else 534 794 { 535 if (!temp -> id || !*temp -> id) 536 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM, 537 MPFROM2SHORT(LIT_END, 0), 538 MPFROMP(GetPString(IDS_UNKNOWNUNUSABLETEXT))); 539 else 795 for (;pat; pat = pat -> next) 540 796 { 541 CHAR s[81]; 542 543 sprintf(s, "%0.12s %s", 544 temp -> id, 545 GetPString(IDS_UNUSABLETEXT)); 546 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM, 547 MPFROM2SHORT(LIT_END, 0), 548 MPFROMP(s)); 549 } 550 } 551 552 ContinueHere: 553 554 temp = temp -> next; 555 } 556 if (found) 557 PosOverOkay(hwnd); 558 } 559 break; 560 561 case WM_COMMAND: 562 info = (ARC_TYPE **) WinQueryWindowPtr(hwnd, 0L); 563 switch (SHORT1FROMMP(mp1)) 564 { 565 case DID_OK: 566 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, 567 ASEL_LISTBOX, 568 LM_QUERYSELECTION, 569 MPFROMSHORT(LIT_FIRST), 570 MPVOID); 571 if (sSelect >= 0) 572 { 573 temp = arcsighead; 574 if (*info) 575 { 576 *text = 0; 577 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT, 578 MPFROM2SHORT(sSelect, 255), MPFROMP(text)); 579 if (*text) 580 { 581 while (temp) 582 { 583 if (temp -> id) 584 { 585 if (!strcmp(text, temp -> id)) 586 break; 587 } 588 temp = temp -> next; 589 } 590 } 591 else 592 temp = NULL; 593 } 594 else 595 { 596 x = 0; 597 while (temp) 598 { 599 if (x >= sSelect) 600 break; 601 x++; 602 temp = temp -> next; 603 } 604 } 605 if (temp && (!*info || (temp -> id && temp -> extract && 606 temp -> create))) 607 { 608 *info = temp; 609 } 610 else 611 { 612 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 613 MPFROMSHORT(LIT_NONE), FALSE); 614 DosBeep(100, 100); 615 temp = NULL; 616 return 0; 617 } 618 } 619 else 620 { 797 if (pat -> id && !strcmp(szItemText, pat -> id)) 798 break; // Found it 799 } 800 } 801 } 802 else 803 { 804 // If dups not hidden, lookup by count 805 for (i = 0; pat && i < sSelect; i++, pat = pat -> next) 806 ; // Scan 807 } 808 if (pat && (!*ppatReturn || 809 (pat -> id && pat -> extract && pat -> create))) 810 { 811 *ppatReturn = pat; 812 } 813 else 814 { 815 // Refuse to select 816 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 817 MPFROMSHORT(LIT_NONE), FALSE); 621 818 DosBeep(100, 100); 622 819 return 0; 623 820 } 821 sLastSelect = sSelect; 624 822 WinDismissDlg(hwnd, TRUE); 625 823 return 0; 626 824 627 825 case DID_CANCEL: 628 *info = NULL; 629 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID); 630 break; 631 632 default: 633 break; 634 } 635 return 0; 826 if (arcsigsmodified) { 827 if (saymsg(MB_YESNO, 828 hwnd, 829 GetPString(IDS_ADCHANGESINMEMTEXT), 830 GetPString(IDS_ADREWRITETEXT), 831 NullStr) == 832 MBID_YES) { 833 PSZ ab2 = searchpath(GetPString(IDS_ARCHIVERBB2)); // Rewrite without prompting 834 rewrite_archiverbb2(ab2); 835 } 836 } 837 sSelect = (SHORT)WinSendDlgItemMsg(hwnd, 838 ASEL_LISTBOX, 839 LM_QUERYSELECTION, 840 MPFROMSHORT(LIT_FIRST), 841 MPVOID); 842 if (sSelect != LIT_NONE) 843 sLastSelect = sSelect; 844 *ppatReturn = NULL; 845 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID); // fixme to understand why needed 846 return 0; 847 848 case ASEL_PB_ADD: 849 sSelect = (SHORT)WinSendDlgItemMsg(hwnd, 850 ASEL_LISTBOX, 851 LM_QUERYSELECTION, 852 MPFROMSHORT(LIT_FIRST), 853 MPVOID); 854 if (sSelect != LIT_NONE) { 855 ARCDUMP ad; 856 memset(&ad,0,sizeof(ARCDUMP)); 857 ad.info = malloc(sizeof(ARC_TYPE)); 858 if (ad.info) { 859 memset(ad.info, 0, sizeof(ARC_TYPE)); 860 if (!WinDlgBox(HWND_DESKTOP, 861 hwnd, 862 ArcReviewDlgProc, 863 FM3ModHandle, 864 AD_FRAME, 865 MPFROMP(&ad))) 866 { 867 free(ad.info); 868 } 869 else { 870 // Find self - assume all archivers listed since we are editing 871 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) 872 ; // Find self 873 874 if (!pat) { 875 if (arcsighead) 876 saymsg(0,NULLHANDLE,"*Debug*","Can not find self at %d at %s::%u", sSelect, __FILE__, __LINE__); 877 else 878 arcsighead = ad.info; 879 } 880 else { 881 // Insert before 882 if (pat->prev) { 883 ad.info->next = pat; 884 ad.info->prev = pat->prev; 885 pat->prev->next = ad.info; 886 pat->prev = ad.info; 887 } 888 else { 889 arcsighead = ad.info; 890 ad.info->next = pat; 891 pat->prev = ad.info; 892 } 893 } 894 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_INSERTITEM, 895 MPFROM2SHORT(sSelect, 0), 896 MPFROMP(ad.info -> id ? ad.info -> id : "?")); 897 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 898 MPFROMSHORT(sSelect - 1), MPFROMSHORT(TRUE)); 899 arcsigsmodified = TRUE; 900 } 901 } 902 } 903 return 0; 904 case ASEL_PB_DELETE: 905 sSelect = (SHORT)WinSendDlgItemMsg(hwnd, 906 ASEL_LISTBOX, 907 LM_QUERYSELECTION, 908 MPFROMSHORT(LIT_FIRST), 909 MPVOID); 910 if (sSelect != LIT_NONE) { 911 // Find self - assume all archivers listed since we are editing 912 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) 913 ; // Find self 914 915 if (!pat) { 916 saymsg(0,NULLHANDLE,"*Debug*","Can not find self at %d at %s::%u",sSelect, __FILE__, __LINE__); 917 } 918 else { 919 // Delete current 920 if (pat->prev) { 921 pat->prev->next = pat->next; 922 if (pat->next) 923 pat->next->prev = pat->prev; 924 } 925 else { 926 arcsighead = pat->next; 927 if (pat->next) 928 pat->next->prev = pat->prev; 929 } 930 } 931 free_arc_type(pat); 932 arcsigsmodified = TRUE; 933 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_DELETEITEM, 934 MPFROM2SHORT(sSelect, 0), 935 MPVOID); 936 sItemCount = (SHORT)WinSendDlgItemMsg(hwnd,ASEL_LISTBOX,LM_QUERYITEMCOUNT, 937 MPVOID,MPVOID); 938 if (sSelect >= sItemCount) 939 sSelect--; 940 if (sSelect >= 0) { 941 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 942 MPFROMSHORT(sSelect), MPFROMSHORT(TRUE)); 943 } 944 } 945 return 0; 946 case ASEL_PB_UP: 947 sSelect = (SHORT)WinSendDlgItemMsg(hwnd, 948 ASEL_LISTBOX, 949 LM_QUERYSELECTION, 950 MPFROMSHORT(LIT_FIRST), 951 MPVOID); 952 if (sSelect != LIT_NONE && sSelect > 0) { 953 // Find self - assume all archivers listed since we are editing 954 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) 955 ; // Find self 956 if (!pat || !pat->prev) { 957 saymsg(0,NULLHANDLE,"*Debug*","Can not find self at %d at %s::%u",sSelect, __FILE__, __LINE__); 958 } 959 else { 960 ARC_TYPE *patGDad; 961 ARC_TYPE *patDad; 962 ARC_TYPE *patChild; 963 patChild = pat->next; 964 patDad = pat->prev; 965 patGDad = patDad->prev; 966 patDad->next = patChild; 967 if (patChild) 968 patChild->prev = patDad; 969 patDad->prev = pat; 970 pat->next = patDad; 971 if (patGDad) { 972 patGDad->next = pat; 973 pat->prev = patGDad; 974 } 975 else { 976 arcsighead = pat; 977 pat->prev = NULL; 978 } 979 980 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT, 981 MPFROM2SHORT(sSelect, 255), MPFROMP(szItemText)); 982 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT, 983 MPFROM2SHORT(sSelect - 1, 255), MPFROMP(szPCItemText)); 984 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT, 985 MPFROMSHORT(sSelect), MPFROMP(szPCItemText)); 986 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT, 987 MPFROMSHORT(sSelect - 1), MPFROMP(szItemText)); 988 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 989 MPFROMSHORT(sSelect - 1), MPFROMSHORT(TRUE)); 990 arcsigsmodified = TRUE; 991 } 992 } 993 return 0; 994 case ASEL_PB_DOWN: 995 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,ASEL_LISTBOX,LM_QUERYSELECTION, 996 MPFROMSHORT(LIT_FIRST),MPVOID); 997 sItemCount = (SHORT)WinSendDlgItemMsg(hwnd,ASEL_LISTBOX,LM_QUERYITEMCOUNT, 998 MPVOID,MPVOID); 999 if (sSelect != LIT_NONE && sSelect < sItemCount - 1) { 1000 // Find self - assume all archivers listed since we are editing 1001 for (i = 0, pat = arcsighead; pat && i < sSelect; pat = pat->next, i++) 1002 ; // Find self 1003 if (!pat || !pat->next) { 1004 saymsg(0,NULLHANDLE,"*Debug*","Can not find self at %d/%d at %s::%u",sSelect, sItemCount, __FILE__, __LINE__); 1005 } 1006 else { 1007 ARC_TYPE *patDad; 1008 ARC_TYPE *patChild; 1009 patDad = pat->prev; 1010 patChild = pat->next; 1011 pat->next = patChild->next; 1012 patChild->next = pat; 1013 pat->prev = patChild; 1014 patChild->prev = patDad; 1015 if (patDad) { 1016 patDad->next = patChild; 1017 patChild->prev=patDad; 1018 } 1019 else { 1020 arcsighead = patChild; 1021 patChild->prev=NULL; 1022 } 1023 1024 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT, 1025 MPFROM2SHORT(sSelect, 255), MPFROMP(szItemText)); 1026 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_QUERYITEMTEXT, 1027 MPFROM2SHORT(sSelect + 1, 255), MPFROMP(szPCItemText)); 1028 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT, 1029 MPFROMSHORT(sSelect), MPFROMP(szPCItemText)); 1030 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SETITEMTEXT, 1031 MPFROMSHORT(sSelect + 1), MPFROMP(szItemText)); 1032 WinSendDlgItemMsg(hwnd, ASEL_LISTBOX, LM_SELECTITEM, 1033 MPFROMSHORT(sSelect + 1), MPFROMSHORT(TRUE)); 1034 arcsigsmodified = TRUE; 1035 } 1036 } 1037 return 0; 1038 1039 case ASEL_PB_REVERT: 1040 // Reload without checking in case changed outside 1041 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,ASEL_LISTBOX,LM_QUERYSELECTION, 1042 MPFROMSHORT(LIT_FIRST),MPVOID); 1043 load_archivers(); 1044 fill_listbox(hwnd, TRUE, sSelect); 1045 return 0; 1046 1047 case IDM_HELP: 1048 if (hwndHelp) { 1049 WinSendMsg(hwndHelp, 1050 HM_DISPLAY_HELP, 1051 MPFROM2SHORT(HELP_EDITARC,0), // fixme to be HELP_SELARC 1052 MPFROMSHORT(HM_RESOURCEID)); 1053 } 1054 } 1055 return 0; // WM_COMMAND 636 1056 637 1057 case WM_CONTROL: … … 651 1071 652 1072 /* 653 02-08-96 23:55 1 1073 see archiver.tmp 1074 02-08-96 23:55 1 654 1075 8 Feb 96 23:55:32 2 655 1076 8 Feb 96 11:55p 3 656 96-02-08 23:55:32 4 1077 96-02-08 23:55:32 4 1078 31-02-98 23:55 5 657 1079 */ 658 1080
Note:
See TracChangeset
for help on using the changeset viewer.