Convert app description field to unicode and use CP_UNIXCP when printing it on the console
Dmitry Timoshkov
dmitry at baikal.ru
Mon Feb 23 06:38:02 CST 2004
Hello,
This patch fixes 'uninstaller --list' for systems where Windows encoding
differs from the encoding of the underlying *nix system.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Convert app description field to unicode and use CP_UNIXCP
when printing it on the console.
--- cvs/hq/wine/programs/uninstaller/main.c Tue Feb 10 02:08:36 2004
+++ wine/programs/uninstaller/main.c Mon Feb 23 12:26:46 2004
@@ -58,7 +58,7 @@ static char program_description[] =
typedef struct {
char *key;
- char *descr;
+ WCHAR *descr;
char *command;
int active;
} uninst_entry;
@@ -87,13 +87,20 @@ void UninstallProgram(void);
void ListUninstallPrograms(void)
{
- int i;
+ int i, len;
+ char *descr;
if (! FetchUninstallInformation())
return;
for (i=0; i < numentries; i++)
- printf("%s|||%s\n", entries[i].key, entries[i].descr);
+ {
+ len = WideCharToMultiByte(CP_UNIXCP, 0, entries[i].descr, -1, NULL, 0, NULL, NULL);
+ descr = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ WideCharToMultiByte(CP_UNIXCP, 0, entries[i].descr, -1, descr, len, NULL, NULL);
+ printf("%s|||%s\n", entries[i].key, descr);
+ HeapFree(GetProcessHeap(), 0, descr);
+ }
}
@@ -167,7 +174,7 @@ int main( int argc, char *argv[])
wc.hInstance = hInst;
wc.hIcon = LoadIcon( hInst, appname );
wc.hCursor = LoadCursor( NULL_HANDLE, IDI_APPLICATION );
- wc.hbrBackground = (HBRUSH) GetStockObject( LTGRAY_BRUSH );
+ wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = appname;
@@ -191,22 +198,21 @@ int main( int argc, char *argv[])
int cmp_by_name(const void *a, const void *b)
{
- return strcasecmp(((uninst_entry *)a)->descr, ((uninst_entry *)b)->descr);
+ return lstrcmpiW(((uninst_entry *)a)->descr, ((uninst_entry *)b)->descr);
}
int FetchUninstallInformation(void)
{
HKEY hkeyUninst, hkeyApp;
int i;
- DWORD sizeOfSubKeyName=255, displen, uninstlen;
+ DWORD sizeOfSubKeyName, displen, uninstlen;
char subKeyName[256];
char key_app[1024];
char *p;
-
numentries = 0;
oldsel = -1;
- if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGSTR_PATH_UNINSTALL,
+ if ( RegOpenKeyExA(HKEY_LOCAL_MACHINE, REGSTR_PATH_UNINSTALL,
0, KEY_READ, &hkeyUninst) != ERROR_SUCCESS )
{
MessageBox(0, "Uninstall registry key not available (yet), nothing to do !", appname, MB_OK);
@@ -219,17 +225,21 @@ int FetchUninstallInformation(void)
strcpy(key_app, REGSTR_PATH_UNINSTALL);
strcat(key_app, "\\");
p = key_app+strlen(REGSTR_PATH_UNINSTALL)+1;
+
+ sizeOfSubKeyName = 255;
for ( i=0;
RegEnumKeyExA( hkeyUninst, i, subKeyName, &sizeOfSubKeyName,
NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS;
- ++i, sizeOfSubKeyName=255 )
+ ++i )
{
+ static const WCHAR DisplayNameW[] = {'D','i','s','p','l','a','y','N','a','m','e',0};
+
strcpy(p, subKeyName);
- RegOpenKeyEx(HKEY_LOCAL_MACHINE, key_app, 0, KEY_READ, &hkeyApp);
+ RegOpenKeyExA(HKEY_LOCAL_MACHINE, key_app, 0, KEY_READ, &hkeyApp);
- if ( (RegQueryValueEx(hkeyApp, REGSTR_VAL_UNINSTALLER_DISPLAYNAME,
+ if ( (RegQueryValueExW(hkeyApp, DisplayNameW,
0, 0, NULL, &displen) == ERROR_SUCCESS)
- && (RegQueryValueEx(hkeyApp, REGSTR_VAL_UNINSTALLER_COMMANDLINE,
+ && (RegQueryValueExA(hkeyApp, REGSTR_VAL_UNINSTALLER_COMMANDLINE,
0, 0, NULL, &uninstlen) == ERROR_SUCCESS) )
{
numentries++;
@@ -239,16 +249,21 @@ int FetchUninstallInformation(void)
strcpy(entries[numentries-1].key, subKeyName);
entries[numentries-1].descr =
HeapAlloc(GetProcessHeap(), 0, displen);
- RegQueryValueEx(hkeyApp, REGSTR_VAL_UNINSTALLER_DISPLAYNAME, 0, 0,
- entries[numentries-1].descr, &displen);
+ RegQueryValueExW(hkeyApp, DisplayNameW, 0, 0,
+ (LPBYTE)entries[numentries-1].descr, &displen);
entries[numentries-1].command =
HeapAlloc(GetProcessHeap(), 0, uninstlen);
entries[numentries-1].active = 0;
- RegQueryValueEx(hkeyApp, REGSTR_VAL_UNINSTALLER_COMMANDLINE, 0, 0,
+ RegQueryValueExA(hkeyApp, REGSTR_VAL_UNINSTALLER_COMMANDLINE, 0, 0,
entries[numentries-1].command, &uninstlen);
- WINE_TRACE("allocated entry #%d: '%s' ('%s'), '%s'\n", numentries, entries[numentries-1].key, entries[numentries-1].descr, entries[numentries-1].command);
+ WINE_TRACE("allocated entry #%d: %s (%s), %s\n",
+ numentries, entries[numentries-1].key,
+ wine_dbgstr_w(entries[numentries-1].descr),
+ entries[numentries-1].command);
}
RegCloseKey(hkeyApp);
+
+ sizeOfSubKeyName = 255;
}
qsort(entries, numentries, sizeof(uninst_entry), cmp_by_name);
RegCloseKey(hkeyUninst);
@@ -271,7 +286,7 @@ void UninstallProgram(void)
{
if (!(entries[i].active)) /* don't uninstall this one */
continue;
- WINE_TRACE("uninstalling '%s'\n", entries[i].descr);
+ WINE_TRACE("uninstalling %s\n", wine_dbgstr_w(entries[i].descr));
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.wShowWindow = SW_NORMAL;
@@ -393,8 +408,8 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT
SendMessage(hwndList, WM_SETREDRAW, FALSE, 0);
for (i=0; i < numentries; i++)
{
- WINE_TRACE("adding '%s'\n", entries[i].descr);
- SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)entries[i].descr);
+ WINE_TRACE("adding %s\n", wine_dbgstr_w(entries[i].descr));
+ SendMessageW(hwndList, LB_ADDSTRING, 0, (LPARAM)entries[i].descr);
}
WINE_TRACE("setting prevsel %d\n", prevsel);
if (prevsel != -1)
@@ -421,11 +436,13 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT
if (oldsel != -1)
{
entries[oldsel].active ^= 1; /* toggle */
- WINE_TRACE("toggling %d old '%s'\n", entries[oldsel].active, entries[oldsel].descr);
+ WINE_TRACE("toggling %d old %s\n", entries[oldsel].active,
+ wine_dbgstr_w(entries[oldsel].descr));
}
#endif
entries[sel].active ^= 1; /* toggle */
- WINE_TRACE("toggling %d '%s'\n", entries[sel].active, entries[sel].descr);
+ WINE_TRACE("toggling %d %s\n", entries[sel].active,
+ wine_dbgstr_w(entries[oldsel].descr));
SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM)entries[sel].command);
oldsel = sel;
}
More information about the wine-patches
mailing list