1 /*******************************************************************************
2
3 copyright: Copyright (c) 2007 the Tango team. All rights reserved
4
5 license: BSD style: $(LICENSE)
6
7 version: Initial release: July 2007
8
9 author: Cyborg16, Sean Kelly
10
11 *******************************************************************************/
12
13 module tango.sys.win32.SpecialPath;
14
15 private import tango.text.convert.Utf;
16 private import tango.sys.Common;
17 private import tango.sys.win32.CodePage;
18 private import tango.stdc.stringz;
19
20 pragma(lib, "shell32.lib");
21
22 version(Win32SansUnicode)
23 extern(Windows) int SHGetSpecialFolderPathA(HWND, LPCSTR, int, BOOL);
24 else
25 extern(Windows) int SHGetSpecialFolderPathW(HWND, LPCWSTR, int, BOOL);
26
27 enum
28 {
29 CSIDL_DESKTOP = 0,
30 CSIDL_INTERNET,
31 CSIDL_PROGRAMS,
32 CSIDL_CONTROLS,
33 CSIDL_PRINTERS,
34 CSIDL_PERSONAL,
35 CSIDL_FAVORITES,
36 CSIDL_STARTUP,
37 CSIDL_RECENT,
38 CSIDL_SENDTO,
39 CSIDL_BITBUCKET,
40 CSIDL_STARTMENU, // = 11
41 CSIDL_DESKTOPDIRECTORY = 16,
42 CSIDL_DRIVES,
43 CSIDL_NETWORK,
44 CSIDL_NETHOOD,
45 CSIDL_FONTS,
46 CSIDL_TEMPLATES,
47 CSIDL_COMMON_STARTMENU,
48 CSIDL_COMMON_PROGRAMS,
49 CSIDL_COMMON_STARTUP,
50 CSIDL_COMMON_DESKTOPDIRECTORY,
51 CSIDL_APPDATA,
52 CSIDL_PRINTHOOD,
53 CSIDL_LOCAL_APPDATA,
54 CSIDL_ALTSTARTUP,
55 CSIDL_COMMON_ALTSTARTUP,
56 CSIDL_COMMON_FAVORITES,
57 CSIDL_INTERNET_CACHE,
58 CSIDL_COOKIES,
59 CSIDL_HISTORY,
60 CSIDL_COMMON_APPDATA,
61 CSIDL_WINDOWS,
62 CSIDL_SYSTEM,
63 CSIDL_PROGRAM_FILES,
64 CSIDL_MYPICTURES,
65 CSIDL_PROFILE,
66 CSIDL_SYSTEMX86,
67 CSIDL_PROGRAM_FILESX86,
68 CSIDL_PROGRAM_FILES_COMMON,
69 CSIDL_PROGRAM_FILES_COMMONX86,
70 CSIDL_COMMON_TEMPLATES,
71 CSIDL_COMMON_DOCUMENTS,
72 CSIDL_COMMON_ADMINTOOLS,
73 CSIDL_ADMINTOOLS,
74 CSIDL_CONNECTIONS, // =49
75 CSIDL_COMMON_MUSIC = 53,
76 CSIDL_COMMON_PICTURES,
77 CSIDL_COMMON_VIDEO,
78 CSIDL_RESOURCES,
79 CSIDL_RESOURCES_LOCALIZED,
80 CSIDL_COMMON_OEM_LINKS,
81 CSIDL_CDBURN_AREA, // = 59
82 CSIDL_COMPUTERSNEARME = 61,
83 CSIDL_FLAG_DONT_VERIFY = 0x4000,
84 CSIDL_FLAG_CREATE = 0x8000,
85 CSIDL_FLAG_MASK = 0xFF00
86 }
87
88 /**
89 * Get a special path (on Windows).
90 *
91 * Params:
92 * csidl = Enum of path to get
93 *
94 * Throws:
95 *
96 *
97 * Returns:
98 * A string containing the path
99 */
100 char[] getSpecialPath( int csidl )
101 {
102 version( Win32SansUnicode )
103 {
104 char* spath = (new char[MAX_PATH]).ptr;
105 scope(exit) delete spath;
106
107 if( !SHGetSpecialFolderPathA( null, spath, csidl, true ) )
108 throw new Exception( "getSpecialPath :: " ~ SysError.lastMsg.idup );
109 char[] dpath = new char[MAX_PATH];
110 return CodePage.from(fromStringz(spath), dpath);
111 }
112 else
113 {
114 wchar* spath = (new wchar[MAX_PATH]).ptr;
115 scope(exit) spath.destroy;
116
117 if( !SHGetSpecialFolderPathW( null, spath, csidl, true ) )
118 throw new Exception( "getSpecialPath :: " ~ SysError.lastMsg.idup );
119 return toString(fromString16z(spath));
120 }
121 }