For the record, the commit doesn't match our contributing rules and
should be avoided in the future.
Reference: https://github.com/reactos/reactos/blob/master/.gitmessage

Le 16/02/2018 à 12:00, Katayama Hirofumi MZ a écrit :
> https://git.reactos.org/?p=reactos.git;a=commitdiff;h=338799bf8bf98698f3e4c1c2b885d724a9a929da
> 
> commit 338799bf8bf98698f3e4c1c2b885d724a9a929da
> Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
> AuthorDate: Fri Feb 16 20:00:08 2018 +0900
> Commit:     Ged Murphy <gedmur...@reactos.org>
> CommitDate: Fri Feb 16 11:00:08 2018 +0000
> 
>     improve SHGetFileInfo (#118)
>     
>     This patch reduces failures of SHGetFileInfo function. CORE-7159
>     * improve WideByteToWideChar calls
>     * fix bugs related to file attributes and SHGFI_EXETYPE
>     * SHGFI_USEFILEATTRIBUTES and SHGFI_ICON fix
>     * s/sizeof(temppsfi)/0/
> ---
>  dll/win32/shell32/wine/shell32_main.c | 81 
> +++++++++++++++++++++--------------
>  1 file changed, 49 insertions(+), 32 deletions(-)
> 
> diff --git a/dll/win32/shell32/wine/shell32_main.c 
> b/dll/win32/shell32/wine/shell32_main.c
> index b5638f0582..e64ef7f6fb 100644
> --- a/dll/win32/shell32/wine/shell32_main.c
> +++ b/dll/win32/shell32/wine/shell32_main.c
> @@ -3,6 +3,7 @@
>   *
>   * Copyright 1998 Marcus Meissner
>   * Copyright 1998 Juergen Schmied (jsch)  *  <juergen.schm...@metronet.de>
> + * Copyright 2017 Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
>   *
>   * This library is free software; you can redistribute it and/or
>   * modify it under the terms of the GNU Lesser General Public
> @@ -433,7 +434,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD 
> dwFileAttributes,
>      {
>          psfi->szDisplayName[0] = '\0';
>          psfi->szTypeName[0] = '\0';
> -        psfi->iIcon = 0;
> +        psfi->hIcon = NULL;
>      }
>  
>      if (!(flags & SHGFI_PIDL))
> @@ -449,12 +450,24 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD 
> dwFileAttributes,
>              lstrcpynW(szFullPath, path, MAX_PATH);
>          }
>      }
> +    else
> +    {
> +        SHGetPathFromIDListW((LPITEMIDLIST)path, szFullPath);
> +    }
>  
>      if (flags & SHGFI_EXETYPE)
>      {
> -        if (flags != SHGFI_EXETYPE)
> -            return 0;
> -        return shgfi_get_exe_type(szFullPath);
> +        if (!(flags & SHGFI_SYSICONINDEX))
> +        {
> +            if (flags & SHGFI_USEFILEATTRIBUTES)
> +            {
> +                return TRUE;
> +            }
> +            else if (GetFileAttributesW(szFullPath) != 
> INVALID_FILE_ATTRIBUTES)
> +            {
> +                return shgfi_get_exe_type(szFullPath);
> +            }
> +        }
>      }
>  
>      /*
> @@ -488,6 +501,8 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD 
> dwFileAttributes,
>                                  (LPCITEMIDLIST*)&pidlLast );
>              if (SUCCEEDED(hr))
>                  pidlLast = ILClone(pidlLast);
> +            else
> +                hr = S_OK;
>              ILFree(pidl);
>          }
>          else
> @@ -505,8 +520,18 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD 
> dwFileAttributes,
>              psfi->dwAttributes = 0xffffffff;
>          }
>          if (psfParent)
> -            IShellFolder_GetAttributesOf( psfParent, 1, 
> (LPCITEMIDLIST*)&pidlLast,
> -                                      &(psfi->dwAttributes) );
> +        {
> +            IShellFolder_GetAttributesOf(psfParent, 1, 
> (LPCITEMIDLIST*)&pidlLast,
> +                                         &(psfi->dwAttributes));
> +        }
> +    }
> +
> +    if (flags & SHGFI_USEFILEATTRIBUTES)
> +    {
> +        if (flags & SHGFI_ICON)
> +        {
> +            psfi->dwAttributes = 0;
> +        }
>      }
>  
>      /* get the displayname */
> @@ -516,7 +541,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD 
> dwFileAttributes,
>          {
>              lstrcpyW (psfi->szDisplayName, PathFindFileNameW(szFullPath));
>          }
> -        else
> +        else if (psfParent)
>          {
>              STRRET str;
>              hr = IShellFolder_GetDisplayNameOf( psfParent, pidlLast,
> @@ -618,7 +643,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD 
> dwFileAttributes,
>                      ret = FALSE;
>              }
>          }
> -        else
> +        else if (psfParent)
>          {
>              hr = IShellFolder_GetUIObjectOf(psfParent, 0, 1,
>                  (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconW,
> @@ -694,7 +719,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD 
> dwFileAttributes,
>                  }
>              }
>          }
> -        else
> +        else if (psfParent)
>          {
>              if (!(PidlToSicIndex(psfParent, pidlLast, !(flags & 
> SHGFI_SMALLICON),
>                  uGilFlags, &(psfi->iIcon))))
> @@ -769,33 +794,25 @@ DWORD_PTR WINAPI SHGetFileInfoA(LPCSTR path,DWORD 
> dwFileAttributes,
>          pathW = temppath;
>      }
>  
> -    if (psfi && (flags & SHGFI_ATTR_SPECIFIED))
> -        temppsfi.dwAttributes=psfi->dwAttributes;
> +    if (psfi)
> +    {
> +        temppsfi.hIcon = psfi->hIcon;
> +        temppsfi.iIcon = psfi->iIcon;
> +        temppsfi.dwAttributes = psfi->dwAttributes;
>  
> -    if (psfi == NULL)
> -        ret = SHGetFileInfoW(pathW, dwFileAttributes, NULL, 0, flags);
> -    else
>          ret = SHGetFileInfoW(pathW, dwFileAttributes, &temppsfi, 
> sizeof(temppsfi), flags);
> +        psfi->hIcon = temppsfi.hIcon;
> +        psfi->iIcon = temppsfi.iIcon;
> +        psfi->dwAttributes = temppsfi.dwAttributes;
>  
> -    if (psfi)
> -    {
> -        if(flags & SHGFI_ICON)
> -            psfi->hIcon=temppsfi.hIcon;
> -        if(flags & (SHGFI_SYSICONINDEX|SHGFI_ICON|SHGFI_ICONLOCATION))
> -            psfi->iIcon=temppsfi.iIcon;
> -        if(flags & SHGFI_ATTRIBUTES)
> -            psfi->dwAttributes=temppsfi.dwAttributes;
> -        if(flags & (SHGFI_DISPLAYNAME|SHGFI_ICONLOCATION))
> -        {
> -            WideCharToMultiByte(CP_ACP, 0, temppsfi.szDisplayName, -1,
> -                  psfi->szDisplayName, sizeof(psfi->szDisplayName), NULL, 
> NULL);
> -        }
> -        if(flags & SHGFI_TYPENAME)
> -        {
> -            WideCharToMultiByte(CP_ACP, 0, temppsfi.szTypeName, -1,
> -                  psfi->szTypeName, sizeof(psfi->szTypeName), NULL, NULL);
> -        }
> +        WideCharToMultiByte(CP_ACP, 0, temppsfi.szDisplayName, -1,
> +              psfi->szDisplayName, sizeof(psfi->szDisplayName), NULL, NULL);
> +
> +        WideCharToMultiByte(CP_ACP, 0, temppsfi.szTypeName, -1,
> +              psfi->szTypeName, sizeof(psfi->szTypeName), NULL, NULL);
>      }
> +    else
> +        ret = SHGetFileInfoW(pathW, dwFileAttributes, NULL, 0, flags);
>  
>      HeapFree(GetProcessHeap(), 0, temppath);
>  
> 


-- 
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to