Changeset 6810 for trunk/src/comctl32
- Timestamp:
- Sep 25, 2001, 12:54:55 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/comctl32undoc.c
r6709 r6810 19 19 #define WINE_LARGE_INTEGER 20 20 #endif 21 21 22 #include <string.h> 22 23 #include <stdlib.h> /* atoi */ … … 27 28 #include "winbase.h" 28 29 #include "winerror.h" 30 #include "winreg.h" 29 31 30 32 #include "wine/unicode.h" … … 34 36 35 37 DEFAULT_DEBUG_CHANNEL(commctrl); 36 37 38 38 39 #ifdef __WIN32OS2__ … … 423 424 */ 424 425 426 #ifdef __WIN32OS2__ 427 #include <wine\undoccomctl32.h> 428 #else 425 429 typedef struct tagCREATEMRULIST 426 430 { … … 446 450 */ 447 451 448 typedef struct tagMRU 449 { 450 DWORD dwParam1; /* some kind of flag */ 451 DWORD dwParam2; 452 DWORD dwParam3; 453 HKEY hkeyMRU; 454 LPCSTR lpszSubKey; 455 DWORD dwParam6; 456 } MRU, *HMRU; 452 typedef struct tagWINEMRUITEM 453 { 454 DWORD size; /* size of data stored */ 455 DWORD itemFlag; /* flags */ 456 BYTE datastart; 457 } WINEMRUITEM, *LPWINEMRUITEM; 458 459 /* itemFlag */ 460 #define WMRUIF_CHANGED 0x0001 /* this dataitem changed */ 461 462 typedef struct tagWINEMRULIST 463 { 464 CREATEMRULIST extview; /* original create information */ 465 DWORD wineFlags; /* internal flags */ 466 DWORD cursize; /* current size of realMRU */ 467 LPSTR realMRU; /* pointer to string of index names */ 468 LPWINEMRUITEM *array; /* array of pointers to data */ 469 /* in 'a' to 'z' order */ 470 } WINEMRULIST, *LPWINEMRULIST; 471 472 /* wineFlags */ 473 #define WMRUF_CHANGED 0x0001 /* MRU list has changed */ 457 474 458 475 HANDLE WINAPI 459 476 CreateMRUListLazyA (LPCREATEMRULIST lpcml, DWORD dwParam2, 460 477 DWORD dwParam3, DWORD dwParam4); 461 478 #endif 479 480 /************************************************************************** 481 * MRU_SaveChanged - Localize MRU saving code 482 * 483 */ 484 VOID MRU_SaveChanged( LPWINEMRULIST mp ) 485 { 486 INT i, err; 487 HKEY newkey; 488 CHAR realname[2]; 489 LPWINEMRUITEM witem; 490 491 /* or should we do the following instead of RegOpenKeyEx: 492 */ 493 494 /* open the sub key */ 495 if ((err = RegOpenKeyExA( mp->extview.hKey, mp->extview.lpszSubKey, 496 0, KEY_WRITE, &newkey))) { 497 /* not present - what to do ??? */ 498 ERR("Can not open key, error=%d, attempting to create\n", 499 err); 500 if ((err = RegCreateKeyExA( mp->extview.hKey, mp->extview.lpszSubKey, 501 0, 502 "", 503 REG_OPTION_NON_VOLATILE, 504 KEY_READ | KEY_WRITE, 505 0, 506 &newkey, 507 0))) { 508 ERR("failed to create key /%s/, err=%d\n", 509 mp->extview.lpszSubKey, err); 510 return; 511 } 512 } 513 if (mp->wineFlags & WMRUF_CHANGED) { 514 mp->wineFlags &= ~WMRUF_CHANGED; 515 err = RegSetValueExA(newkey, "MRUList", 0, REG_SZ, 516 mp->realMRU, lstrlenA(mp->realMRU) + 1); 517 if (err) { 518 ERR("error saving MRUList, err=%d\n", err); 519 } 520 TRACE("saving MRUList=/%s/\n", mp->realMRU); 521 } 522 realname[1] = 0; 523 for(i=0; i<mp->cursize; i++) { 524 witem = mp->array[i]; 525 if (witem->itemFlag & WMRUIF_CHANGED) { 526 witem->itemFlag &= ~WMRUIF_CHANGED; 527 realname[0] = 'a' + i; 528 err = RegSetValueExA(newkey, realname, 0, 529 (mp->extview.dwFlags & MRUF_BINARY_LIST) ? 530 REG_BINARY : REG_SZ, 531 &witem->datastart, witem->size); 532 if (err) { 533 ERR("error saving /%s/, err=%d\n", realname, err); 534 } 535 TRACE("saving value for name /%s/ size=%ld\n", 536 realname, witem->size); 537 } 538 } 539 RegCloseKey( newkey ); 540 } 462 541 463 542 /************************************************************************** … … 486 565 FreeMRUListA (HANDLE hMRUList) 487 566 { 488 FIXME("(%08x) empty stub!\n", hMRUList); 489 490 #if 0 491 if (!(hmru->dwParam1 & 1001)) { 492 RegSetValueExA (hmru->hKeyMRU, "MRUList", 0, REG_SZ, 493 hmru->lpszMRUString, 494 strlen (hmru->lpszMRUString)); 495 } 496 497 498 RegClosKey (hmru->hkeyMRU 499 COMCTL32_Free32 (hmru->lpszMRUString); 500 #endif 501 502 return COMCTL32_Free ((LPVOID)hMRUList); 567 LPWINEMRULIST mp = (LPWINEMRULIST)hMRUList; 568 INT i; 569 570 TRACE("\n"); 571 if (mp->wineFlags & WMRUF_CHANGED) { 572 /* need to open key and then save the info */ 573 MRU_SaveChanged( mp ); 574 } 575 576 for(i=0; i<mp->extview.nMaxItems; i++) { 577 if (mp->array[i]) 578 COMCTL32_Free(mp->array[i]); 579 } 580 COMCTL32_Free(mp->realMRU); 581 COMCTL32_Free(mp->array); 582 return COMCTL32_Free(mp); 583 } 584 585 586 /************************************************************************** 587 * FindMRUData [COMCTL32.169] 588 * 589 * Searches binary list for item that matches lpData of length cbData. 590 * Returns position in list order 0 -> MRU and if lpRegNum != NULL then value 591 * corresponding to item's reg. name will be stored in it ('a' -> 0). 592 * 593 * PARAMS 594 * hList [I] list handle 595 * lpData [I] data to find 596 * cbData [I] length of data 597 * lpRegNum [O] position in registry (maybe NULL) 598 * 599 * RETURNS 600 * Position in list 0 -> MRU. -1 if item not found. 601 */ 602 INT WINAPI 603 FindMRUData (HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum) 604 { 605 LPWINEMRULIST mp = (LPWINEMRULIST)hList; 606 INT i, ret; 607 608 if (!mp->extview.lpfnCompare) { 609 ERR("MRU list not properly created. No compare procedure.\n"); 610 return -1; 611 } 612 613 for(i=0; i<mp->cursize; i++) { 614 if (mp->extview.dwFlags & MRUF_BINARY_LIST) { 615 if (!mp->extview.lpfnCompare(lpData, &mp->array[i]->datastart, 616 cbData)) 617 break; 618 } 619 else { 620 if (!mp->extview.lpfnCompare(lpData, &mp->array[i]->datastart)) 621 break; 622 } 623 } 624 if (i < mp->cursize) 625 ret = i; 626 else 627 ret = -1; 628 if (lpRegNum && (ret != -1)) 629 *lpRegNum = 'a' + i; 630 631 TRACE("(%08x, %p, %ld, %p) returning %d\n", 632 hList, lpData, cbData, lpRegNum, ret); 633 634 return ret; 503 635 } 504 636 … … 523 655 AddMRUData (HANDLE hList, LPCVOID lpData, DWORD cbData) 524 656 { 525 FIXME("(%08x, %p, %ld) empty stub!\n", hList, lpData, cbData); 526 527 return 0; 657 LPWINEMRULIST mp = (LPWINEMRULIST)hList; 658 LPWINEMRUITEM witem; 659 INT i, replace, ret; 660 661 if ((replace = FindMRUData (hList, lpData, cbData, NULL)) < 0) { 662 /* either add a new entry or replace oldest */ 663 if (mp->cursize < mp->extview.nMaxItems) { 664 /* Add in a new item */ 665 replace = mp->cursize; 666 mp->cursize++; 667 } 668 else { 669 /* get the oldest entry and replace data */ 670 replace = mp->realMRU[mp->cursize - 1] - 'a'; 671 COMCTL32_Free(mp->array[replace]); 672 } 673 } 674 else { 675 /* free up the old data */ 676 COMCTL32_Free(mp->array[replace]); 677 } 678 679 /* Allocate space for new item and move in the data */ 680 mp->array[replace] = witem = (LPWINEMRUITEM)COMCTL32_Alloc(cbData + 681 sizeof(WINEMRUITEM)); 682 witem->itemFlag |= WMRUIF_CHANGED; 683 witem->size = cbData; 684 memcpy( &witem->datastart, lpData, cbData); 685 686 /* now rotate MRU list */ 687 mp->wineFlags |= WMRUF_CHANGED; 688 for(i=mp->cursize-1; i>=1; i--) { 689 mp->realMRU[i] = mp->realMRU[i-1]; 690 } 691 mp->realMRU[0] = replace + 'a'; 692 TRACE("(%08x, %p, %ld) adding data, /%c/ now most current\n", 693 hList, lpData, cbData, replace+'a'); 694 ret = replace; 695 696 if (!(mp->extview.dwFlags & MRUF_DELAYED_SAVE)) { 697 /* save changed stuff right now */ 698 MRU_SaveChanged( mp ); 699 } 700 701 return ret; 528 702 } 529 703 … … 571 745 572 746 /************************************************************************** 573 * FindMRUData [COMCTL32.169]574 *575 * Searches binary list for item that matches lpData of length cbData.576 * Returns position in list order 0 -> MRU and if lpRegNum != NULL then value577 * corresponding to item's reg. name will be stored in it ('a' -> 0).578 *579 * PARAMS580 * hList [I] list handle581 * lpData [I] data to find582 * cbData [I] length of data583 * lpRegNum [O] position in registry (maybe NULL)584 *585 * RETURNS586 * Position in list 0 -> MRU. -1 if item not found.587 */588 INT WINAPI589 FindMRUData (HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum)590 {591 FIXME("(%08x, %p, %ld, %p) empty stub!\n",592 hList, lpData, cbData, lpRegNum);593 594 return 0;595 }596 597 /**************************************************************************598 747 * FindMRUStringA [COMCTL32.155] 599 748 * … … 613 762 FindMRUStringA (HANDLE hList, LPCSTR lpszString, LPINT lpRegNum) 614 763 { 615 FIXME("(%08x, %s, %p) empty stub!\n", hList, debugstr_a(lpszString), 616 lpRegNum); 617 618 return 0; 764 return FindMRUData(hList, (LPVOID)lpszString, lstrlenA(lpszString), 765 lpRegNum); 619 766 } 620 767 … … 625 772 CreateMRUListLazyA (LPCREATEMRULIST lpcml, DWORD dwParam2, DWORD dwParam3, DWORD dwParam4) 626 773 { 627 /* DWORD dwLocal1; * 628 * HKEY hkeyResult; * 629 * DWORD dwLocal3; * 630 * LPVOID lMRU; * 631 * DWORD dwLocal5; * 632 * DWORD dwLocal6; * 633 * DWORD dwLocal7; * 634 * DWORD dwDisposition; */ 635 636 /* internal variables */ 637 LPVOID ptr; 638 639 FIXME("(%p) empty stub!\n", lpcml); 774 LPWINEMRULIST mp; 775 INT i, err; 776 HKEY newkey; 777 DWORD datasize, dwdisp; 778 CHAR realname[2]; 779 LPWINEMRUITEM witem; 780 DWORD type; 640 781 641 782 if (lpcml == NULL) … … 645 786 return 0; 646 787 647 FIXME("(%lu %lu %lx %lx \"%s\" %p)\n", 788 mp = (LPWINEMRULIST) COMCTL32_Alloc(sizeof(WINEMRULIST)); 789 memcpy(mp, lpcml, sizeof(CREATEMRULIST)); 790 791 /* get space to save indexes that will turn into names 792 * but in order of most to least recently used 793 */ 794 mp->realMRU = (LPSTR) COMCTL32_Alloc(mp->extview.nMaxItems + 2); 795 796 /* get space to save pointers to actual data in order of 797 * 'a' to 'z' (0 to n). 798 */ 799 mp->array = (LPVOID) COMCTL32_Alloc(mp->extview.nMaxItems * 800 sizeof(LPVOID)); 801 802 /* open the sub key */ 803 if ((err = RegCreateKeyExA( mp->extview.hKey, mp->extview.lpszSubKey, 804 0, 805 "", 806 REG_OPTION_NON_VOLATILE, 807 KEY_READ | KEY_WRITE, 808 0, 809 &newkey, 810 &dwdisp))) { 811 /* error - what to do ??? */ 812 ERR("(%lu %lu %lx %lx \"%s\" %p): Can not open key, error=%d\n", 813 lpcml->cbSize, lpcml->nMaxItems, lpcml->dwFlags, 814 (DWORD)lpcml->hKey, lpcml->lpszSubKey, lpcml->lpfnCompare, 815 err); 816 return 0; 817 } 818 819 /* get values from key 'MRUList' */ 820 if (newkey) { 821 datasize = mp->extview.nMaxItems + 1; 822 if((err=RegQueryValueExA( newkey, "MRUList", 0, &type, mp->realMRU, 823 &datasize))) { 824 /* not present - set size to 1 (will become 0 later) */ 825 datasize = 1; 826 *mp->realMRU = 0; 827 } 828 829 TRACE("MRU list = %s\n", mp->realMRU); 830 831 mp->cursize = datasize - 1; 832 /* datasize now has number of items in the MRUList */ 833 834 /* get actual values for each entry */ 835 realname[1] = 0; 836 for(i=0; i<mp->cursize; i++) { 837 realname[0] = 'a' + i; 838 if(RegQueryValueExA( newkey, realname, 0, &type, 0, &datasize)) { 839 /* not present - what to do ??? */ 840 ERR("Key %s not found 1\n", realname); 841 } 842 mp->array[i] = witem = (LPWINEMRUITEM)COMCTL32_Alloc(datasize + 843 sizeof(WINEMRUITEM)); 844 witem->size = datasize; 845 if(RegQueryValueExA( newkey, realname, 0, &type, 846 &witem->datastart, &datasize)) { 847 /* not present - what to do ??? */ 848 ERR("Key %s not found 2\n", realname); 849 } 850 } 851 RegCloseKey( newkey ); 852 } 853 else 854 mp->cursize = 0; 855 856 TRACE("(%lu %lu %lx %lx \"%s\" %p): Current Size = %ld\n", 648 857 lpcml->cbSize, lpcml->nMaxItems, lpcml->dwFlags, 649 (DWORD)lpcml->hKey, lpcml->lpszSubKey, lpcml->lpfnCompare); 650 651 /* dummy pointer creation */ 652 ptr = COMCTL32_Alloc (32); 653 654 FIXME("-- ret = %p\n", ptr); 655 656 return (HANDLE)ptr; 858 (DWORD)lpcml->hKey, lpcml->lpszSubKey, lpcml->lpfnCompare, 859 mp->cursize); 860 861 return (HANDLE)mp; 657 862 } 658 863 … … 678 883 DWORD nBufferSize) 679 884 { 680 FIXME("(%08x, %d, %p, %ld): stub\n", hList, nItemPos, lpBuffer, 681 nBufferSize); 682 return 0; 885 LPWINEMRULIST mp = (LPWINEMRULIST) hList; 886 LPWINEMRUITEM witem; 887 INT desired, datasize; 888 889 if (nItemPos >= mp->cursize) return -1; 890 if ((nItemPos < 0) || !lpBuffer) return mp->cursize; 891 desired = mp->realMRU[nItemPos]; 892 desired -= 'a'; 893 TRACE("nItemPos=%d, desired=%d\n", nItemPos, desired); 894 witem = mp->array[desired]; 895 datasize = min( witem->size, nBufferSize ); 896 memcpy( lpBuffer, &witem->datastart, datasize); 897 TRACE("(%08x, %d, %p, %ld): returning len=%d\n", 898 hList, nItemPos, lpBuffer, nBufferSize, datasize); 899 return datasize; 683 900 } 684 901
Note:
See TracChangeset
for help on using the changeset viewer.