Ignore:
Timestamp:
Apr 28, 2001, 3:33:49 PM (24 years ago)
Author:
sandervl
Message:

resync with latest wine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/shellpath.c

    r5461 r5618  
    1 /* $Id: shellpath.c,v 1.4 2001-04-03 18:42:42 sandervl Exp $ */
    21/*
    32 * Path Functions
     
    65 *
    76 */
    8 #ifdef __WIN32OS2__
    9 #define ICOM_CINTERFACE 1
    10 #include <odin.h>
    11 #endif
    12 
    137#include <string.h>
    148#include <ctype.h>
    159#include "debugtools.h"
     10#include "windef.h"
    1611#include "winnls.h"
    1712#include "winreg.h"
     
    1914#include "shlobj.h"
    2015#include "shell32_main.h"
    21 #include "windef.h"
    22 #include "options.h"
    23 #include "wine/winestring.h"
    2416#include "wine/undocshell.h"
    2517#include "wine/unicode.h"
     
    2820DEFAULT_DEBUG_CHANNEL(shell);
    2921
    30 #define isSlash(x) ((x)=='\\' || (x)=='/')
    3122/*
    3223        ########## Combining and Constructing paths ##########
     
    347338
    348339        for(i=0; lpszExtensions[i]; i++)
     340#ifdef __WIN32OS2__
    349341          if (!lstrcmpiW(lpszExtension,lpszExtensions[i])) return TRUE;
    350          
     342#else
     343          if (!strcmpiW(lpszExtension,lpszExtensions[i])) return TRUE;
     344#endif   
    351345        return FALSE;
    352346}
     
    485479
    486480#ifdef __WIN32OS2__
    487 /*************************************************************************
    488  * PathYetAnotherMakeUniqueNameA [SHELL32.75]
    489  *
    490  * NOTES
    491  *     exported by ordinal
    492  */
     481
    493482BOOL WINAPI PathYetAnotherMakeUniqueNameW(
    494483        LPWSTR lpszBuffer,
     
    497486        LPCWSTR lpszLongName)
    498487{
    499     FIXME("(%p,%p, %p ,%p):stub.\n",
     488    FIXME("PathYetAnotherMakeUniqueNameW (%p,%p, %p ,%p):stub.\n",
    500489     lpszBuffer, lpszPathName, lpszShortName, lpszLongName);
    501490    return TRUE;
     
    514503#endif
    515504
     505
    516506/*
    517507        ########## cleaning and resolving paths ##########
     
    531521 * PathCleanupSpecAW    [SHELL32]
    532522 */
    533 DWORD WINAPI PathCleanupSpecAW (LPVOID x, LPVOID y)
     523DWORD WINAPI PathCleanupSpecAW (LPCVOID x, LPVOID y)
    534524{
    535525    FIXME("(%p, %p) stub\n",x,y);
     
    668658 */
    669659 
    670 static char * szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
    671 static char * szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
     660static const char * const szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
     661static const char * const szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
     662static const char * const szSetup = "Software\\Microsoft\\Windows\\CurrentVersion\\Setup";
     663static const char * const szCurrentVersion = "Software\\Microsoft\\Windows\\CurrentVersion";
    672664#if 0
    673 static char * szEnvUserProfile = "%USERPROFILE%";
    674 static char * szEnvSystemRoot = "%SYSTEMROOT%";
     665static const char * const szEnvUserProfile = "%USERPROFILE%";
     666static const char * const szEnvSystemRoot = "%SYSTEMROOT%";
    675667#endif
     668
     669typedef struct
     670{
     671    DWORD dwFlags;
     672    HKEY hRootKey;
     673    LPCSTR szValueName;
     674    LPCSTR szDefaultPath; /* fallback string; sub dir of windows directory */
     675} CSIDL_DATA;
     676
     677#define CSIDL_MYFLAG_SHFOLDER   1
     678#define CSIDL_MYFLAG_SETUP      2
     679#define CSIDL_MYFLAG_CURRVER    4
     680#define CSIDL_MYFLAG_RELATIVE   8
     681
     682#define HKLM HKEY_LOCAL_MACHINE
     683#define HKCU HKEY_CURRENT_USER
     684static const CSIDL_DATA CSIDL_Data[] =
     685{
     686    { /* CSIDL_DESKTOP */
     687        9, HKCU,
     688        "Desktop",
     689        "Desktop"
     690    },
     691    { /* CSIDL_INTERNET (??) */
     692        0, 1, /* FIXME */
     693        NULL,
     694        NULL,
     695    },
     696    { /* CSIDL_PROGRAMS */
     697        9, HKCU,
     698        "Programs",
     699        "Start Menu\\Programs"
     700    },
     701    { /* CSIDL_CONTROLS (.CPL files) */
     702        10, HKLM,
     703        "SysDir",
     704        "SYSTEM"
     705    },
     706    { /* CSIDL_PRINTERS */
     707        10, HKLM,
     708        "SysDir",
     709        "SYSTEM"
     710    },
     711    { /* CSIDL_PERSONAL */
     712        1, HKCU,
     713        "Personal",
     714        "My Documents"
     715    },
     716    { /* CSIDL_FAVORITES */
     717        9, HKCU,
     718        "Favorites",
     719        "Favorites"
     720    },
     721    { /* CSIDL_STARTUP */
     722        9, HKCU,
     723        "StartUp",
     724        "Start Menu\\Programs\\StartUp"
     725    },
     726    { /* CSIDL_RECENT */
     727        9, HKCU,
     728        "Recent",
     729        "Recent"
     730    },
     731    { /* CSIDL_SENDTO */
     732        9, HKCU,
     733        "SendTo",
     734        "SendTo"
     735    },
     736    { /* CSIDL_BITBUCKET (is this c:\recycled ?) */
     737        0, 1, /* FIXME */
     738        NULL,
     739        "recycled"
     740    },
     741    { /* CSIDL_STARTMENU */
     742        9, HKCU,
     743        "Start Menu",
     744        "Start Menu"
     745    },
     746    { /* not known */
     747        0, 0,
     748        NULL,
     749        NULL,
     750    },
     751    { /* not known */
     752        0, 0,
     753        NULL,
     754        NULL,
     755    },
     756    { /* not known */
     757        0, 0,
     758        NULL,
     759        NULL,
     760    },
     761    { /* not known */
     762        0, 0,
     763        NULL,
     764        NULL,
     765    },
     766    { /* CSIDL_DESKTOPDIRECTORY */
     767        9, HKCU,
     768        "Desktop",
     769        "Desktop"
     770    },
     771    { /* CSIDL_DRIVES */
     772        0, 1, /* FIXME */
     773        NULL,
     774        "My Computer"
     775    },
     776    { /* CSIDL_NETWORK */
     777        0, 1, /* FIXME */
     778        NULL,
     779        "Network Neighborhood"
     780    },
     781    { /* CSIDL_NETHOOD */
     782        9, HKCU,
     783        "NetHood",
     784        "NetHood"
     785    },
     786    { /* CSIDL_FONTS */
     787        9, HKCU,
     788        "Fonts",
     789        "Fonts"
     790    },
     791    { /* CSIDL_TEMPLATES */
     792        9, HKCU,
     793        "Templates",
     794        "ShellNew"
     795    },
     796    { /* CSIDL_COMMON_STARTMENU */
     797        9, HKLM,
     798        "Common Start Menu",
     799        "Start Menu"
     800    },
     801    { /* CSIDL_COMMON_PROGRAMS */
     802        9, HKLM,
     803        "Common Programs",
     804        ""
     805    },
     806    { /* CSIDL_COMMON_STARTUP */
     807        9, HKLM,
     808        "Common StartUp",
     809        "All Users\\Start Menu\\Programs\\StartUp"
     810    },
     811    { /* CSIDL_COMMON_DESKTOPDIRECTORY */
     812        9, HKLM,
     813        "Common Desktop",
     814        "Desktop"
     815    },
     816    { /* CSIDL_APPDATA */
     817        9, HKCU,
     818        "AppData",
     819        "Application Data"
     820    },
     821    { /* CSIDL_PRINTHOOD */
     822        9, HKCU,
     823        "PrintHood",
     824        "PrintHood"
     825    },
     826    { /* not known */
     827        0, 0,
     828        NULL,
     829        NULL,
     830    },
     831    { /* CSIDL_ALTSTARTUP */
     832        0, 1, /* FIXME */
     833        NULL,
     834        NULL
     835    },
     836    { /* CSIDL_COMMON_ALTSTARTUP */
     837        0, 1, /* FIXME */
     838        NULL,
     839        NULL
     840    },
     841    { /* CSIDL_COMMON_FAVORITES */
     842        9, HKCU,
     843        "Favorites",
     844        "Favorites"
     845    },
     846    { /* CSIDL_INTERNET_CACHE */
     847        9, HKCU,
     848        "Cache",
     849        "Temporary Internet Files"
     850    },
     851    { /* CSIDL_COOKIES */
     852        9, HKCU,
     853        "Cookies",
     854        "Cookies"
     855    },
     856    { /* CSIDL_HISTORY */
     857        9, HKCU,
     858        "History",
     859        "History"
     860    },
     861    { /* CSIDL_COMMON_APPDATA */
     862        9, HKLM,
     863        "Common AppData",
     864        "All Users\\Application Data"
     865    },
     866    { /* CSIDL_WINDOWS */
     867        2, HKLM,
     868        "WinDir",
     869        "Windows"
     870    },
     871    { /* CSIDL_SYSTEM */
     872        10, HKLM,
     873        "SysDir",
     874        "SYSTEM"
     875    },
     876    { /* CSIDL_PROGRAM_FILES */
     877        4, HKLM,
     878        "ProgramFilesDir",
     879        "Program Files"
     880    },
     881    { /* CSIDL_MYPICTURES */
     882        1, HKCU,
     883        "My Pictures",
     884        "My Documents\\My Pictures"
     885    },
     886    { /* CSIDL_PROFILE */
     887        10, HKLM,
     888        "WinDir", /* correct ? */
     889        ""
     890    },
     891    { /* CSIDL_SYSTEMX86 */
     892        10, HKLM,
     893        "SysDir",
     894        "SYSTEM"
     895    },
     896    { /* CSIDL_PROGRAM_FILESX86 */
     897        4, HKLM,
     898        "ProgramFilesDir",
     899        "Program Files"
     900    },
     901    { /* CSIDL_PROGRAM_FILES_COMMON */
     902        4, HKLM,
     903        "CommonFilesDir",
     904        "Program Files\\Common Files" /* ? */
     905    },
     906    { /* CSIDL_PROGRAM_FILES_COMMONX86 */
     907        4, HKLM,
     908        "CommonFilesDir",
     909        "Program Files\\Common Files" /* ? */
     910    },
     911    { /* CSIDL_COMMON_TEMPLATES */
     912        0, 1, /* FIXME */
     913        NULL,
     914        NULL
     915    },
     916    { /* CSIDL_COMMON_DOCUMENTS */
     917        0, 1, /* FIXME */
     918        NULL,
     919        NULL
     920    },
     921    { /* CSIDL_COMMON_ADMINTOOLS */
     922        0, 1, /* FIXME */
     923        NULL,
     924        NULL
     925    },
     926    { /* CSIDL_ADMINTOOLS */
     927        9, HKCU,
     928        "Administrative Tools",
     929        "Start Menu\\Programs\\Administrative Tools"
     930    },
     931    { /* CSIDL_CONNECTIONS */
     932        0, 1, /* FIXME */
     933        NULL,
     934        NULL
     935    }
     936};
     937#undef HKCU
     938#undef HKLM
     939
     940/**********************************************************************/
    676941
    677942BOOL WINAPI SHGetSpecialFolderPathA (
     
    681946        BOOL bCreate)
    682947{
    683         CHAR    szValueName[MAX_PATH], szDefaultPath[MAX_PATH];
     948        CHAR    szValueName[MAX_PATH], szDefaultPath[MAX_PATH], szBuildPath[MAX_PATH];
    684949        HKEY    hRootKey, hKey;
    685         BOOL    bRelative = TRUE;
     950        DWORD   dwFlags;
    686951        DWORD   dwType, dwDisp, dwPathLen = MAX_PATH;
     952        DWORD   folder = csidl & CSIDL_FOLDER_MASK;
     953        CHAR    *p;
    687954
    688955        TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
    689956
    690         /* build default values */
    691         switch(csidl)
     957        if ((folder > CSIDL_CONNECTIONS) || (CSIDL_Data[folder].hRootKey == 0))
    692958        {
    693           case CSIDL_APPDATA:
    694             hRootKey = HKEY_CURRENT_USER;
    695             strcpy (szValueName, "AppData");
    696             strcpy (szDefaultPath, "AppData");
    697             break;
    698 
    699           case CSIDL_COOKIES:
    700             hRootKey = HKEY_CURRENT_USER;
    701             strcpy (szValueName, "Cookies");
    702             strcpy(szDefaultPath, "Cookies");
    703             break;
    704 
    705           case CSIDL_DESKTOPDIRECTORY:
    706             hRootKey = HKEY_CURRENT_USER;
    707             strcpy(szValueName, "Desktop");
    708             strcpy(szDefaultPath, "Desktop");
    709             break;
    710 
    711           case CSIDL_COMMON_DESKTOPDIRECTORY:
    712             hRootKey = HKEY_LOCAL_MACHINE;
    713             strcpy(szValueName, "Common Desktop");
    714             strcpy(szDefaultPath, "Desktop");
    715             break;
    716 
    717           case CSIDL_FAVORITES:
    718             hRootKey = HKEY_CURRENT_USER;
    719             strcpy(szValueName, "Favorites");
    720             strcpy(szDefaultPath, "Favorites");
    721             break;
    722 
    723           case CSIDL_FONTS:
    724             hRootKey = HKEY_CURRENT_USER;
    725             strcpy(szValueName, "Fonts");
    726             strcpy(szDefaultPath, "Fonts");
    727             break;
    728 
    729           case CSIDL_HISTORY:
    730             hRootKey = HKEY_CURRENT_USER;
    731             strcpy(szValueName, "History");
    732             strcpy(szDefaultPath, "History");
    733             break;
    734 
    735           case CSIDL_NETHOOD:
    736             hRootKey = HKEY_CURRENT_USER;
    737             strcpy(szValueName, "NetHood");
    738             strcpy(szDefaultPath, "NetHood");
    739             break;
    740 
    741           case CSIDL_INTERNET_CACHE:
    742             hRootKey = HKEY_CURRENT_USER;
    743             strcpy(szValueName, "Cache");
    744             strcpy(szDefaultPath, "Temporary Internet Files");
    745             break;
    746 
    747           case CSIDL_PERSONAL:
    748             hRootKey = HKEY_CURRENT_USER;
    749             strcpy(szValueName, "Personal");
    750             strcpy(szDefaultPath, "My Own Files");
    751             bRelative = FALSE;
    752             break;
    753 
    754           case CSIDL_PRINTHOOD:
    755             hRootKey = HKEY_CURRENT_USER;
    756             strcpy(szValueName, "PrintHood");
    757             strcpy(szDefaultPath, "PrintHood");
    758             break;
    759 
    760           case CSIDL_PROGRAMS:
    761             hRootKey = HKEY_CURRENT_USER;
    762             strcpy(szValueName, "Programs");
    763             strcpy(szDefaultPath, "Start Menu\\Programs");
    764             break;
    765 
    766           case CSIDL_COMMON_PROGRAMS:
    767             hRootKey = HKEY_LOCAL_MACHINE;
    768             strcpy(szValueName, "Common Programs");
    769             strcpy(szDefaultPath, "");
    770             break;
    771 
    772           case CSIDL_RECENT:
    773             hRootKey = HKEY_CURRENT_USER;
    774             strcpy(szValueName, "Recent");
    775             strcpy(szDefaultPath, "Recent");
    776             break;
    777 
    778           case CSIDL_SENDTO:
    779             hRootKey = HKEY_CURRENT_USER;
    780             strcpy(szValueName, "SendTo");
    781             strcpy(szDefaultPath, "SendTo");
    782             break;
    783 
    784           case CSIDL_STARTMENU:
    785             hRootKey = HKEY_CURRENT_USER;
    786             strcpy(szValueName, "Start Menu");
    787             strcpy(szDefaultPath, "Start Menu");
    788             break;
    789 
    790           case CSIDL_COMMON_STARTMENU:
    791             hRootKey = HKEY_LOCAL_MACHINE;
    792             strcpy(szValueName, "Common Start Menu");
    793             strcpy(szDefaultPath, "Start Menu");
    794             break;
    795 
    796           case CSIDL_STARTUP:
    797             hRootKey = HKEY_CURRENT_USER;
    798             strcpy(szValueName, "StartUp");
    799             strcpy(szDefaultPath, "Start Menu\\Programs\\StartUp");
    800             break;
    801 
    802           case CSIDL_COMMON_STARTUP:
    803             hRootKey = HKEY_LOCAL_MACHINE;
    804             strcpy(szValueName, "Common StartUp");
    805             strcpy(szDefaultPath, "Start Menu\\Programs\\StartUp");
    806             break;
    807 
    808           case CSIDL_TEMPLATES:
    809             hRootKey = HKEY_CURRENT_USER;
    810             strcpy(szValueName, "Templates");
    811             strcpy(szDefaultPath, "ShellNew");
    812             break;
    813 
    814           default:
    815959            ERR("folder unknown or not allowed\n");
    816960            return FALSE;
    817961        }
    818 
    819         /* user shell folders */
    820         if (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
    821 
    822         if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
     962        if (CSIDL_Data[folder].hRootKey == 1)
    823963        {
     964            FIXME("folder unknown, please add.\n");
     965            return FALSE;
     966        }
     967
     968        dwFlags = CSIDL_Data[folder].dwFlags;
     969        hRootKey = CSIDL_Data[folder].hRootKey;
     970        strcpy(szValueName, CSIDL_Data[folder].szValueName);
     971        strcpy(szDefaultPath, CSIDL_Data[folder].szDefaultPath);
     972
     973        if (dwFlags & CSIDL_MYFLAG_SHFOLDER)
     974        {
     975          /*   user shell folders */
     976          if   (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
     977
     978          if   (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
     979          {
     980            RegCloseKey(hKey);
     981
     982            /* shell folders */
     983            if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
     984
     985            if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
     986            {
     987
     988              /* value not existing */
     989              if (dwFlags & CSIDL_MYFLAG_RELATIVE)
     990              {
     991                GetWindowsDirectoryA(szPath, MAX_PATH);
     992                PathAddBackslashA(szPath);
     993                strcat(szPath, szDefaultPath);
     994              }
     995              else
     996              {
     997                strcpy(szPath, "C:\\"); /* FIXME ??? */
     998                strcat(szPath, szDefaultPath);
     999              }
     1000              RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
     1001            }
     1002          }
    8241003          RegCloseKey(hKey);
    825 
    826           /* shell folders */
    827           if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
    828 
    829           if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
     1004        }
     1005        else
     1006        {
     1007          LPCSTR pRegPath;
     1008
     1009          if (dwFlags & CSIDL_MYFLAG_SETUP)
     1010            pRegPath = szSetup;
     1011          else
     1012          if (dwFlags & CSIDL_MYFLAG_CURRVER)
     1013            pRegPath = szCurrentVersion;
     1014          else
    8301015          {
    831 
     1016            ERR("folder settings broken, please correct !\n");
     1017            return FALSE;
     1018          }
     1019
     1020          if   (RegCreateKeyExA(hRootKey,pRegPath,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
     1021
     1022          if   (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
     1023          {
    8321024            /* value not existing */
    833             if (bRelative)
     1025            if (dwFlags & CSIDL_MYFLAG_RELATIVE)
    8341026            {
    8351027              GetWindowsDirectoryA(szPath, MAX_PATH);
     
    8391031            else
    8401032            {
    841               strcpy(szPath, "C:\\");   /* fixme ??? */
     1033              strcpy(szPath, "C:\\");   /* FIXME ??? */
    8421034              strcat(szPath, szDefaultPath);
    8431035            }
    8441036            RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
    8451037          }
     1038          RegCloseKey(hKey);
    8461039        }
    847         RegCloseKey(hKey);
    8481040
    8491041        /* expand paths like %USERPROFILE% */
     
    8541046        }
    8551047
    856         /* if we don't care about existing directorys we are ready */
     1048        /* if we don't care about existing directories we are ready */
    8571049        if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE;
    8581050
    8591051        if (PathFileExistsA(szPath)) return TRUE;
    8601052
    861         /* not existing but we not allowed to create it */
     1053        /* not existing but we are not allowed to create it */
    8621054        if (!bCreate) return FALSE;
    863        
    864         if (!CreateDirectoryA(szPath,NULL))
     1055
     1056        /* create directory/directories */
     1057        strcpy(szBuildPath, szPath);
     1058        p = strchr(szBuildPath, '\\');
     1059        while (p)
    8651060        {
    866           ERR("Failed to create directory '%s'.\n", szPath);
    867           return FALSE;
     1061            *p = 0;
     1062            if (!PathFileExistsA(szBuildPath))
     1063            {
     1064                if (!CreateDirectoryA(szBuildPath,NULL))
     1065                {
     1066                    ERR("Failed to create directory '%s'.\n", szPath);
     1067                    return FALSE;
     1068                }
     1069            }
     1070            *p = '\\';
     1071            p = strchr(p+1, '\\');
    8681072        }
    8691073
     
    8851089        if (SHGetSpecialFolderPathA(hwndOwner, szTemp, csidl, bCreate))
    8861090        {
    887           lstrcpynAtoW(szPath, szTemp, MAX_PATH);
    888         }
     1091            if (!MultiByteToWideChar( CP_ACP, 0, szTemp, -1, szPath, MAX_PATH ))
     1092                szPath[MAX_PATH-1] = 0;
     1093        }
    8891094
    8901095        TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
     
    9141119        HWND hwndOwner,
    9151120        int nFolder,
    916         HANDLE hToken,  /* FIXME: get paths for specific user */
    917         DWORD dwFlags,  /* FIXME: SHGFP_TYPE_CURRENT|SHGFP_TYPE_DEFAULT */
     1121        HANDLE hToken,  /* [in] FIXME: get paths for specific user */
     1122        DWORD dwFlags,  /* [in] FIXME: SHGFP_TYPE_CURRENT|SHGFP_TYPE_DEFAULT */
    9181123        LPSTR pszPath)
    9191124{
Note: See TracChangeset for help on using the changeset viewer.