Changeset 6810 for trunk/src/comctl32


Ignore:
Timestamp:
Sep 25, 2001, 12:54:55 PM (24 years ago)
Author:
sandervl
Message:

wine update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/comctl32undoc.c

    r6709 r6810  
    1919#define WINE_LARGE_INTEGER
    2020#endif
     21
    2122#include <string.h>
    2223#include <stdlib.h> /* atoi */
     
    2728#include "winbase.h"
    2829#include "winerror.h"
     30#include "winreg.h"
    2931
    3032#include "wine/unicode.h"
     
    3436
    3537DEFAULT_DEBUG_CHANNEL(commctrl);
    36 
    3738
    3839#ifdef __WIN32OS2__
     
    423424 */
    424425
     426#ifdef __WIN32OS2__
     427#include <wine\undoccomctl32.h>
     428#else
    425429typedef struct tagCREATEMRULIST
    426430{
     
    446450 */
    447451
    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;
     452typedef 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
     462typedef 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              */
    457474
    458475HANDLE WINAPI
    459476CreateMRUListLazyA (LPCREATEMRULIST lpcml, DWORD dwParam2,
    460477                    DWORD dwParam3, DWORD dwParam4);
    461 
     478#endif
     479
     480/**************************************************************************
     481 *              MRU_SaveChanged - Localize MRU saving code
     482 *
     483 */
     484VOID 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}
    462541
    463542/**************************************************************************
     
    486565FreeMRUListA (HANDLE hMRUList)
    487566{
    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 */
     602INT WINAPI
     603FindMRUData (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;
    503635}
    504636
     
    523655AddMRUData (HANDLE hList, LPCVOID lpData, DWORD cbData)
    524656{
    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;
    528702}
    529703
     
    571745
    572746/**************************************************************************
    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 value
    577  * corresponding to item's reg. name will be stored in it ('a' -> 0).
    578  *
    579  * PARAMS
    580  *    hList [I] list handle
    581  *    lpData [I] data to find
    582  *    cbData [I] length of data
    583  *    lpRegNum [O] position in registry (maybe NULL)
    584  *
    585  * RETURNS
    586  *    Position in list 0 -> MRU.  -1 if item not found.
    587  */
    588 INT WINAPI
    589 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 /**************************************************************************
    598747 *                  FindMRUStringA [COMCTL32.155]
    599748 *
     
    613762FindMRUStringA (HANDLE hList, LPCSTR lpszString, LPINT lpRegNum)
    614763{
    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);
    619766}
    620767
     
    625772CreateMRUListLazyA (LPCREATEMRULIST lpcml, DWORD dwParam2, DWORD dwParam3, DWORD dwParam4)
    626773{
    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;
    640781
    641782    if (lpcml == NULL)
     
    645786        return 0;
    646787
    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",
    648857          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;
    657862}
    658863
     
    678883DWORD nBufferSize)
    679884{
    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;
    683900}
    684901
Note: See TracChangeset for help on using the changeset viewer.