winemenubuilder: store menu paths in unicode
Damjan Jovanovic
damjan.jov at gmail.com
Fri Apr 30 06:41:40 CDT 2010
Changelog:
* winemenubuilder: store menu paths in unicode
Part of the fix for #20279
Damjan Jovanovic
-------------- next part --------------
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 0ab3639..9532a2e 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -883,11 +883,52 @@ static HKEY open_menus_reg_key(void)
static const WCHAR Software_Wine_FileOpenAssociationsW[] = {
'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\','M','e','n','u','F','i','l','e','s',0};
HKEY assocKey;
- if (RegCreateKeyW(HKEY_CURRENT_USER, Software_Wine_FileOpenAssociationsW, &assocKey) == ERROR_SUCCESS)
+ DWORD ret;
+ ret = RegCreateKeyW(HKEY_CURRENT_USER, Software_Wine_FileOpenAssociationsW, &assocKey);
+ if (ret == ERROR_SUCCESS)
return assocKey;
+ SetLastError(ret);
return NULL;
}
+static DWORD register_menus_entry(const char *unix_file, const char *windows_file)
+{
+ WCHAR *unix_fileW;
+ WCHAR *windows_fileW;
+ INT size;
+ DWORD ret;
+
+ size = MultiByteToWideChar(CP_UNIXCP, 0, unix_file, -1, NULL, 0);
+ unix_fileW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
+ if (unix_fileW)
+ {
+ MultiByteToWideChar(CP_UNIXCP, 0, unix_file, -1, unix_fileW, size);
+ size = MultiByteToWideChar(CP_UNIXCP, 0, windows_file, -1, NULL, 0);
+ windows_fileW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
+ if (windows_fileW)
+ {
+ HKEY hkey;
+ MultiByteToWideChar(CP_UNIXCP, 0, windows_file, -1, windows_fileW, size);
+ hkey = open_menus_reg_key();
+ if (hkey)
+ {
+ ret = RegSetValueExW(hkey, unix_fileW, 0, REG_SZ, (const BYTE*)windows_fileW,
+ (strlenW(windows_fileW) + 1) * sizeof(WCHAR));
+ RegCloseKey(hkey);
+ }
+ else
+ ret = GetLastError();
+ HeapFree(GetProcessHeap(), 0, windows_fileW);
+ }
+ else
+ ret = ERROR_NOT_ENOUGH_MEMORY;
+ HeapFree(GetProcessHeap(), 0, unix_fileW);
+ }
+ else
+ ret = ERROR_NOT_ENOUGH_MEMORY;
+ return ret;
+}
+
static BOOL write_desktop_entry(const char *unix_link, const char *location, const char *linkname,
const char *path, const char *args, const char *descr,
const char *workdir, const char *icon)
@@ -919,13 +960,8 @@ static BOOL write_desktop_entry(const char *unix_link, const char *location, con
if (unix_link)
{
- HKEY hkey = open_menus_reg_key();
- if (hkey)
- {
- RegSetValueExA(hkey, location, 0, REG_SZ, (const BYTE*) unix_link, lstrlenA(unix_link) + 1);
- RegCloseKey(hkey);
- }
- else
+ DWORD ret = register_menus_entry(location, unix_link);
+ if (ret != ERROR_SUCCESS)
return FALSE;
}
@@ -1057,14 +1093,7 @@ end:
remove(tempfilename);
HeapFree(GetProcessHeap(), 0, tempfilename);
if (ret)
- {
- HKEY hkey = open_menus_reg_key();
- if (hkey)
- {
- RegSetValueExA(hkey, menuPath, 0, REG_SZ, (const BYTE*) unix_link, lstrlenA(unix_link) + 1);
- RegCloseKey(hkey);
- }
- }
+ register_menus_entry(menuPath, unix_link);
HeapFree(GetProcessHeap(), 0, name);
HeapFree(GetProcessHeap(), 0, menuPath);
return ret;
More information about the wine-patches
mailing list