#include "headers.hxx" #include "..\CSVDSReader.hpp" #include "..\constants.hpp" #include "..\global.hpp" HINSTANCE hResourceModuleHandle = 0; const wchar_t* HELPFILE_NAME = 0; // no context help available const wchar_t* RUNTIME_NAME = L"W2KStrs"; DWORD DEFAULT_LOGGING_OPTIONS = Log::OUTPUT_TO_FILE | Log::OUTPUT_FUNCCALLS | Log::OUTPUT_LOGS | Log::OUTPUT_ERRORS | Log::OUTPUT_HEADER; Popup popup(L"W2KStrs", false); // Keep all printable characters and escape the others. // Escaping means representing the character as &xxxx // where the x is an hexadecimal digit // This routine also replaces & for && // The unescape function is in ..\global.cpp String escape(const wchar_t *str) { LOG_FUNCTION(escape); String dest; wchar_t strNum[5]; while(*str!=0) { if(*str=='&') { dest+=L"&&"; } else { if ( (*str >= L'a' && *str <= L'z') || (*str >= L'A' && *str <= L'Z') || (*str >= L'0' && *str <= L'9') || wcschr(L" !@#$%^*()-_=+[{]}\"';:.>,</?\\|",*str)!=NULL ) { dest+=*str; } else { // I know that a w_char as a string will have // exactly 4 hexadecimal digits, so this is one of // the very rare wsprintfs that can be considered safe :) wsprintf(strNum,L"&%04x",*str); dest+=String(strNum); } } str++; } return dest; } int WINAPI WinMain( HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance */ , LPSTR /*lpszCmdLine, */, int /*nCmdShow */) { LOG_FUNCTION(WinMain); int argv; LPWSTR *argc=CommandLineToArgvW(GetCommandLine(),&argv); if(argv!=3) { MessageBox(NULL,L"Usage: W2KStrs dcpromo2k.csv out.txt",L"Error",MB_OK); return 0; } HRESULT hr=S_OK; HANDLE file=INVALID_HANDLE_VALUE; const wchar_t *W2KFile =argc[1]; const wchar_t *outFile =argc[2]; do { CSVDSReader csvIntlW2K; hr=csvIntlW2K.read(W2KFile,LOCALEIDS); BREAK_ON_FAILED_HRESULT(hr); hr=FS::CreateFile( outFile, file, GENERIC_WRITE); if FAILED(hr) { MessageBox(NULL,L"Problems during generation",L"Error",MB_OK); LOG_HRESULT(hr); return hr; } for(long l=0;LOCALEIDS[l]!=0;l++) { for( long i = 0; *(CHANGE_LIST[i].object)!=0; i++) { wchar_t *object = CHANGE_LIST[i].object; for( long c = 0; *(CHANGE_LIST[i].changes[c].property)!=0; c++) { enum TYPE_OF_CHANGE type; type = CHANGE_LIST[i].changes[c].type; if( type == REPLACE_W2K_SINGLE_VALUE || type == REPLACE_W2K_MULTIPLE_VALUE ) { wchar_t *property = CHANGE_LIST[i].changes[c].property; wchar_t *value = CHANGE_LIST[i].changes[c].value; long locale = LOCALEIDS[l]; String W2KValue; // The goal of if and else is getting the W2KValue if(type==REPLACE_W2K_SINGLE_VALUE) { StringList valuesW2K; hr=csvIntlW2K.getCsvValues(locale,object,property,valuesW2K); BREAK_ON_FAILED_HRESULT(hr); if(valuesW2K.size()==0) { error=L"No values"; hr=E_FAIL; break; } if (valuesW2K.size()!=1) { error=L"Size should be 1"; hr=E_FAIL; break; } W2KValue=*valuesW2K.begin(); } else { // type == REPLACE_W2K_MULTIPLE_VALUE String sW2KXP(value+2); // +2 for index and comma StringList lW2KXP; size_t cnt=sW2KXP.tokenize(back_inserter(lW2KXP),L";"); if(cnt!=2) { error=L"There should be two strings (W2K and XP)"; hr=E_FAIL; break; } hr=csvIntlW2K.getCsvValue( locale, object, property, lW2KXP.begin()->c_str(), W2KValue ); BREAK_ON_FAILED_HRESULT(hr); if(W2KValue.size()==0) { error=L"Did not find value(s)",L"Error"; hr=E_FAIL; break; } size_t pos=W2KValue.find(L','); if(pos==String::npos) { error=L"MultipleValue without comma",L"Error"; hr=E_FAIL; break; } } // by now the W2KValue is loaded // The test sequence // This test sequence is usefull when you already have // replaceW2KStrs from a previous run and you want to // test that the strings have been correctly // retrieved, encoded and decoded //pair<long,long> tmpIndxLoc; //tmpIndxLoc.first=index; //tmpIndxLoc.second=locale; //String tmpValue=replaceW2KStrs[tmpIndxLoc]; //if (tmpValue!=W2KValue) //{ //hr=E_FAIL; //break; //} long index = *value; hr=FS::WriteLine(file, String::format(L"tmpIndxLoc.first=%1!d!;",index)); BREAK_ON_FAILED_HRESULT(hr); hr=FS::WriteLine(file, String::format(L"tmpIndxLoc.second=0x%1!3x!;",locale)); BREAK_ON_FAILED_HRESULT(hr); hr=FS::Write ( file, String::format ( L"replaceW2KStrs[tmpIndxLoc]=L\"%1\";\r\n", escape( W2KValue.c_str() ).c_str() ) ); BREAK_ON_FAILED_HRESULT(hr); } // if(changes[c].change== is REPLACE multiple or single } // for c (for each change in the entry) BREAK_ON_FAILED_HRESULT(hr); }// for i (for each entry in the change list) BREAK_ON_FAILED_HRESULT(hr); }// for l (for each locale) BREAK_ON_FAILED_HRESULT(hr); } while(0); CloseHandle(file); if (FAILED(hr)) { MessageBox(NULL,L"Problems during generation",L"Error",MB_OK); } else { MessageBox(NULL,L"Generation Successfull",L"Success",MB_OK); } LOG_HRESULT(hr); return 1; }