VOID VerifyLangDialogs()

in tools/VerifyResources/VerifyResources.cpp [374:459]


VOID VerifyLangDialogs(PROCRES *pprocres)
{
    DLGDECODE rgdecdlg[MAXLANG];       // ilocaleMac in use

    for (int ilocale = 0; ilocale < iLocaleMac; ilocale++)
    {
        LPVOID lpv = LockResource(pprocres->rghglobSeen[ilocale]);

        DLGDECODE *pdecdlg = &rgdecdlg[ilocale];

        ZeroMemory(pdecdlg, sizeof(*pdecdlg));

        DecodeDialog(lpv, pdecdlg);
    }

    // make sure all dialogs have the same number of items, style and same class
    DLGDECODE *pdecdlgEng = &rgdecdlg[ILOCALE_ENG];
    int citems = pdecdlgEng->pdlg->cdit;
    DWORD style = pdecdlgEng->pdlg->style;
    LPCTSTR lpszClass = pdecdlgEng->lpszClass;
    if (lpszClass == NULL) lpszClass = L"EMPTY";
    WORD wClass = pdecdlgEng->wClass;
    for (int ilocale = 1; ilocale < iLocaleMac; ilocale++)
    {
        LPCTSTR classCmp = L"EMPTY";
        wchar_t szLocale[25];
        DLGDECODE *pdecdlgT = &rgdecdlg[ilocale];

        LCIDToLocaleName(rglcidInUse[ilocale], szLocale, COUNTOF(szLocale), 0);

        if (pdecdlgT->pdlg->cdit != citems)
        {
            printf("Error: dialog %ls for language %ls does not have the required number of items %d\n", pdecdlgEng->lpszTitle, szLocale, citems);
            return;
        }

        if (pdecdlgT->lpszClass != NULL)
            classCmp = pdecdlgT->lpszClass;

        if (pdecdlgT->wClass != wClass || wcscmp(classCmp, lpszClass) != 0)
        {
            printf("Error: dialog %ls for language %ls does not have the required class %d\n", pdecdlgEng->lpszTitle, szLocale, wClass);
            return;
        }

        // warn on style diff
        if (pdecdlgT->pdlg->style != style)
        {
            printf("Warning: dialog %ls for language %ls does have the required style 0x%x\n", pdecdlgEng->lpszTitle, szLocale, style);
        }
    }

    // make sure all languages have the same items
    for (int i = 0; i < citems; i++)
    {
        int id = pdecdlgEng->rgitems[i].pitem->id;
        DWORD style = pdecdlgEng->rgitems[i].pitem->style;
        WORD wClass = pdecdlgEng->rgitems[i].wClass;

        for (int j = 1; j < iLocaleMac; j++)
        {
            wchar_t szLocale[25];
            DLGITEMDECODE *pdecitem = &rgdecdlg[j].rgitems[i];

            LCIDToLocaleName(rglcidInUse[j], szLocale, COUNTOF(szLocale), 0);

            if (pdecitem->pitem->id != id)
            {
                printf("Error: dialog %ls for language %ls does not have the required item %d\n", pdecdlgEng->lpszTitle, szLocale, id);
                break;
            }

            if (pdecitem->wClass != wClass)
            {
                printf("Error: dialog %ls item id %d for language %ls does have the required class %d\n", pdecdlgEng->lpszTitle, id, szLocale, wClass);
                break;
            }

            // warn on style diff
            if (pdecitem->pitem->style != style)
            {
                printf("Warning: dialog %ls item #%d, id %d for language %ls does have the required style 0x%x\n", pdecdlgEng->lpszTitle, i, id, szLocale, style);
            }
        }
    }
}