Changeset 5618 for trunk/src/shell32/shellpath.c
- Timestamp:
- Apr 28, 2001, 3:33:49 PM (24 years ago)
- 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 $ */2 1 /* 3 2 * Path Functions … … 6 5 * 7 6 */ 8 #ifdef __WIN32OS2__9 #define ICOM_CINTERFACE 110 #include <odin.h>11 #endif12 13 7 #include <string.h> 14 8 #include <ctype.h> 15 9 #include "debugtools.h" 10 #include "windef.h" 16 11 #include "winnls.h" 17 12 #include "winreg.h" … … 19 14 #include "shlobj.h" 20 15 #include "shell32_main.h" 21 #include "windef.h"22 #include "options.h"23 #include "wine/winestring.h"24 16 #include "wine/undocshell.h" 25 17 #include "wine/unicode.h" … … 28 20 DEFAULT_DEBUG_CHANNEL(shell); 29 21 30 #define isSlash(x) ((x)=='\\' || (x)=='/')31 22 /* 32 23 ########## Combining and Constructing paths ########## … … 347 338 348 339 for(i=0; lpszExtensions[i]; i++) 340 #ifdef __WIN32OS2__ 349 341 if (!lstrcmpiW(lpszExtension,lpszExtensions[i])) return TRUE; 350 342 #else 343 if (!strcmpiW(lpszExtension,lpszExtensions[i])) return TRUE; 344 #endif 351 345 return FALSE; 352 346 } … … 485 479 486 480 #ifdef __WIN32OS2__ 487 /************************************************************************* 488 * PathYetAnotherMakeUniqueNameA [SHELL32.75] 489 * 490 * NOTES 491 * exported by ordinal 492 */ 481 493 482 BOOL WINAPI PathYetAnotherMakeUniqueNameW( 494 483 LPWSTR lpszBuffer, … … 497 486 LPCWSTR lpszLongName) 498 487 { 499 FIXME(" (%p,%p, %p ,%p):stub.\n",488 FIXME("PathYetAnotherMakeUniqueNameW (%p,%p, %p ,%p):stub.\n", 500 489 lpszBuffer, lpszPathName, lpszShortName, lpszLongName); 501 490 return TRUE; … … 514 503 #endif 515 504 505 516 506 /* 517 507 ########## cleaning and resolving paths ########## … … 531 521 * PathCleanupSpecAW [SHELL32] 532 522 */ 533 DWORD WINAPI PathCleanupSpecAW (LP VOID x, LPVOID y)523 DWORD WINAPI PathCleanupSpecAW (LPCVOID x, LPVOID y) 534 524 { 535 525 FIXME("(%p, %p) stub\n",x,y); … … 668 658 */ 669 659 670 static char * szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; 671 static char * szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"; 660 static const char * const szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; 661 static const char * const szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"; 662 static const char * const szSetup = "Software\\Microsoft\\Windows\\CurrentVersion\\Setup"; 663 static const char * const szCurrentVersion = "Software\\Microsoft\\Windows\\CurrentVersion"; 672 664 #if 0 673 static c har *szEnvUserProfile = "%USERPROFILE%";674 static c har *szEnvSystemRoot = "%SYSTEMROOT%";665 static const char * const szEnvUserProfile = "%USERPROFILE%"; 666 static const char * const szEnvSystemRoot = "%SYSTEMROOT%"; 675 667 #endif 668 669 typedef 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 684 static 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 /**********************************************************************/ 676 941 677 942 BOOL WINAPI SHGetSpecialFolderPathA ( … … 681 946 BOOL bCreate) 682 947 { 683 CHAR szValueName[MAX_PATH], szDefaultPath[MAX_PATH] ;948 CHAR szValueName[MAX_PATH], szDefaultPath[MAX_PATH], szBuildPath[MAX_PATH]; 684 949 HKEY hRootKey, hKey; 685 BOOL bRelative = TRUE;950 DWORD dwFlags; 686 951 DWORD dwType, dwDisp, dwPathLen = MAX_PATH; 952 DWORD folder = csidl & CSIDL_FOLDER_MASK; 953 CHAR *p; 687 954 688 955 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate); 689 956 690 /* build default values */ 691 switch(csidl) 957 if ((folder > CSIDL_CONNECTIONS) || (CSIDL_Data[folder].hRootKey == 0)) 692 958 { 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:815 959 ERR("folder unknown or not allowed\n"); 816 960 return FALSE; 817 961 } 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) 823 963 { 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 } 824 1003 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 830 1015 { 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 { 832 1024 /* value not existing */ 833 if ( bRelative)1025 if (dwFlags & CSIDL_MYFLAG_RELATIVE) 834 1026 { 835 1027 GetWindowsDirectoryA(szPath, MAX_PATH); … … 839 1031 else 840 1032 { 841 strcpy(szPath, "C:\\"); /* fixme??? */1033 strcpy(szPath, "C:\\"); /* FIXME ??? */ 842 1034 strcat(szPath, szDefaultPath); 843 1035 } 844 1036 RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1); 845 1037 } 1038 RegCloseKey(hKey); 846 1039 } 847 RegCloseKey(hKey);848 1040 849 1041 /* expand paths like %USERPROFILE% */ … … 854 1046 } 855 1047 856 /* if we don't care about existing director ys we are ready */1048 /* if we don't care about existing directories we are ready */ 857 1049 if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE; 858 1050 859 1051 if (PathFileExistsA(szPath)) return TRUE; 860 1052 861 /* not existing but we not allowed to create it */1053 /* not existing but we are not allowed to create it */ 862 1054 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) 865 1060 { 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, '\\'); 868 1072 } 869 1073 … … 885 1089 if (SHGetSpecialFolderPathA(hwndOwner, szTemp, csidl, bCreate)) 886 1090 { 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 } 889 1094 890 1095 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate); … … 914 1119 HWND hwndOwner, 915 1120 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 */ 918 1123 LPSTR pszPath) 919 1124 {
Note:
See TracChangeset
for help on using the changeset viewer.