#include #include #include #include #include #include "windefs.h" #include "restok.h" #include "projdata.h" #include "showerrs.h" #include "rlmsgtbl.h" #include "commbase.h" #include "custres.h" #include "rlstrngs.h" #include "resource.h" #include "resourc2.h" #include "resread.h" #include "langlist.h" #include "exentres.h" extern MSTRDATA gMstr; extern PROJDATA gProj; extern UCHAR szDHW[]; extern BOOL fCodePageGiven; extern BOOL gfReplace; extern HWND hMainWnd; BOOL bRLGui; //FALSE=RLMan TRUE=RLAdmin RLEdit RLquiked #ifdef RLRES32 extern PLANGLIST pLangIDList; #endif static PLANGDATA pLangList = NULL; //............................................................ //...RLtools are localized so we would like //...to get correct locale's Version stamp BOOL MyVerQueryValue( LPVOID pBlock, LPTSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen) { LPWORD lpXlate; // ptr to translations data DWORD cbValueTranslation=0; TCHAR szVersionKey[60]; // big enough for anything we need if( VerQueryValue( pBlock, TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&lpXlate, &cbValueTranslation) ) { wsprintf( szVersionKey, TEXT("\\StringFileInfo\\%04X04B0\\%s"), *lpXlate, lpSubBlock ); if( VerQueryValue ( pBlock, szVersionKey, lplpBuffer, puLen) ) return TRUE; } wsprintf( szVersionKey, TEXT("\\StringFileInfo\\%04X04B0\\%s"), LANGIDFROMLCID(GetThreadLocale()), lpSubBlock ); if( !VerQueryValue (pBlock, szVersionKey, lplpBuffer, puLen) ) { wsprintf( szVersionKey, TEXT("\\StringFileInfo\\040904B0\\%s"), lpSubBlock ); if( !VerQueryValue (pBlock, szVersionKey, lplpBuffer, puLen) ) return FALSE; } return TRUE; } int GetMasterProjectData( CHAR * pszMasterFile, //... Master Project file name CHAR * pszSrc, //... Resource source file name or NULL CHAR * pszMtk, //... Master token file name or NULL BOOL fLanguageGiven) { int nRC = SUCCESS; //... Return code //... check for the special case where Master //... Project File does not exist. If it doesn't //... go ahead and create it. memset(&gMstr, '\0', sizeof(gMstr)); if ( _access( pszMasterFile, 0) != 0 ) { if ( ! (pszSrc && pszMtk) ) { ShowErr( IDS_ERR_03, pszMasterFile, NULL); nRC = IDS_ERR_03; } else { //... Get source resource file name if ( _fullpath( gMstr.szSrc, pszSrc, sizeof( gMstr.szSrc)-1) ) { //... Get Master token file name and its //... modification date. Use that same date as //... the initial date the master project was //... last updated. if ( _fullpath( gMstr.szMtk, pszMtk, sizeof( gMstr.szMtk)-1) ) { SzDateFromFileName( gMstr.szSrcDate, gMstr.szSrc); lstrcpyA( gMstr.szMpjLastRealUpdate, gMstr.szSrcDate); //... Create the new Master Project file. nRC = PutMasterProjectData( pszMasterFile); } else { ShowErr( IDS_ERR_13, pszMtk, NULL); nRC = IDS_ERR_13; } } else { ShowErr( IDS_ERR_13, pszSrc, NULL); nRC = IDS_ERR_13; } } } else { FILE *pfMpj = NULL; if ( (pfMpj = fopen( pszMasterFile, "rt")) == NULL ) { ShowErr( IDS_ERR_07, pszMasterFile, NULL); nRC = IDS_ERR_07; } else { //... Get resource source file name //... and master token file name if ( fgets( gMstr.szSrc, sizeof( gMstr.szSrc), pfMpj) && fgets( gMstr.szMtk, sizeof( gMstr.szMtk), pfMpj) ) { //... Make sure these two files exist if ( pszSrc ) { if ( !_fullpath(gMstr.szSrc,pszSrc,sizeof( gMstr.szSrc)-1) ) { ShowErr( IDS_ERR_07, pszSrc, NULL); fclose( pfMpj ); return( IDS_ERR_07 ); } } if ( pszMtk ) { if ( !_fullpath(gMstr.szMtk,pszMtk,sizeof( gMstr.szMtk)-1) ) { ShowErr( IDS_ERR_07, pszMtk, NULL); fclose( pfMpj ); return( IDS_ERR_07 ); } } //... If -c flag not given, get RDF file name //... from master project file, else use name //... from the -c cmd line arg. if ( gMstr.szRdfs[0] == '\0' ) { if ( ! fgets( gMstr.szRdfs, sizeof( gMstr.szRdfs), pfMpj) ) { ShowErr( IDS_ERR_21, "Master Project", pszMasterFile); nRC = IDS_ERR_21; } } else { if ( ! fgets( szDHW, DHWSIZE, pfMpj) ) { ShowErr( IDS_ERR_21, "Master Project", pszMasterFile); nRC = IDS_ERR_21; } } //... Get stored date of source file and //... date of last master token file update if ( nRC == 0 && fgets( gMstr.szSrcDate, sizeof( gMstr.szSrcDate), pfMpj) && fgets( gMstr.szMpjLastRealUpdate, sizeof( gMstr.szMpjLastRealUpdate), pfMpj) ) { WORD wPriID = 0; WORD wSubID = 0; UINT uTmpCP = 0; //... Strip any trailing new-lines from data StripNewLineA( gMstr.szSrc); StripNewLineA( gMstr.szMpjLastRealUpdate); StripNewLineA( gMstr.szMtk); StripNewLineA( gMstr.szRdfs); StripNewLineA( gMstr.szSrcDate); //... Try to get the.MPJ file's Language line. //... If we find it and the -i arg was not //... given, use the one found in the file. if ( fgets( szDHW, DHWSIZE, pfMpj) != NULL //... CP line && sscanf( szDHW, "Language %hx %hx", &wPriID, &wSubID) == 2 ) { WORD wTmpID = 0; wTmpID = MAKELANGID( wPriID, wSubID); if ( ! fLanguageGiven ) { gMstr.wLanguageID = wTmpID; } } //... Try to get the.MPJ file's Code Page line. //... If we find it and the -p arg was not //... given, use the one found in the file. if ( fgets( szDHW, DHWSIZE, pfMpj) != NULL //... CP line && sscanf( szDHW, "CodePage %u", &uTmpCP) == 1 ) { if ( uTmpCP != gProj.uCodePage && ! fCodePageGiven ) { gMstr.uCodePage = uTmpCP; } } nRC = SUCCESS; } else { ShowErr( IDS_ERR_21, "Master Project", pszMasterFile); nRC = IDS_ERR_21; } } else { ShowErr( IDS_ERR_22, pszMasterFile, NULL); nRC = IDS_ERR_22; } fclose( pfMpj); } } return( nRC); } //............................................................ int PutMasterProjectData( CHAR *pszMasterFile) //... Master Project File name { int nRC = SUCCESS; FILE *pfMpj = NULL; if ( (pfMpj = fopen( pszMasterFile, "wt")) == NULL ) { ShowErr( IDS_ERR_06, pszMasterFile, NULL); nRC = -1; } else { fprintf( pfMpj, "%s\n%s\n%s\n%s\n%s\nLanguage %#04hx %#04hx\nCodePage %u", gMstr.szSrc, gMstr.szMtk, gMstr.szRdfs, gMstr.szSrcDate, gMstr.szMpjLastRealUpdate, PRIMARYLANGID( gMstr.wLanguageID), SUBLANGID( gMstr.wLanguageID), gMstr.uCodePage); fclose( pfMpj); } return( nRC); } //............................................................ int GetProjectData( CHAR *pszPrj, //... Project file name CHAR *pszMpj, //... Master Project file name or NULL CHAR *pszTok, //... Project token file name or NULL BOOL fCodePageGiven, BOOL fLanguageGiven) { int nRC = SUCCESS; int iUpdate = 0; if ( _access( pszPrj, 0) != 0 ) { if ( ! (pszMpj && pszTok) ) { ShowErr( IDS_ERR_19, pszPrj, NULL); Usage(); nRC = IDS_ERR_19; } else if ( ! fLanguageGiven ) { ShowErr( IDS_ERR_24, pszPrj, NULL); Usage(); nRC = IDS_ERR_24; } else { if ( _fullpath( gProj.szMpj, pszMpj, sizeof( gProj.szMpj)-1) ) { if ( _fullpath( gProj.szTok, pszTok, sizeof( gProj.szTok)-1) ) { nRC = SUCCESS; } else { ShowErr( IDS_ERR_13, pszTok, NULL); nRC = IDS_ERR_13; } } else { ShowErr( IDS_ERR_13, pszMpj, NULL); nRC = IDS_ERR_13; } } } else { FILE *fpPrj = fopen( pszPrj, "rt"); if ( fpPrj != NULL ) { if ( fgets( gProj.szMpj, sizeof( gProj.szMpj), fpPrj) && fgets( gProj.szTok, sizeof( gProj.szTok), fpPrj) && fgets( gProj.szGlo, sizeof( gProj.szGlo), fpPrj) && fgets( gProj.szTokDate, sizeof( gProj.szTokDate), fpPrj) ) { UINT uTmpCP = 0; WORD wPriID = 0; WORD wSubID = 0; //... If named, make sure MPJ and TOK files exist if ( pszMpj ) { if ( !_fullpath( gProj.szMpj, pszMpj, sizeof( gProj.szMpj)-1) ) { ShowErr( IDS_ERR_21, pszMpj, NULL); fclose( fpPrj ); return( IDS_ERR_21); } } if ( pszTok ) { if ( !_fullpath( gProj.szTok, pszTok, sizeof( gProj.szTok)-1) ) { ShowErr( IDS_ERR_21, pszTok, NULL); fclose( fpPrj ); return( IDS_ERR_21); } } StripNewLineA( gProj.szMpj); StripNewLineA( gProj.szTok); StripNewLineA( gProj.szGlo); StripNewLineA( gProj.szTokDate); //... Try to get the.PRJ file's Code Page line. //... If we find it and the -p arg was not //... given, use the one found in the file. if ( ! fgets( szDHW, DHWSIZE, fpPrj) ) //... CP line { iUpdate++; } else if ( sscanf( szDHW, "CodePage %u", &uTmpCP) == 1 ) { if ( uTmpCP != gProj.uCodePage && ! fCodePageGiven ) { gProj.uCodePage = uTmpCP; } } //... Try to get the.PRJ file's Language line. //... If we find it and the -i arg was not //... given, use the one found in the file. if ( ! fgets( szDHW, DHWSIZE, fpPrj) ) //... LANGID line { iUpdate++; } else if ( sscanf( szDHW, "Language %hx %hx", &wPriID, &wSubID) == 2 ) { WORD wTmpID = 0; wTmpID = MAKELANGID( wPriID, wSubID); if ( ! fLanguageGiven ) { gProj.wLanguageID = wTmpID; } } //... Try to get the.PRJ file's Target File line if ( fgets( szDHW, DHWSIZE, fpPrj) != NULL ) { lstrcpyA( gProj.szBld, szDHW); StripNewLineA( gProj.szBld); } //... Try to get the.PRJ file's append/replace line if ( fgets( szDHW, DHWSIZE, fpPrj) != NULL ) { gfReplace = (*szDHW == 'R') ? TRUE : FALSE; } else { gfReplace = TRUE; } nRC = SUCCESS; if ( iUpdate ) { static TCHAR title[50]; static TCHAR szMes[100]; if ( bRLGui ) { //Ask Update prj for 1.7? //RLadmin RLedit RLquiked LoadString( NULL, IDS_UPDATE_YESNO, szMes, TCHARSIN( sizeof( szMes)) ); LoadString( NULL, IDS_UPDATE_TITLE, title, TCHARSIN( sizeof( title)) ); if ( MessageBox( hMainWnd, szMes,title, MB_ICONQUESTION|MB_YESNO) == IDNO ) { //User says no, then finish the job. LoadString( NULL, IDS_UPDATE_CANCEL, szMes, TCHARSIN( sizeof( szMes)) ); MessageBox( hMainWnd, szMes, title, MB_ICONSTOP|MB_OK); //bye! nRC = IDS_UPDATE_CANCEL; } else { //replace Glossary <=> Bins lstrcpyA( szDHW, gProj.szGlo ); lstrcpyA( gProj.szGlo, gProj.szBld ); lstrcpyA( gProj.szBld, szDHW ); } } else //For RLMan { //Update Message RLMessageBoxA( "Updating 1.0 files..." ); //replace Glossary <=> Bins lstrcpyA( szDHW, gProj.szGlo ); lstrcpyA( gProj.szGlo, gProj.szBld ); lstrcpyA( gProj.szBld, szDHW ); } } } else { ShowErr( IDS_ERR_21, pszPrj, NULL); nRC = IDS_ERR_21; } fclose( fpPrj); } else { ShowErr( IDS_ERR_19, pszPrj, NULL); nRC = IDS_ERR_19; } } return( nRC); } //............................................................ int PutProjectData( CHAR *pszPrj) //... Project file name { int nRC = 0; FILE *fpPrj = NULL; fpPrj = fopen( pszPrj, "wt"); if ( fpPrj != NULL ) { fprintf( fpPrj, "%s\n%s\n%s\n%s\nCodePage %u\nLanguage %#04x %#04x\n%s\n%s", gProj.szMpj, // Master Project file gProj.szTok, // Project Token file gProj.szGlo, // Project Glossary file gProj.szTokDate, // Date token file changed gProj.uCodePage, // Code Page of token file PRIMARYLANGID( gProj.wLanguageID), // Project resource language SUBLANGID( gProj.wLanguageID), gProj.szBld, // Project target file gfReplace ? "Replace" : "Append"); // Replace master lang? fclose( fpPrj); _fullpath( gProj.szPRJ, pszPrj, sizeof( gProj.szPRJ)-1); } else { ShowErr( IDS_ERR_21, pszPrj, NULL); nRC = IDS_ERR_21; } return( nRC); } //............................................................ WORD GetCopyright( CHAR *pszProg, //... Program name (argv[0]) CHAR *pszOutBuf, //... Buffer for results WORD wBufLen) //... Length of pszOutBuf { BOOL fRC = FALSE; DWORD dwRC = 0L; DWORD dwVerSize = 0L; //... Size of file version info buffer LPSTR *plpszFile = NULL; LPSTR pszExt = NULL; WCHAR *pszVer = NULL; PVOID lpVerBuf = NULL; //... Version info buffer static CHAR szFile[ MAXFILENAME+3] = ""; //... Figure out the full-path name of prog //... so GetFileVersionInfoSize() will work. dwRC = lstrlenA( pszProg); if ( dwRC < 4 || lstrcmpiA( &pszProg[ dwRC - 4], ".exe") != 0 ) { pszExt = ".exe"; } dwRC = SearchPathA( NULL, pszProg, pszExt, sizeof( szFile), szFile, plpszFile); if ( dwRC == 0 ) { return( IDS_ERR_25); } else if ( dwRC > sizeof( szFile) ) { return( IDS_ERR_27); } // append the extension since SearchPath will not return it // if we have no extensio then a directory with the same name was returned // try to append the ext and hope that file will be there if ( lstrcmpiA( &szFile[dwRC - 4], ".exe") != 0 ) { lstrcatA( szFile, pszExt ); } //... Get # bytes in file version info if ( (dwVerSize = GetFileVersionInfoSizeA( szFile, &dwRC)) == 0L ) { return( IDS_ERR_26); } lpVerBuf = (LPVOID)FALLOC( dwVerSize); //... Retrieve version info //... and get the file description if ( (dwRC = GetFileVersionInfoA( szFile, 0L, dwVerSize, lpVerBuf)) == 0L ) { RLFREE( lpVerBuf); return( IDS_ERR_26); } if ( (fRC = MyVerQueryValue( lpVerBuf, TEXT("FileDescription"), &pszVer, &dwVerSize)) == FALSE || (dwRC = WideCharToMultiByte( CP_ACP, 0, pszVer, dwVerSize, pszOutBuf, dwVerSize, NULL, NULL)) == 0L ) { RLFREE( lpVerBuf); return( IDS_ERR_26); } strcat( pszOutBuf, " "); //... Get the file version if ( (fRC = MyVerQueryValue( lpVerBuf, TEXT("ProductVersion"), &pszVer, &dwVerSize)) == FALSE || (dwRC = WideCharToMultiByte( CP_ACP, 0, pszVer, dwVerSize, &pszOutBuf[ lstrlenA( pszOutBuf)], dwVerSize, NULL, NULL)) == 0L ) { RLFREE( lpVerBuf); return( IDS_ERR_26); } strcat( pszOutBuf, "\n"); //... Get the copyright statement if ( (fRC = MyVerQueryValue( lpVerBuf, TEXT("LegalCopyright"), &pszVer, &dwVerSize)) == FALSE || (dwRC = WideCharToMultiByte( CP_ACP, 0, pszVer, dwVerSize, &pszOutBuf[ lstrlenA( pszOutBuf)], dwVerSize, NULL, NULL)) == 0L ) { RLFREE( lpVerBuf); return( IDS_ERR_26); } RLFREE( lpVerBuf); return( SUCCESS); } //............................................................ WORD GetInternalName( CHAR *pszProg, //... Program name (argv[0]) CHAR *pszOutBuf, //... Buffer for results WORD wBufLen) //... Length of pszOutBuf { BOOL fRC = FALSE; DWORD dwRC = 0L; DWORD dwVerSize = 0L; //... Size of file version info buffer LPSTR *plpszFile = NULL; LPSTR pszExt = NULL; WCHAR *pszVer = NULL; PVOID lpVerBuf = NULL; //... Version info buffer static CHAR szFile[ MAXFILENAME+3] = ""; //... Figure out the full-path name of prog //... so GetFileVersionInfoSize() will work. dwRC = lstrlenA( pszProg); if ( dwRC < 4 || lstrcmpiA( &pszProg[ dwRC - 4], ".exe") != 0 ) { pszExt = ".exe"; } dwRC = SearchPathA( NULL, pszProg, pszExt, sizeof( szFile), szFile, plpszFile); if ( dwRC == 0 ) { return( IDS_ERR_25); } else if ( dwRC > sizeof( szFile) ) { return( IDS_ERR_27); } //... Get # bytes in file version info if ( (dwVerSize = GetFileVersionInfoSizeA( szFile, &dwVerSize)) == 0L ) { return( IDS_ERR_26); } lpVerBuf = (LPVOID)FALLOC( dwVerSize); //... Retrieve version info //... and get the file description if ( (dwRC = GetFileVersionInfoA( szFile, 0L, dwVerSize, lpVerBuf)) == 0L ) { RLFREE( lpVerBuf); return( IDS_ERR_26); } if ( (fRC = MyVerQueryValue( lpVerBuf, TEXT("InternalName"), &pszVer, &dwVerSize)) == FALSE || (dwRC = WideCharToMultiByte( CP_ACP, 0, pszVer, dwVerSize, pszOutBuf, dwVerSize, NULL, NULL)) == 0L ) { RLFREE( lpVerBuf); return( IDS_ERR_26); } RLFREE( lpVerBuf); return( SUCCESS); } //............................................................ int MyAtoi( CHAR *pStr) { if ( lstrlenA( pStr) > 2 && pStr[0] == '0' && tolower( pStr[1]) == 'x' ) { return( atoihex( &pStr[2])); //... in custres.c } else { return( atoi( pStr)); } } //DWORD GetLanguageID( HWND hDlg, PMSTRDATA pMaster, PPROJDATA pProject) //{ // DWORD dwRC = SUCCESS; //... Assume success // WORD wPriLangID = 0; // WORD wSubLangID = 0; // // // if ( pMaster ) // { // GetDlgItemTextA( hDlg, IDD_PRI_LANG_ID, szDHW, DHWSIZE); // wPriLangID = MyAtoi( szDHW); // // GetDlgItemTextA( hDlg, IDD_SUB_LANG_ID, szDHW, DHWSIZE); // wSubLangID = MyAtoi( szDHW); // // pMaster->wLanguageID = MAKELANGID( wPriLangID, wSubLangID); // } // // if ( pProject ) // { // GetDlgItemTextA( hDlg, IDD_PROJ_PRI_LANG_ID, szDHW, DHWSIZE); // wPriLangID = MyAtoi( szDHW); // // GetDlgItemTextA( hDlg, IDD_PROJ_SUB_LANG_ID, szDHW, DHWSIZE); // wSubLangID = MyAtoi( szDHW); // // pProject->wLanguageID = MAKELANGID( wPriLangID, wSubLangID); // } // return( dwRC); //} //................................................................. //... Set the language component names into the dlg box fields // //DWORD SetLanguageID( HWND hDlg, PMSTRDATA pMaster, PPROJDATA pProject) //{ // DWORD dwRC = SUCCESS; //... Assume success // WORD wPriLangID = 0; // WORD wSubLangID = 0; // LPTSTR pszLangName = NULL; // // //... Did we already load the data from // //... the resources? If not, do so now. // if ( ! pLangList ) // { // pLangList = GetLangList(); // } // // if ( pMaster ) // { // wPriLangID = PRIMARYLANGID( pMaster->wLanguageID); // wSubLangID = SUBLANGID( pMaster->wLanguageID); // // if ( (pszLangName = GetLangName( wPriLangID, wSubLangID)) ) // { // SetDlgItemText( hDlg, IDD_MSTR_LANG_NAME, pszLangName); // } // sprintf( szDHW, "%#04x", wPriLangID); // SetDlgItemTextA( hDlg, IDD_PRI_LANG_ID, szDHW); // // sprintf( szDHW, "%#04x", wSubLangID); // SetDlgItemTextA( hDlg, IDD_SUB_LANG_ID, szDHW); // } // // if ( pProject ) // { // wPriLangID = PRIMARYLANGID( pProject->wLanguageID); // wSubLangID = SUBLANGID( pProject->wLanguageID); // // if ( (pszLangName = GetLangName( wPriLangID, wSubLangID)) ) // { // SetDlgItemText( hDlg, IDD_PROJ_LANG_NAME, pszLangName); // } // sprintf( szDHW, "%#04x", wPriLangID); // SetDlgItemTextA( hDlg, IDD_PROJ_PRI_LANG_ID, szDHW); // // sprintf( szDHW, "%#04x", wSubLangID); // SetDlgItemTextA( hDlg, IDD_PROJ_SUB_LANG_ID, szDHW); // } // return( dwRC); //} //............................................................... //... //... Build the list of Language names and component ID values PLANGDATA GetLangList( void) { PLANGDATA pRC = NULL; HRSRC hResource = FindResourceEx( NULL, (LPCTSTR)RT_RCDATA, (LPCTSTR)ID_LANGID_LIST, MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL)); if ( hResource ) { HGLOBAL hRes = LoadResource( NULL, hResource); if ( hRes ) { PBYTE pRes = (PBYTE)LockResource( hRes); if ( pRes ) { int nNameLen = 0; PLANGDATA pTmp = NULL; nNameLen = lstrlenA( (LPSTR)pRes); pRC = (PLANGDATA)FALLOC( sizeof( LANGDATA)); pTmp = pRC; while ( nNameLen ) { MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, (LPSTR)pRes, -1, pTmp->szLangName, NAMELENBUFSIZE - 1); pRes += ++nNameLen; pTmp->wPriLang = MAKEWORD( *pRes, *(pRes+1) ); pRes += sizeof(WORD); pTmp->wSubLang = MAKEWORD( *pRes, *(pRes+1) ); pRes += sizeof(WORD); if ( (nNameLen = lstrlenA( (LPSTR)pRes)) ) { PLANGDATA pNew = (PLANGDATA)FALLOC( sizeof( LANGDATA)); pTmp->pNext = pNew; pTmp = pNew; } } //... END while( nNameLen ) } //... END if ( pRes ) else { DWORD dwErr = GetLastError(); } } //... END if ( hRes ) else { DWORD dwErr = GetLastError(); } } //... END if ( hSrc ) else { DWORD dwErr = GetLastError(); } return( pRC); } //............................................................... //... //... Return the name of a language based on the given components LPTSTR GetLangName( WORD wPriLangID, WORD wSubLangID) { LPTSTR pszRC = NULL; PLANGDATA pLang = NULL; if ( ! pLangList ) { pLangList = GetLangList(); } for ( pLang = pLangList; pLang && ! pszRC; pLang = pLang->pNext ) { if ( pLang->wPriLang == wPriLangID && pLang->wSubLang == wSubLangID ) { pszRC = pLang->szLangName; } } return( pszRC); } //............................................................... //... //... Return the language ID components based on the given name BOOL GetLangIDs( LPTSTR pszName, PWORD pwPri, PWORD pwSub ) { BOOL fRC = FALSE; PLANGDATA pLang = NULL; if ( ! pLangList ) { pLangList = GetLangList(); } for ( pLang = pLangList; pLang && ! fRC; pLang = pLang->pNext ) { if ( lstrcmp( pLang->szLangName, pszName) == 0 ) { *pwPri = pLang->wPriLang; *pwSub = pLang->wSubLang; fRC = TRUE; } } return( fRC); } //............................................................... //... //... Fill the given combobox with the names of supported the languages. LONG FillLangNameBox( HWND hDlg, int nControl) { PLANGDATA pLang = NULL; PLANGLIST pID = NULL; LONG lRC = -1; BOOL fListIt = TRUE; WORD wAddLang = 0; if ( nControl == IDD_MSTR_LANG_NAME ) { if ( GetListOfResLangIDs( gMstr.szSrc) != SUCCESS ) { return( lRC); } } if ( ! pLangList ) { pLangList = GetLangList(); } for ( pLang = pLangList; pLang; pLang = pLang->pNext ) { fListIt = TRUE; if ( nControl == IDD_MSTR_LANG_NAME ) { wAddLang = MAKELANGID( pLang->wPriLang, pLang->wSubLang); fListIt = FALSE; for ( pID = pLangIDList; pID; pID = pID->pNext ) { if ( pID->wLang == wAddLang ) { fListIt = TRUE; break; } } } if ( fListIt ) { lRC = (LONG)SendDlgItemMessage( hDlg, nControl, CB_ADDSTRING, 0, (LPARAM)pLang->szLangName); if ( lRC == CB_ERR || lRC == CB_ERRSPACE ) { QuitT( IDS_ERR_16, NULL, NULL); } } } if ( nControl == IDD_MSTR_LANG_NAME ) { FreeLangIDList(); } return( lRC); } void FreeLangList( void) { PLANGDATA pTmp = NULL; while ( pLangList ) { pTmp = pLangList->pNext; RLFREE( pLangList); pLangList = pTmp; } #ifdef RLRES32 FreeLangIDList(); #endif } //................................................................... void FillListAndSetLang( HWND hDlg, WORD wLangNameList, //... IDD_MSTR_LANG_NAME or IDD_PROJ_LANG_NAME WORD *pLangID, //... Ptr to gMstr.wLanguageID or gProj.wLanguageID BOOL *pfSelected) //... Did we select a language here? (Can be NULL) { int nSel = FillLangNameBox( hDlg, wLangNameList); if ( nSel > 0L ) { LPTSTR pszLangName = NULL; //... See if the default master language is in the list if ( (pszLangName = GetLangName( (WORD)(PRIMARYLANGID( *pLangID)), (WORD)(SUBLANGID( *pLangID)))) != NULL ) { if ( (nSel = (int)SendDlgItemMessage( hDlg, wLangNameList, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)pszLangName)) != CB_ERR ) { //... default master language is in list SendDlgItemMessage( hDlg, wLangNameList, CB_SETCURSEL, (WPARAM)nSel, (LPARAM)0); if ( pfSelected ) { *pfSelected = TRUE; } } } } else if ( nSel == 0 ) { //... Use first entry in the list SendDlgItemMessage( hDlg, wLangNameList, CB_SETCURSEL, (WPARAM)nSel, (LPARAM)0); if ( (nSel = (int)SendDlgItemMessage( hDlg, wLangNameList, CB_GETLBTEXT, (WPARAM)nSel, (LPARAM)(LPTSTR)szDHW)) != CB_ERR ) { WORD wPri = 0; WORD wSub = 0; if ( GetLangIDs( (LPTSTR)szDHW, &wPri, &wSub) ) { *pLangID = MAKELANGID( wPri, wSub); if ( pfSelected ) { *pfSelected = TRUE; } } else { nSel = CB_ERR; } } } if ( nSel == CB_ERR ) { SetDlgItemText( hDlg, wLangNameList, TEXT("UNKNOWN")); } }