summaryrefslogblamecommitdiffstats
path: root/private/unimodem/modemui/util.c
blob: 853b96b153ad19d64c506b1cfa65dec0d61b41e9 (plain) (tree)






























































































































































































































































































































                                                                                           
//---------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation 1993-1994
//
// File: util.c
//
//  This files contains all common utility routines
//
// History:
//  12-23-93 ScottH     Created
//  09-22-95 ScottH     Ported to NT
//
//---------------------------------------------------------------------------

#include "proj.h"     // common headers


//-----------------------------------------------------------------------------------
//  
//-----------------------------------------------------------------------------------


/*----------------------------------------------------------
Purpose: Enumerates the HKEY_LOCAL_MACHINE branch and finds the
         device matching the given class and value.  If there
         are duplicate devices that match both criteria, only the
         first device is returned. 

         Returns TRUE if the device was found.

Returns: see above
Cond:    --
*/
BOOL 
PRIVATE 
FindDev_Find(
    IN  LPFINDDEV   pfinddev,
    IN  LPGUID      pguidClass,
    IN  LPCTSTR     pszValueName,
    IN  LPCTSTR     pszValue)
    {
    BOOL bRet = FALSE;
    TCHAR szKey[MAX_BUF];
    TCHAR szName[MAX_BUF];
    HDEVINFO hdi;
	DWORD dwRW = KEY_READ;

    ASSERT(pfinddev);
    ASSERT(pguidClass);
    ASSERT(pszValueName);
    ASSERT(pszValue);

	if (USER_IS_ADMIN()) dwRW |= KEY_WRITE;

    hdi = CplDiGetClassDevs(pguidClass, NULL, NULL, 0);
    if (INVALID_HANDLE_VALUE != hdi)
        {
        SP_DEVINFO_DATA devData;
        DWORD iIndex = 0;
        HKEY hkey;

        // Look for the modem that has the matching value
        devData.cbSize = sizeof(devData);
        while (CplDiEnumDeviceInfo(hdi, iIndex, &devData))
            {
            hkey = CplDiOpenDevRegKey(hdi, &devData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, dwRW);
            if (INVALID_HANDLE_VALUE != hkey)
                {
                // Does the value match?
                DWORD cbData = sizeof(szName);
                if (NO_ERROR == RegQueryValueEx(hkey, pszValueName, NULL, NULL, 
                                                (LPBYTE)szName, &cbData) &&
                    IsSzEqual(pszValue, szName))
                    {
                    // Yes
                    pfinddev->hkeyDrv = hkey;
                    pfinddev->hdi = hdi;
                    BltByte(&pfinddev->devData, &devData, sizeof(devData));

                    // Don't close the driver key or free the DeviceInfoSet, 
                    // but exit
                    bRet = TRUE;
                    break;
                    }
                RegCloseKey(hkey);
                }

            iIndex++;
            }

        // Free the DeviceInfoSet if nothing was found.  Otherwise, we will
        // retain these handles so the caller can make use of this.
        if ( !bRet )
            {
            CplDiDestroyDeviceInfoList(hdi);
            }
        }

    return bRet;
    }


/*----------------------------------------------------------
Purpose: Creates a FINDDEV structure given the device class,
         and a valuename and its value.

Returns: TRUE if the device is found in the system

Cond:    --
*/
BOOL 
PUBLIC 
FindDev_Create(
    OUT LPFINDDEV FAR * ppfinddev,
    IN  LPGUID      pguidClass,
    IN  LPCTSTR     pszValueName,
    IN  LPCTSTR     pszValue)
    {
    BOOL bRet;
    LPFINDDEV pfinddev;

    DEBUG_CODE( TRACE_MSG(TF_FUNC, " > FindDev_Create(....%s, %s, ...)",
                Dbg_SafeStr(pszValueName), Dbg_SafeStr(pszValue)); )

    ASSERT(ppfinddev);
    ASSERT(pguidClass);
    ASSERT(pszValueName);
    ASSERT(pszValue);

    pfinddev = (LPFINDDEV)LocalAlloc(LPTR, sizeof(*pfinddev));
    if (NULL == pfinddev)
        {
        bRet = FALSE;
        }
    else
        {
        bRet = FindDev_Find(pfinddev, pguidClass, pszValueName, pszValue);

        if (FALSE == bRet)
            {
            // Didn't find anything 
            FindDev_Destroy(pfinddev);
            pfinddev = NULL;
            }
        }

    *ppfinddev = pfinddev;

    DBG_EXIT_BOOL(FindDev_Create, bRet);

    return bRet;
    }


