=?UTF-8?Q?Lauri=20Kentt=C3=A4=20?=: comdlg32: Avoid generating filenames twice in filedlg.
Alexandre Julliard
julliard at winehq.org
Fri Jul 8 10:02:04 CDT 2016
Module: wine
Branch: master
Commit: f99da3f3a1a2ac7e312687d4e0d11e9f52c1acda
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f99da3f3a1a2ac7e312687d4e0d11e9f52c1acda
Author: Lauri Kenttä <lauri.kentta at gmail.com>
Date: Wed Jul 6 13:27:43 2016 +0300
comdlg32: Avoid generating filenames twice in filedlg.
Signed-off-by: Lauri Kenttä <lauri.kentta at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comdlg32/filedlg.c | 110 ++++++++++++++++++++----------------------------
1 file changed, 46 insertions(+), 64 deletions(-)
diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c
index b0402c0..a04e646 100644
--- a/dlls/comdlg32/filedlg.c
+++ b/dlls/comdlg32/filedlg.c
@@ -3647,9 +3647,8 @@ void FILEDLG95_FILENAME_FillFromSelection (HWND hwnd)
{
FileOpenDlgInfos *fodInfos;
LPITEMIDLIST pidl;
- UINT nFiles = 0, nFileToOpen, nFileSelected, nLength = 0;
- WCHAR lpstrTemp[MAX_PATH];
- LPWSTR lpstrAllFile, lpstrCurrFile;
+ LPWSTR lpstrAllFiles, lpstrTmp;
+ UINT nFiles = 0, nFileToOpen, nFileSelected, nAllFilesLength = 0, nThisFileLength, nAllFilesMaxLength;
TRACE("\n");
fodInfos = GetPropA(hwnd,FileOpenDlgInfosStr);
@@ -3657,74 +3656,57 @@ void FILEDLG95_FILENAME_FillFromSelection (HWND hwnd)
/* Count how many files we have */
nFileSelected = GetNumSelected( fodInfos->Shell.FOIDataObject );
- /* calculate the string length, count files */
- if (nFileSelected >= 1)
+ /* Allocate a buffer */
+ nAllFilesMaxLength = MAX_PATH + 3;
+ lpstrAllFiles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nAllFilesMaxLength * sizeof(WCHAR));
+ if (!lpstrAllFiles)
+ goto ret;
+
+ /* Loop through the selection, handle only files (not folders) */
+ for (nFileToOpen = 0; nFileToOpen < nFileSelected; nFileToOpen++)
{
- nLength += 3; /* first and last quotes, trailing \0 */
- for ( nFileToOpen = 0; nFileToOpen < nFileSelected; nFileToOpen++ )
- {
pidl = GetPidlFromDataObject( fodInfos->Shell.FOIDataObject, nFileToOpen+1 );
-
if (pidl)
- {
- /* get the total length of the selected file names */
- lpstrTemp[0] = '\0';
- GetName( fodInfos->Shell.FOIShellFolder, pidl, SHGDN_INFOLDER|SHGDN_FORPARSING, lpstrTemp );
-
- if ( ! IsPidlFolder(fodInfos->Shell.FOIShellFolder, pidl) ) /* Ignore folders */
- {
- nLength += lstrlenW( lpstrTemp ) + 3;
- nFiles++;
- }
- COMDLG32_SHFree( pidl );
- }
- }
+ {
+ if (!IsPidlFolder(fodInfos->Shell.FOIShellFolder, pidl))
+ {
+ if (nAllFilesLength + MAX_PATH + 3 > nAllFilesMaxLength)
+ {
+ nAllFilesMaxLength *= 2;
+ lpstrTmp = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lpstrAllFiles, nAllFilesMaxLength * sizeof(WCHAR));
+ if (!lpstrTmp)
+ goto ret;
+ lpstrAllFiles = lpstrTmp;
+ }
+ nFiles += 1;
+ lpstrAllFiles[nAllFilesLength++] = '"';
+ GetName(fodInfos->Shell.FOIShellFolder, pidl, SHGDN_INFOLDER | SHGDN_FORPARSING, lpstrAllFiles + nAllFilesLength);
+ nThisFileLength = lstrlenW(lpstrAllFiles + nAllFilesLength);
+ nAllFilesLength += nThisFileLength;
+ lpstrAllFiles[nAllFilesLength++] = '"';
+ lpstrAllFiles[nAllFilesLength++] = ' ';
+ }
+ COMDLG32_SHFree(pidl);
+ }
}
- /* allocate the buffer */
- if (nFiles <= 1) nLength = MAX_PATH;
- lpstrAllFile = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nLength * sizeof(WCHAR));
-
- /* Generate the string for the edit control */
- if(nFiles >= 1)
+ if (nFiles != 0)
{
- lpstrCurrFile = lpstrAllFile;
- for ( nFileToOpen = 0; nFileToOpen < nFileSelected; nFileToOpen++ )
- {
- pidl = GetPidlFromDataObject( fodInfos->Shell.FOIDataObject, nFileToOpen+1 );
-
- if (pidl)
- {
- /* get the file name */
- lpstrTemp[0] = '\0';
- GetName( fodInfos->Shell.FOIShellFolder, pidl, SHGDN_INFOLDER|SHGDN_FORPARSING, lpstrTemp );
-
- if (! IsPidlFolder(fodInfos->Shell.FOIShellFolder, pidl)) /* Ignore folders */
- {
- if ( nFiles > 1)
- {
- *lpstrCurrFile++ = '\"';
- lstrcpyW( lpstrCurrFile, lpstrTemp );
- lpstrCurrFile += lstrlenW( lpstrTemp );
- *lpstrCurrFile++ = '\"';
- *lpstrCurrFile++ = ' ';
- *lpstrCurrFile = 0;
- }
- else
- {
- lstrcpyW( lpstrAllFile, lpstrTemp );
- }
- }
- COMDLG32_SHFree( pidl );
- }
- }
- SetWindowTextW( fodInfos->DlgInfos.hwndFileName, lpstrAllFile );
-
- /* Select the file name like Windows does */
- if (filename_is_edit( fodInfos ))
- SendMessageW(fodInfos->DlgInfos.hwndFileName, EM_SETSEL, 0, -1);
+ /* If there's only one file, use the name as-is without quotes */
+ lpstrTmp = lpstrAllFiles;
+ if (nFiles == 1)
+ {
+ lpstrTmp += 1;
+ lpstrTmp[nThisFileLength] = 0;
+ }
+ SetWindowTextW(fodInfos->DlgInfos.hwndFileName, lpstrTmp);
+ /* Select the file name like Windows does */
+ if (filename_is_edit(fodInfos))
+ SendMessageW(fodInfos->DlgInfos.hwndFileName, EM_SETSEL, 0, -1);
}
- HeapFree(GetProcessHeap(),0, lpstrAllFile );
+
+ret:
+ HeapFree(GetProcessHeap(), 0, lpstrAllFiles);
}
More information about the wine-cvs
mailing list