Alexandre Julliard : winemenubuilder: Use DOS path names to create icon files.
Alexandre Julliard
julliard at winehq.org
Fri Oct 1 18:02:21 CDT 2021
Module: wine
Branch: master
Commit: 0428292fc7f1028573037b68a423eed424ddc3ee
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0428292fc7f1028573037b68a423eed424ddc3ee
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Oct 1 10:30:28 2021 +0200
winemenubuilder: Use DOS path names to create icon files.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winemenubuilder/winemenubuilder.c | 66 +++++++++++++-----------------
1 file changed, 28 insertions(+), 38 deletions(-)
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index dccb6c2de06..b59d9c56882 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -410,9 +410,8 @@ static char *wchars_to_xml_text(const WCHAR *string)
*/
static HRESULT convert_to_native_icon(IStream *icoFile, int *indices, int numIndices,
- const CLSID *outputFormat, const char *outputFileName)
+ const CLSID *outputFormat, const WCHAR *outputFileName)
{
- WCHAR *dosOutputFileName = NULL;
IWICImagingFactory *factory = NULL;
IWICBitmapDecoder *decoder = NULL;
IWICBitmapEncoder *encoder = NULL;
@@ -421,12 +420,6 @@ static HRESULT convert_to_native_icon(IStream *icoFile, int *indices, int numInd
int i;
HRESULT hr = E_FAIL;
- dosOutputFileName = wine_get_dos_file_name(outputFileName);
- if (dosOutputFileName == NULL)
- {
- WINE_ERR("error converting %s to DOS file name\n", outputFileName);
- goto end;
- }
hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
&IID_IWICImagingFactory, (void**)&factory);
if (FAILED(hr))
@@ -456,10 +449,10 @@ static HRESULT convert_to_native_icon(IStream *icoFile, int *indices, int numInd
WINE_ERR("error 0x%08X creating bitmap encoder\n", hr);
goto end;
}
- hr = SHCreateStreamOnFileW(dosOutputFileName, STGM_CREATE | STGM_WRITE, &outputFile);
+ hr = SHCreateStreamOnFileW(outputFileName, STGM_CREATE | STGM_WRITE, &outputFile);
if (FAILED(hr))
{
- WINE_ERR("error 0x%08X creating output file %s\n", hr, wine_dbgstr_w(dosOutputFileName));
+ WINE_ERR("error 0x%08X creating output file %s\n", hr, wine_dbgstr_w(outputFileName));
goto end;
}
hr = IWICBitmapEncoder_Initialize(encoder, outputFile, WICBitmapEncoderNoCache);
@@ -566,7 +559,6 @@ static HRESULT convert_to_native_icon(IStream *icoFile, int *indices, int numInd
}
end:
- heap_free(dosOutputFileName);
if (factory)
IWICImagingFactory_Release(factory);
if (decoder)
@@ -1007,7 +999,7 @@ static HRESULT validate_ico(IStream **ppStream, ICONDIRENTRY **ppIconDirEntries,
}
static HRESULT write_native_icon(IStream *iconStream, ICONDIRENTRY *pIconDirEntry,
- int numEntries, const char *icon_name)
+ int numEntries, const WCHAR *icon_name)
{
int nMax = 0, nMaxBits = 0;
int nIndex = 0;
@@ -1178,6 +1170,7 @@ static HRESULT platform_write_icon(IStream *icoStream, ICONDIRENTRY *iconDirEntr
int numEntries, int exeIndex, LPCWSTR icoPathW,
const WCHAR *destFilename, WCHAR **nativeIdentifier)
{
+ static const WCHAR fmtW[] = {'%','s','\\','%','s','.','i','c','n','s',0};
struct {
int index;
int maxBits;
@@ -1185,8 +1178,8 @@ static HRESULT platform_write_icon(IStream *icoStream, ICONDIRENTRY *iconDirEntr
} best[ICNS_SLOTS];
int indexes[ICNS_SLOTS];
int i;
- const char* tmpdir;
- char *icnsPath = NULL;
+ WCHAR tmpdir[MAX_PATH];
+ WCHAR *icnsPath;
LARGE_INTEGER zero;
HRESULT hr;
@@ -1244,8 +1237,8 @@ static HRESULT platform_write_icon(IStream *icoStream, ICONDIRENTRY *iconDirEntr
}
*nativeIdentifier = compute_native_identifier(exeIndex, icoPathW, destFilename);
- if (!(tmpdir = getenv("TMPDIR"))) tmpdir = "/tmp";
- icnsPath = heap_printf("%s/%s.icns", tmpdir, wchars_to_utf8_chars(*nativeIdentifier));
+ GetTempPathW( MAX_PATH, tmpdir );
+ icnsPath = heap_wprintf(fmtW, tmpdir, *nativeIdentifier);
zero.QuadPart = 0;
hr = IStream_Seek(icoStream, zero, STREAM_SEEK_SET, NULL);
if (FAILED(hr))
@@ -1257,7 +1250,7 @@ static HRESULT platform_write_icon(IStream *icoStream, ICONDIRENTRY *iconDirEntr
if (FAILED(hr))
{
WINE_WARN("converting %s to %s failed, error 0x%08X\n",
- wine_dbgstr_w(icoPathW), wine_dbgstr_a(icnsPath), hr);
+ wine_dbgstr_w(icoPathW), wine_dbgstr_w(icnsPath), hr);
goto end;
}
@@ -1266,34 +1259,34 @@ end:
return hr;
}
#else
-static void refresh_icon_cache(const char *iconsDir)
+static void refresh_icon_cache(const WCHAR *iconsDir)
{
+ static const WCHAR icnW[] = {'i','c','n',0};
+ WCHAR buffer[MAX_PATH];
+
/* The icon theme spec only requires the mtime on the "toplevel"
* directory (whatever that is) to be changed for a refresh,
* but on GNOME you have to create a file in that directory
* instead. Creating a file also works on KDE, Xfce and LXDE.
*/
- char *filename = heap_printf("%s/.wine-refresh-XXXXXX", iconsDir);
- int fd = mkstemps(filename, 0);
- if (fd >= 0)
- {
- close(fd);
- unlink(filename);
- }
- heap_free(filename);
+ GetTempFileNameW( iconsDir, icnW, 0, buffer );
+ DeleteFileW( buffer );
}
static HRESULT platform_write_icon(IStream *icoStream, ICONDIRENTRY *iconDirEntries,
int numEntries, int exeIndex, LPCWSTR icoPathW,
const WCHAR *destFilename, WCHAR **nativeIdentifier)
{
+ static const WCHAR fmtW[] = {'%','s','\\','i','c','o','n','s','\\','h','i','c','o','l','o','r',0};
+ static const WCHAR fmt2W[] = {'%','s','\\','%','d','x','%','d','\\','a','p','p','s',0};
+ static const WCHAR fmt3W[] = {'%','s','\\','%','s','.','p','n','g',0};
int i;
- char *iconsDir = NULL;
+ WCHAR *iconsDir;
HRESULT hr = S_OK;
LARGE_INTEGER zero;
*nativeIdentifier = compute_native_identifier(exeIndex, icoPathW, destFilename);
- iconsDir = heap_printf("%s/icons/hicolor", xdg_data_dir_unix);
+ iconsDir = heap_wprintf(fmtW, xdg_data_dir);
for (i = 0; i < numEntries; i++)
{
@@ -1301,8 +1294,8 @@ static HRESULT platform_write_icon(IStream *icoStream, ICONDIRENTRY *iconDirEntr
int j;
BOOLEAN duplicate = FALSE;
int w, h;
- char *iconDir = NULL;
- char *pngPath = NULL;
+ WCHAR *iconDir;
+ WCHAR *pngPath;
WINE_TRACE("[%d]: %d x %d @ %d\n", i, iconDirEntries[i].bWidth,
iconDirEntries[i].bHeight, iconDirEntries[i].wBitCount);
@@ -1331,9 +1324,9 @@ static HRESULT platform_write_icon(IStream *icoStream, ICONDIRENTRY *iconDirEntr
w = iconDirEntries[bestIndex].bWidth ? iconDirEntries[bestIndex].bWidth : 256;
h = iconDirEntries[bestIndex].bHeight ? iconDirEntries[bestIndex].bHeight : 256;
- iconDir = heap_printf("%s/%dx%d/apps", iconsDir, w, h);
- create_directories(iconDir);
- pngPath = heap_printf("%s/%s.png", iconDir, wchars_to_utf8_chars(*nativeIdentifier));
+ iconDir = heap_wprintf(fmt2W, iconsDir, w, h);
+ create_directoriesW(iconDir);
+ pngPath = heap_wprintf(fmt3W, iconDir, *nativeIdentifier);
zero.QuadPart = 0;
hr = IStream_Seek(icoStream, zero, STREAM_SEEK_SET, NULL);
if (SUCCEEDED(hr))
@@ -2906,7 +2899,6 @@ static void cleanup_menus(void)
static void thumbnail_lnk(LPCWSTR lnkPath, LPCWSTR outputPath)
{
char *utf8lnkPath = NULL;
- char *utf8OutputPath = NULL;
WCHAR *winLnkPath = NULL;
IShellLinkW *shellLink = NULL;
IPersistFile *persistFile = NULL;
@@ -2921,7 +2913,6 @@ static void thumbnail_lnk(LPCWSTR lnkPath, LPCWSTR outputPath)
HRESULT hr;
utf8lnkPath = wchars_to_utf8_chars(lnkPath);
- utf8OutputPath = wchars_to_utf8_chars(outputPath);
winLnkPath = wine_get_dos_file_name(utf8lnkPath);
if (winLnkPath == NULL)
{
@@ -2969,18 +2960,17 @@ static void thumbnail_lnk(LPCWSTR lnkPath, LPCWSTR outputPath)
{
hr = open_icon(szIconPath, iconId, FALSE, &stream, &pIconDirEntries, &numEntries);
if (SUCCEEDED(hr))
- hr = write_native_icon(stream, pIconDirEntries, numEntries, utf8OutputPath);
+ hr = write_native_icon(stream, pIconDirEntries, numEntries, outputPath);
}
else
{
hr = open_icon(szPath, iconId, FALSE, &stream, &pIconDirEntries, &numEntries);
if (SUCCEEDED(hr))
- hr = write_native_icon(stream, pIconDirEntries, numEntries, utf8OutputPath);
+ hr = write_native_icon(stream, pIconDirEntries, numEntries, outputPath);
}
end:
heap_free(utf8lnkPath);
- heap_free(utf8OutputPath);
heap_free(winLnkPath);
if (shellLink != NULL)
IShellLinkW_Release(shellLink);
More information about the wine-cvs
mailing list