/* (C) 2003-2007 Willem Jan Hengeveld * Web: http://www.xs4all.nl/~itsme/ * http://wiki.xda-developers.com/ * * $Id: $ * * this file contains function for expanding %CSIDL_...% in * filenames to the local device's path. * */ #include #include #ifdef WIN32 #include #endif #include #include #include "debug.h" #include "csidlpaths.h" #include "stringutils.h" // 0: \My Documents CSIDL_DESKTOP // 2: \Windows\Menu Démarrer\Programmes CSIDL_PROGRAMS // 5: \My Documents CSIDL_PERSONAL // 6: \Windows\Favoris CSIDL_FAVORITES // 7: \Windows\Démarrage CSIDL_STARTUP // a: \Recycled CSIDL_BITBUCKET // b: \Windows\Menu Démarrer CSIDL_STARTMENU // d: \My Documents\Ma musique CSIDL_MYMUSIC // 11: \ CSIDL_DRIVES // 14: \Windows\Polices CSIDL_FONTS // 1a: \Application Data CSIDL_APPDATA // 24: \Windows CSIDL_WINDOWS // 26: \Program Files CSIDL_PROGRAM_FILES // CSIDL_DESKTOP 0x0000 // // CSIDL_INTERNET 0x0001 // Internet Explorer (icon on desktop) // CSIDL_PROGRAMS 0x0002 // Start Menu\Programs // CSIDL_CONTROLS 0x0003 // My Computer\Control Panel // CSIDL_PRINTERS 0x0004 // My Computer\Printers // CSIDL_PERSONAL 0x0005 // My Documents // CSIDL_FAVORITES 0x0006 // \Favorites // CSIDL_STARTUP 0x0007 // Start Menu\Programs\Startup // CSIDL_RECENT 0x0008 // \Recent // CSIDL_SENDTO 0x0009 // \SendTo // CSIDL_BITBUCKET 0x000a // \Recycle Bin // CSIDL_STARTMENU 0x000b // \Start Menu // CSIDL_MYDOCUMENTS 0x000c // logical "My Documents" desktop icon // CSIDL_MYMUSIC 0x000d // "My Music" folder // CSIDL_MYVIDEO 0x000e // "My Videos" folder // CSIDL_DESKTOPDIRECTORY 0x0010 // \Desktop // CSIDL_DRIVES 0x0011 // My Computer // CSIDL_NETWORK 0x0012 // Network Neighborhood (My Network Places) // CSIDL_NETHOOD 0x0013 // \nethood // CSIDL_FONTS 0x0014 // windows\fonts // CSIDL_TEMPLATES 0x0015 // CSIDL_COMMON_STARTMENU 0x0016 // All Users\Start Menu // CSIDL_COMMON_PROGRAMS 0x0017 // All Users\Start Menu\Programs // CSIDL_COMMON_STARTUP 0x0018 // All Users\Startup // CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 // All Users\Desktop // CSIDL_APPDATA 0x001a // \Application Data // CSIDL_PRINTHOOD 0x001b // \PrintHood // CSIDL_LOCAL_APPDATA 0x001c // \Local Settings\Applicaiton Data (non roaming) // CSIDL_ALTSTARTUP 0x001d // non localized startup // CSIDL_COMMON_ALTSTARTUP 0x001e // non localized common startup // CSIDL_COMMON_FAVORITES 0x001f // CSIDL_INTERNET_CACHE 0x0020 // CSIDL_COOKIES 0x0021 // CSIDL_HISTORY 0x0022 // CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data // CSIDL_WINDOWS 0x0024 // GetWindowsDirectory() // CSIDL_SYSTEM 0x0025 // GetSystemDirectory() // CSIDL_PROGRAM_FILES 0x0026 // C:\Program Files // CSIDL_MYPICTURES 0x0027 // C:\Program Files\My Pictures // CSIDL_PROFILE 0x0028 // USERPROFILE // CSIDL_SYSTEMX86 0x0029 // x86 system directory on RISC // CSIDL_PROGRAM_FILESX86 0x002a // x86 C:\Program Files on RISC // CSIDL_PROGRAM_FILES_COMMON 0x002b // C:\Program Files\Common // CSIDL_PROGRAM_FILES_COMMONX86 0x002c // x86 Program Files\Common on RISC // CSIDL_COMMON_TEMPLATES 0x002d // All Users\Templates // CSIDL_COMMON_DOCUMENTS 0x002e // All Users\Documents // CSIDL_COMMON_ADMINTOOLS 0x002f // All Users\Start Menu\Programs\Administrative Tools // CSIDL_ADMINTOOLS 0x0030 // \Start Menu\Programs\Administrative Tools // CSIDL_CONNECTIONS 0x0031 // Network and Dial-up Connections // CSIDL_COMMON_MUSIC 0x0035 // All Users\My Music // CSIDL_COMMON_PICTURES 0x0036 // All Users\My Pictures // CSIDL_COMMON_VIDEO 0x0037 // All Users\My Video // CSIDL_RESOURCES 0x0038 // %windir%\Resources\, For theme and other windows resources. // CSIDL_RESOURCES_LOCALIZED 0x0039 // %windir%\Resources\, for theme and other windows specific resources. // CSIDL_COMMON_OEM_LINKS 0x003a // Links to All Users OEM specific apps // CSIDL_CDBURN_AREA 0x003b // USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning // CSIDL_COMPUTERSNEARME 0x003d // Computers Near Me (computered from Workgroup membership) class csidl_map { typedef std::map IntToString; typedef std::map StringToInt; public: csidl_map() { #define addname(n) add(n, #n); addname(CSIDL_PROGRAMS) addname(CSIDL_PERSONAL) addname(CSIDL_FAVORITES) addname(CSIDL_STARTUP) addname(CSIDL_RECENT) addname(CSIDL_STARTMENU) addname(CSIDL_DESKTOPDIRECTORY) addname(CSIDL_FONTS) addname(CSIDL_APPDATA) #ifdef WIN32 addname(CSIDL_DESKTOP) addname(CSIDL_INTERNET) addname(CSIDL_CONTROLS) addname(CSIDL_PRINTERS) addname(CSIDL_SENDTO) addname(CSIDL_BITBUCKET) addname(CSIDL_MYDOCUMENTS) addname(CSIDL_MYMUSIC) addname(CSIDL_MYVIDEO) addname(CSIDL_DRIVES) addname(CSIDL_NETWORK) addname(CSIDL_NETHOOD) addname(CSIDL_TEMPLATES) addname(CSIDL_COMMON_STARTMENU) addname(CSIDL_COMMON_PROGRAMS) addname(CSIDL_COMMON_STARTUP) addname(CSIDL_COMMON_DESKTOPDIRECTORY) addname(CSIDL_PRINTHOOD) addname(CSIDL_LOCAL_APPDATA) addname(CSIDL_ALTSTARTUP) addname(CSIDL_COMMON_ALTSTARTUP) addname(CSIDL_COMMON_FAVORITES) addname(CSIDL_INTERNET_CACHE) addname(CSIDL_COOKIES) addname(CSIDL_HISTORY) addname(CSIDL_COMMON_APPDATA) addname(CSIDL_WINDOWS) addname(CSIDL_SYSTEM) addname(CSIDL_PROGRAM_FILES) addname(CSIDL_MYPICTURES) addname(CSIDL_PROFILE) addname(CSIDL_SYSTEMX86) addname(CSIDL_PROGRAM_FILESX86) addname(CSIDL_PROGRAM_FILES_COMMON) addname(CSIDL_PROGRAM_FILES_COMMONX86) addname(CSIDL_COMMON_TEMPLATES) addname(CSIDL_COMMON_DOCUMENTS) addname(CSIDL_COMMON_ADMINTOOLS) addname(CSIDL_ADMINTOOLS) addname(CSIDL_CONNECTIONS) addname(CSIDL_COMMON_MUSIC) addname(CSIDL_COMMON_PICTURES) addname(CSIDL_COMMON_VIDEO) addname(CSIDL_RESOURCES) addname(CSIDL_RESOURCES_LOCALIZED) addname(CSIDL_COMMON_OEM_LINKS) addname(CSIDL_CDBURN_AREA) addname(CSIDL_COMPUTERSNEARME) #endif } void add(int id, const char *name) { _i2s[id]= name; _s2i[name]= id; } std::string id2name(int id) const { IntToString::const_iterator i= _i2s.find(id); if (i!=_i2s.end()) return (*i).second; return ""; } int name2id(const std::string& name) const { StringToInt::const_iterator i= _s2i.find(name); if (i!=_s2i.end()) return (*i).second; return -1; } private: IntToString _i2s; StringToInt _s2i; }; csidl_map csidl_map; std::Wstring expand_csidl(const std::Wstring& path) { size_t ix_pct1= path.find('%'); if (ix_pct1==path.npos) return path; size_t ix_pct2= path.find('%', ix_pct1+1); if (ix_pct2==path.npos) return path; std::Wstring tag= path.substr(ix_pct1+1, ix_pct2-ix_pct1-1); int id= csidl_map.name2id(ToString(tag)); if (id==-1) { debug("WARNING: unknown %%%ls%%\n", tag.c_str()); return path; } WCHAR csidlpath[MAX_PATH+1]; if (!CeGetSpecialFolderPath(id, MAX_PATH, csidlpath)) { ceerror("%%%ls%%", tag.c_str()); return path; } std::Wstring newpath= path; return newpath.replace(ix_pct1, ix_pct2-ix_pct1+1, std::Wstring((WCHAR*)csidlpath)); } void list_csidl_paths() { WCHAR buf[MAX_PATH+1]; for (int id=0 ; id<256 ; id++) { if (CeGetSpecialFolderPath(id, MAX_PATH, buf)) printf("%2x: %-32s %ls\n", id, (std::string("%")+csidl_map.id2name(id)+"%").c_str(), buf); } } void print_csidl_path(const std::string& csidlname) { int id= csidl_map.name2id(csidlname); WCHAR buf[MAX_PATH+1]; if (CeGetSpecialFolderPath(id, MAX_PATH, buf)) printf("%ls\n", buf); }