/*----------------------------------------------------------
Purpose: Destroys a FINDDEV structure

Returns: TRUE on success
Cond:    --
*/
BOOL 
PUBLIC 
FindDev_Destroy(
    IN LPFINDDEV this)
    {
    BOOL bRet;

    if (NULL == this)
        {
        bRet = FALSE;
        }
    else
        {
        if (this->hkeyDrv)
            RegCloseKey(this->hkeyDrv);

        if (this->hdi && INVALID_HANDLE_VALUE != this->hdi)
            CplDiDestroyDeviceInfoList(this->hdi);

        LocalFreePtr(this);

        bRet = TRUE;
        }

    return bRet;
    }


/*----------------------------------------------------------
Purpose: Return the appropriate text and background COLORREFs
         given the DRAWITEMSTRUCT.

Returns: --
Cond:    --
*/
void PUBLIC TextAndBkCr(
    const DRAWITEMSTRUCT FAR * lpcdis,
    COLORREF FAR * pcrText,
    COLORREF FAR * pcrBk)
    {
    #define CR_DARK_GRAY    RGB(128, 128, 128)

    UINT nState;

    ASSERT(lpcdis);
    ASSERT(pcrText);
    ASSERT(pcrBk);

    nState = lpcdis->itemState;

    switch (lpcdis->CtlType)
        {
    case ODT_STATIC:
        if (IsFlagSet(nState, ODS_DISABLED))
            {
            *pcrText = GetSysColor(COLOR_GRAYTEXT);
            *pcrBk = GetSysColor(COLOR_3DFACE);
            }
        else
            {
            *pcrText = GetSysColor(COLOR_WINDOWTEXT);
            *pcrBk = GetSysColor(COLOR_3DFACE);
            }
        break;

    case ODT_LISTBOX:
    case ODT_COMBOBOX:
        if (IsFlagSet(nState, ODS_SELECTED))
            {
            *pcrText = GetSysColor(COLOR_HIGHLIGHTTEXT);
            *pcrBk = GetSysColor(COLOR_HIGHLIGHT);
            }
        else if (IsFlagSet(nState, ODS_DISABLED))
            {
            *pcrText = GetSysColor(COLOR_GRAYTEXT);
            *pcrBk = GetSysColor(COLOR_3DFACE);
            }
        else
            {
            *pcrText = GetSysColor(COLOR_WINDOWTEXT);
            *pcrBk = GetSysColor(COLOR_WINDOW);
            }
        break;

    case ODT_MENU:
        if (IsFlagSet(nState, ODS_SELECTED))
            {
            *pcrText = GetSysColor(COLOR_HIGHLIGHTTEXT);
            *pcrBk = GetSysColor(COLOR_HIGHLIGHT);
            }
        else
            {
            *pcrText = GetSysColor(COLOR_MENUTEXT);
            *pcrBk = GetSysColor(COLOR_MENU);
            }
        break;

    default:
        ASSERT(0);
        break;
        }
    }



//-----------------------------------------------------------------------------------
//  Debug functions
//-----------------------------------------------------------------------------------


#ifdef DEBUG

#pragma data_seg(DATASEG_READONLY)

#ifdef WIN95
struct _RETERRMAP
    {
    RETERR ret;
    LPCTSTR psz;
    } const c_rgreterrmap[] = {
        { NO_ERROR,                                    "NO_ERROR" },
        { DI_ERROR,                              "DI_ERROR" },
        { ERR_DI_INVALID_DEVICE_ID,              "ERR_DI_INVALID_DEVICE_ID" },
        { ERR_DI_INVALID_COMPATIBLE_DEVICE_LIST, "ERR_DI_INVALID_COMPATIBLE_DEVICE_LIST" },
        { ERR_DI_REG_API,                        "ERR_DI_REG_API" },
        { ERR_DI_LOW_MEM,                        "ERR_DI_LOW_MEM" },
        { ERR_DI_BAD_DEV_INFO,                   "ERR_DI_BAD_DEV_INFO" },
        { ERR_DI_INVALID_CLASS_INSTALLER,        "ERR_DI_INVALID_CLASS_INSTALLER" },
        { ERR_DI_DO_DEFAULT,                     "ERR_DI_DO_DEFAULT" },
        { ERR_DI_USER_CANCEL,                    "ERR_DI_USER_CANCEL" },
        { ERR_DI_NOFILECOPY,                     "ERR_DI_NOFILECOPY" },
        { ERR_DI_BAD_CLASS_INFO,                 "ERR_DI_BAD_CLASS_INFO" },
    };
#endif

#pragma data_seg()

#ifdef WIN95
/*----------------------------------------------------------
Purpose: Returns the string form of a RETERR.

Returns: String ptr
Cond:    --
*/
LPCTSTR PUBLIC Dbg_GetReterr(
    RETERR ret)
    {
    int i;

    for (i = 0; i < ARRAY_ELEMENTS(c_rgreterrmap); i++)
        {
        if (ret == c_rgreterrmap[i].ret)
            return c_rgreterrmap[i].psz;
        }
    return "Unknown RETERR";
    }
#endif // WIN95

#endif  // DEBUG