Ignore:
Timestamp:
Aug 16, 2000, 10:04:44 AM (25 years ago)
Author:
sandervl
Message:

FindResource language fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/winimgres.cpp

    r3815 r4023  
    1 /* $Id: winimgres.cpp,v 1.43 2000-07-10 18:38:52 sandervl Exp $ */
     1/* $Id: winimgres.cpp,v 1.44 2000-08-16 08:04:44 sandervl Exp $ */
    22
    33/*
     
    66 * Copyright 1998-2000 Sander van Leeuwen (sandervl@xs4all.nl)
    77 *
     8 *
     9 * Language order based on Wine Code (loader\pe_resource.c)
     10 * Copyright 1995 Thomas Sandford
     11 * Copyright 1996 Martin von Loewis
     12 *
    813 *
    914 * Project Odin Software License can be found in LICENSE.TXT
     
    146151    }
    147152
    148     switch(lang) {
    149     case LANG_SYSTEM_DEFAULT:
    150         lang = GetSystemDefaultLangID();
    151         break;
    152     case LANG_USER_DEFAULT:
    153         lang = GetUserDefaultLangID();
    154         break;   
    155     case LANG_NEUTRAL:
    156         //TODO: Not correct; should take language associated with current thread
    157         lang = LANG_NEUTRAL;
    158         break;
    159     case LANG_GETFIRST:
    160         lang = GetUserDefaultLangID();
    161         break;   
    162     }
    163 
    164     hRes = (HRSRC)getResDataLang(pResDirRet, lang);
    165     if(!hRes) {
    166         //try primary language with default sublang
    167         lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_DEFAULT);
    168         hRes = (HRSRC)getResDataLang(pResDirRet, lang);
    169         if(!hRes) {
    170                 //try neutral language or get first entry if nothing found
    171                 hRes = (HRSRC)getResDataLang(pResDirRet, LANG_NEUTRAL, TRUE);
    172         }
    173     }
     153    /* Here is the real difference between FindResource and FindResourceEx */
     154    if(lang == MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) ||
     155       lang == MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) ||
     156       lang == MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT) ||
     157       lang == MAKELANGID(LANG_NEUTRAL, 3)) /* FIXME: real name? */
     158    {
     159         hRes = getResourceLang(pResDirRet);
     160    }
     161    else hRes = getResourceLangEx(pResDirRet, lang);
    174162
    175163    if((ULONG)lpszName != ID_GETFIRST && HIWORD(lpszName)) {
     
    216204    }
    217205
    218     switch(lang) {
    219     case LANG_SYSTEM_DEFAULT:
    220         lang = GetSystemDefaultLangID();
    221         break;
    222     case LANG_USER_DEFAULT:
    223         lang = GetUserDefaultLangID();
    224         break;   
    225     case LANG_NEUTRAL:
    226         //TODO: Not correct; should take language associated with current thread
    227         lang = LANG_NEUTRAL;
    228         break;
    229     case LANG_GETFIRST:
    230         lang = GetUserDefaultLangID();
    231         break;   
    232     }
    233 
    234     hRes = (HRSRC)getResDataLang(pResDirRet, lang);
     206    /* Here is the real difference between FindResource and FindResourceEx */
     207    if(lang == MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) ||
     208       lang == MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) ||
     209       lang == MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT) ||
     210       lang == MAKELANGID(LANG_NEUTRAL, 3)) /* FIXME: real name? */
     211    {
     212         hRes = getResourceLang(pResDirRet);
     213    }
     214    else hRes = getResourceLangEx(pResDirRet, lang);
     215
     216    return hRes;
     217}
     218//******************************************************************************
     219//According to Wine:
     220/* FindResourceA/W does search in the following order:
     221 * 1. Neutral language with neutral sublanguage
     222 * 2. Neutral language with default sublanguage
     223 * 3. Current locale lang id
     224 * 4. Current locale lang id with neutral sublanguage
     225 * 5. (!) LANG_ENGLISH, SUBLANG_DEFAULT
     226 * 6. Return first in the list
     227 */
     228//******************************************************************************
     229HRSRC Win32ImageBase::getResourceLang(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch)
     230{
     231 HRSRC  hRes;
     232 DWORD lang;
     233
     234    /* 1. Neutral language with neutral sublanguage */
     235    lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
     236    hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    235237    if(!hRes) {
    236         //try primary language with default sublang
    237         lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_DEFAULT);
    238         hRes = (HRSRC)getResDataLang(pResDirRet, lang);
    239         if(!hRes) {
    240                 //try neutral language or get first entry if nothing found
    241                 hRes = (HRSRC)getResDataLang(pResDirRet, LANG_NEUTRAL, TRUE);
    242         }
    243     }
    244 
     238        /* 2. Neutral language with default sublanguage */
     239        lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
     240        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     241    }
     242    if(!hRes) {
     243        /* 3. Current locale lang id */
     244        lang = LANGIDFROMLCID(GetUserDefaultLCID());
     245        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     246    }
     247    if(!hRes) {
     248        /* 4. Current locale lang id with neutral sublanguage */
     249        lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
     250        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     251    }
     252    if(!hRes) {
     253        /* 5. (!) LANG_ENGLISH, SUBLANG_DEFAULT */
     254        lang = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
     255        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     256    }
     257    if(!hRes) {
     258        /* 6. Return first in the list */
     259        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang, TRUE);
     260    }
     261    return hRes;
     262}
     263//******************************************************************************
     264//According to Wine:
     265/* FindResourceExA/W does search in the following order:
     266 * 1. Exact specified language
     267 * 2. Language with neutral sublanguage
     268 * 3. Neutral language with neutral sublanguage
     269 * 4. Neutral language with default sublanguage
     270 */
     271//******************************************************************************
     272HRSRC Win32ImageBase::getResourceLangEx(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch,
     273                                        DWORD lang)
     274{
     275 HRSRC  hRes;
     276
     277    /* 1. Exact specified language */
     278    hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     279    if(!hRes) {
     280        /* 2. Language with neutral sublanguage */
     281        lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
     282        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     283    }
     284    if(!hRes) {
     285        /* 3. Neutral language with neutral sublanguage */
     286        lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
     287        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     288    }
     289    if(!hRes) {
     290        /* 4. Current locale lang id with neutral sublanguage */
     291        lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
     292        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
     293    }
    245294    return hRes;
    246295}
     
    261310        return FALSE;
    262311    }
    263     hRes = findResourceW((LPWSTR)ID_GETFIRST, (LPWSTR)NTRT_VERSION, LANG_GETFIRST);
     312    hRes = findResourceW((LPWSTR)ID_GETFIRST, (LPWSTR)NTRT_VERSION, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
    264313    if(hRes == NULL) {
    265314        //last error already set by findResourceW
Note: See TracChangeset for help on using the changeset viewer.