Changeset 3646 for trunk/src


Ignore:
Timestamp:
Jun 1, 2000, 4:01:10 PM (25 years ago)
Author:
sandervl
Message:

fix for open file dialog

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/shlfolder.cpp

    r3306 r3646  
    1 /* $Id: shlfolder.cpp,v 1.13 2000-04-02 15:12:48 cbratschi Exp $ */
     1/* $Id: shlfolder.cpp,v 1.14 2000-06-01 14:01:10 sandervl Exp $ */
    22/*
    33 * Shell Folder stuff
     
    3131#include "shell32_main.h"
    3232#include "shresdef.h"
     33#include "shlwapi.h"
    3334
    3435#include <heapstring.h>
     
    209210
    210211   return hr;
     212}
     213
     214/***********************************************************************
     215 *  SHELL32_GetItemAttributes
     216 *
     217 * NOTES
     218 * observerd values:
     219 *  folder:     0xE0000177      FILESYSTEM | HASSUBFOLDER | FOLDER
     220 *  file:       0x40000177      FILESYSTEM
     221 *  drive:      0xf0000144      FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR
     222 *  mycomputer: 0xb0000154      HASSUBFOLDER | FOLDER | FILESYSANCESTOR
     223 *  (seems to be default for shell extensions if no registry entry exists)
     224 *
     225 * This functions does not set flags!! It only resets flags when nessesary.
     226 */
     227static HRESULT SHELL32_GetItemAttributes(
     228        IShellFolder * psf,
     229        LPITEMIDLIST pidl,
     230        LPDWORD pdwAttributes)
     231{
     232        GUID const * clsid;
     233        DWORD dwAttributes;
     234       
     235        TRACE("0x%08lx\n", *pdwAttributes);
     236
     237        if (*pdwAttributes & (0xcff3fe88))
     238          WARN("attribute 0x%08lx not implemented\n", *pdwAttributes);
     239        *pdwAttributes &= ~SFGAO_LINK; /* FIXME: for native filedialogs */
     240
     241        if (_ILIsDrive(pidl))
     242        {
     243          *pdwAttributes &= 0xf0000144;
     244        }
     245        else if ((clsid=_ILGetGUIDPointer(pidl)))
     246        {
     247          if (HCR_GetFolderAttributes(clsid, &dwAttributes))
     248          {
     249            *pdwAttributes &= dwAttributes;
     250          }
     251          else
     252          {
     253            *pdwAttributes &= 0xb0000154;
     254          }       
     255        }
     256        else if (_ILGetDataPointer(pidl))
     257        {
     258          dwAttributes = _ILGetFileAttributes(pidl, NULL, 0);
     259          *pdwAttributes &= ~SFGAO_FILESYSANCESTOR;
     260
     261          if(( SFGAO_FOLDER & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
     262              *pdwAttributes &= ~(SFGAO_FOLDER|SFGAO_HASSUBFOLDER);
     263
     264          if(( SFGAO_HIDDEN & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_HIDDEN))
     265              *pdwAttributes &= ~SFGAO_HIDDEN;
     266
     267          if(( SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY))
     268              *pdwAttributes &= ~SFGAO_READONLY;
     269        }
     270        else
     271        {
     272          *pdwAttributes &= 0xb0000154;
     273        }
     274        TRACE("-- 0x%08lx\n", *pdwAttributes);
     275        return S_OK;
    211276}
    212277
     
    18561921   if (pchEaten) *pchEaten = 0;          /* strange but like the original */
    18571922
    1858    if (PathIsRootW(lpszDisplayName))
    1859    {
    1860      szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
    1861      WideCharToLocal(szTempA, szElement, lstrlenW(szElement) + 1);
    1862      pidlTemp = _ILCreateDrive(szTempA);
    1863 
    1864      if (szNext && *szNext)
    1865      {
    1866        hr = SHELL32_ParseNextElement(hwndOwner,iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    1867      }
    1868      else
    1869      {
    1870        hr = S_OK;
    1871      }
    1872      *ppidl = pidlTemp;
    1873    }
     1923        /* do we have an absolute path name ? */
     1924        if (PathGetDriveNumberW(lpszDisplayName) >= 0 &&
     1925            lpszDisplayName[2] == (WCHAR)'\\')
     1926        {
     1927          szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
     1928          lstrcpynWtoA(szTempA, szElement, lstrlenW(szElement) + 1);
     1929          pidlTemp = _ILCreateDrive(szTempA);
     1930
     1931          if (szNext && *szNext)
     1932          {
     1933            hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     1934          }
     1935          else
     1936          {
     1937            if (pdwAttributes && *pdwAttributes)
     1938            {
     1939              SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
     1940            }
     1941            hr = S_OK;
     1942          }
     1943          *ppidl = pidlTemp;
     1944        }
    18741945
    18751946   TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
Note: See TracChangeset for help on using the changeset viewer.