blob: 15c55bfbf23db12cd51b86bf0fad9f3423e36bbd [file] [log] [blame]
Juergen Schmiedbcd05e91998-11-25 16:47:05 +00001/*
2 * Path Functions
3 *
4 * Many of this functions are in SHLWAPI.DLL also
5 *
6 */
Juergen Schmiedbcd05e91998-11-25 16:47:05 +00007#include <string.h>
8#include <ctype.h>
Alexandre Julliarda099a551999-06-12 15:45:58 +00009#include "debugtools.h"
Alexandre Julliard24a62ab2000-11-28 22:40:56 +000010#include "windef.h"
Juergen Schmiedbcd05e91998-11-25 16:47:05 +000011#include "winnls.h"
Juergen Schmied8ddda031999-07-25 12:23:15 +000012#include "winreg.h"
Juergen Schmiedba28ba11999-01-23 14:12:48 +000013
14#include "shlobj.h"
Juergen Schmiedbcd05e91998-11-25 16:47:05 +000015#include "shell32_main.h"
Juergen Schmied51c74d82000-04-28 20:23:46 +000016#include "wine/undocshell.h"
Alexandre Julliard5ea22472000-06-13 01:10:29 +000017#include "wine/unicode.h"
Juergen Schmied51c74d82000-04-28 20:23:46 +000018#include "shlwapi.h"
Juergen Schmiedbcd05e91998-11-25 16:47:05 +000019
Alexandre Julliard5ea22472000-06-13 01:10:29 +000020DEFAULT_DEBUG_CHANNEL(shell);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000021
Juergen Schmied1dbf403d2000-06-24 12:56:08 +000022#define isSlash(x) ((x)=='\\' || (x)=='/')
Juergen Schmied51c74d82000-04-28 20:23:46 +000023/*
Juergen Schmied1dbf403d2000-06-24 12:56:08 +000024 ########## Combining and Constructing paths ##########
Juergen Schmied51c74d82000-04-28 20:23:46 +000025*/
Alexandre Julliard3712c462000-02-20 18:43:44 +000026
Juergen Schmiedbcd05e91998-11-25 16:47:05 +000027/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +000028 * PathAppendAW [SHELL32.36]
29 */
Juergen Schmied1dbf403d2000-06-24 12:56:08 +000030BOOL WINAPI PathAppendAW(
Juergen Schmied51c74d82000-04-28 20:23:46 +000031 LPVOID lpszPath1,
32 LPCVOID lpszPath2)
33{
Alexandre Julliardd586dc92000-08-14 14:35:01 +000034 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +000035 return PathAppendW(lpszPath1, lpszPath2);
36 return PathAppendA(lpszPath1, lpszPath2);
37}
38
39/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +000040 * PathCombineAW [SHELL32.37]
Juergen Schmiedbcd05e91998-11-25 16:47:05 +000041 */
Juergen Schmied51c74d82000-04-28 20:23:46 +000042LPVOID WINAPI PathCombineAW(
43 LPVOID szDest,
44 LPCVOID lpszDir,
45 LPCVOID lpszFile)
46{
Alexandre Julliardd586dc92000-08-14 14:35:01 +000047 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +000048 return PathCombineW( szDest, lpszDir, lpszFile );
49 return PathCombineA( szDest, lpszDir, lpszFile );
Juergen Schmiedbcd05e91998-11-25 16:47:05 +000050}
51
52/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +000053 * PathAddBackslashAW [SHELL32.32]
54 */
55LPVOID WINAPI PathAddBackslashAW(LPVOID lpszPath)
56{
Alexandre Julliardd586dc92000-08-14 14:35:01 +000057 if(SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +000058 return PathAddBackslashW(lpszPath);
59 return PathAddBackslashA(lpszPath);
60}
61
62/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +000063 * PathBuildRootAW [SHELL32.30]
64 */
65LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive)
66{
Alexandre Julliardd586dc92000-08-14 14:35:01 +000067 if(SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +000068 return PathBuildRootW(lpszPath, drive);
69 return PathBuildRootA(lpszPath, drive);
70}
71
72/*
73 Extracting Component Parts
74*/
75
76/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +000077 * PathFindFileNameAW [SHELL32.34]
78 */
79LPVOID WINAPI PathFindFileNameAW(LPCVOID lpszPath)
80{
Alexandre Julliardd586dc92000-08-14 14:35:01 +000081 if(SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +000082 return PathFindFileNameW(lpszPath);
83 return PathFindFileNameA(lpszPath);
84}
85
86/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +000087 * PathFindExtensionAW [SHELL32.31]
88 */
89LPVOID WINAPI PathFindExtensionAW(LPCVOID lpszPath)
90{
Alexandre Julliardd586dc92000-08-14 14:35:01 +000091 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +000092 return PathFindExtensionW(lpszPath);
93 return PathFindExtensionA(lpszPath);
94
95}
96
97/*************************************************************************
Alexandre Julliardd586dc92000-08-14 14:35:01 +000098 * PathGetExtensionA [internal]
99 *
100 * NOTES
101 * exported by ordinal
102 * return value points to the first char after the dot
103 */
104static LPSTR PathGetExtensionA(LPCSTR lpszPath)
105{
106 TRACE("(%s)\n",lpszPath);
107
108 lpszPath = PathFindExtensionA(lpszPath);
109 return (LPSTR)(*lpszPath?(lpszPath+1):lpszPath);
110}
111
112/*************************************************************************
113 * PathGetExtensionW [internal]
114 */
115static LPWSTR PathGetExtensionW(LPCWSTR lpszPath)
116{
117 TRACE("(%s)\n",debugstr_w(lpszPath));
118
119 lpszPath = PathFindExtensionW(lpszPath);
120 return (LPWSTR)(*lpszPath?(lpszPath+1):lpszPath);
121}
122
123/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000124 * PathGetExtensionAW [SHELL32.158]
125 */
126LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath)
127{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000128 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000129 return PathGetExtensionW(lpszPath);
130 return PathGetExtensionA(lpszPath);
131}
132
133/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000134 * PathGetArgsAW [SHELL32.52]
135 */
136LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath)
137{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000138 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000139 return PathGetArgsW(lpszPath);
140 return PathGetArgsA(lpszPath);
141}
142
143/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000144 * PathGetDriveNumber [SHELL32.57]
145 */
146int WINAPI PathGetDriveNumberAW(LPVOID lpszPath)
147{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000148 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000149 return PathGetDriveNumberW(lpszPath);
150 return PathGetDriveNumberA(lpszPath);
151}
152
153/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000154 * PathRemoveFileSpec [SHELL32.35]
155 */
156BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath)
157{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000158 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000159 return PathRemoveFileSpecW(lpszPath);
160 return PathRemoveFileSpecA(lpszPath);
161}
162
163/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000164 * PathStripPathAW [SHELL32.38]
165 */
166void WINAPI PathStripPathAW(LPVOID lpszPath)
167{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000168 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000169 return PathStripPathW(lpszPath);
170 return PathStripPathA(lpszPath);
171}
172
173/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000174 * PathStripToRootAW [SHELL32.50]
175 */
176BOOL WINAPI PathStripToRootAW(LPVOID lpszPath)
177{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000178 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000179 return PathStripToRootW(lpszPath);
180 return PathStripToRootA(lpszPath);
181}
182
183/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000184 * PathRemoveArgsAW [SHELL32.251]
185 */
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000186void WINAPI PathRemoveArgsAW(LPVOID lpszPath)
Juergen Schmied51c74d82000-04-28 20:23:46 +0000187{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000188 if (SHELL_OsIsUnicode())
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000189 PathRemoveArgsW(lpszPath);
190 PathRemoveArgsA(lpszPath);
Juergen Schmied51c74d82000-04-28 20:23:46 +0000191}
192
193/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000194 * PathRemoveExtensionAW [SHELL32.250]
195 */
196void WINAPI PathRemoveExtensionAW(LPVOID lpszPath)
197{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000198 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000199 return PathRemoveExtensionW(lpszPath);
200 return PathRemoveExtensionA(lpszPath);
201}
202
Juergen Schmied51c74d82000-04-28 20:23:46 +0000203
204/*
205 Path Manipulations
206*/
207
208/*************************************************************************
209 * PathGetShortPathA [internal]
210 */
211LPSTR WINAPI PathGetShortPathA(LPSTR lpszPath)
212{
213 FIXME("%s stub\n", lpszPath);
214 return NULL;
215}
216
217/*************************************************************************
218 * PathGetShortPathW [internal]
219 */
220LPWSTR WINAPI PathGetShortPathW(LPWSTR lpszPath)
221{
222 FIXME("%s stub\n", debugstr_w(lpszPath));
223 return NULL;
224}
225
226/*************************************************************************
227 * PathGetShortPathAW [SHELL32.92]
228 */
229LPVOID WINAPI PathGetShortPathAW(LPVOID lpszPath)
230{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000231 if(SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000232 return PathGetShortPathW(lpszPath);
233 return PathGetShortPathA(lpszPath);
234}
235
236/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000237 * PathRemoveBlanksAW [SHELL32.33]
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000238 */
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000239void WINAPI PathRemoveBlanksAW(LPVOID str)
Juergen Schmied51c74d82000-04-28 20:23:46 +0000240{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000241 if(SHELL_OsIsUnicode())
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000242 PathRemoveBlanksW(str);
243 PathRemoveBlanksA(str);
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000244}
245
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000246/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000247 * PathQuoteSpacesAW [SHELL32.55]
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000248 */
Juergen Schmied13d74c52000-06-13 03:45:52 +0000249LPVOID WINAPI PathQuoteSpacesAW (LPVOID lpszPath)
Juergen Schmied51c74d82000-04-28 20:23:46 +0000250{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000251 if(SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000252 return PathQuoteSpacesW(lpszPath);
253 return PathQuoteSpacesA(lpszPath);
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000254}
255
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000256/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000257 * PathUnquoteSpacesAW [SHELL32.56]
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000258 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000259VOID WINAPI PathUnquoteSpacesAW(LPVOID str)
Juergen Schmied6d17c612000-01-04 00:33:56 +0000260{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000261 if(SHELL_OsIsUnicode())
Alexandre Julliarda3960291999-02-26 11:11:13 +0000262 PathUnquoteSpacesW(str);
Juergen Schmied6d17c612000-01-04 00:33:56 +0000263 else
264 PathUnquoteSpacesA(str);
Juergen Schmiedafb1d2e1999-01-03 12:35:52 +0000265}
266
Patrik Stridvall54fe8382000-04-06 20:21:16 +0000267/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000268 * PathParseIconLocationAW [SHELL32.249]
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000269 */
Juergen Schmied51c74d82000-04-28 20:23:46 +0000270int WINAPI PathParseIconLocationAW (LPVOID lpszPath)
Patrik Stridvall54fe8382000-04-06 20:21:16 +0000271{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000272 if(SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000273 return PathParseIconLocationW(lpszPath);
274 return PathParseIconLocationA(lpszPath);
275}
276
277/*
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000278 ########## Path Testing ##########
Juergen Schmied51c74d82000-04-28 20:23:46 +0000279*/
280/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000281 * PathIsUNCAW [SHELL32.39]
282 */
283BOOL WINAPI PathIsUNCAW (LPCVOID lpszPath)
284{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000285 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000286 return PathIsUNCW( lpszPath );
287 return PathIsUNCA( lpszPath );
288}
289
290/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000291 * PathIsRelativeAW [SHELL32.40]
292 */
293BOOL WINAPI PathIsRelativeAW (LPCVOID lpszPath)
294{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000295 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000296 return PathIsRelativeW( lpszPath );
297 return PathIsRelativeA( lpszPath );
298}
299
300/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000301 * PathIsRootAW [SHELL32.29]
302 */
303BOOL WINAPI PathIsRootAW(LPCVOID lpszPath)
304{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000305 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000306 return PathIsRootW(lpszPath);
307 return PathIsRootA(lpszPath);
308}
309
310/*************************************************************************
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000311 * PathIsExeA [internal]
312 */
313static BOOL PathIsExeA (LPCSTR lpszPath)
314{
315 LPCSTR lpszExtension = PathGetExtensionA(lpszPath);
316 int i = 0;
317 static char * lpszExtensions[6] = {"exe", "com", "pid", "cmd", "bat", NULL };
318
319 TRACE("path=%s\n",lpszPath);
320
321 for(i=0; lpszExtensions[i]; i++)
322 if (!strcasecmp(lpszExtension,lpszExtensions[i])) return TRUE;
323
324 return FALSE;
325}
326
327/*************************************************************************
328 * PathIsExeW [internal]
329 */
330static BOOL PathIsExeW (LPCWSTR lpszPath)
331{
332 LPCWSTR lpszExtension = PathGetExtensionW(lpszPath);
333 int i = 0;
334 static WCHAR lpszExtensions[6][4] =
335 {{'e','x','e','\0'}, {'c','o','m','\0'}, {'p','i','d','\0'},
336 {'c','m','d','\0'}, {'b','a','t','\0'}, {'\0'} };
337
338 TRACE("path=%s\n",debugstr_w(lpszPath));
339
340 for(i=0; lpszExtensions[i]; i++)
341 if (!strcmpiW(lpszExtension,lpszExtensions[i])) return TRUE;
342
343 return FALSE;
344}
345
346/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000347 * PathIsExeAW [SHELL32.43]
348 */
349BOOL WINAPI PathIsExeAW (LPCVOID path)
350{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000351 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000352 return PathIsExeW (path);
353 return PathIsExeA(path);
354}
355
356/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000357 * PathIsDirectoryAW [SHELL32.159]
358 */
359BOOL WINAPI PathIsDirectoryAW (LPCVOID lpszPath)
360{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000361 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000362 return PathIsDirectoryW (lpszPath);
363 return PathIsDirectoryA (lpszPath);
364}
365
366/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000367 * PathFileExistsAW [SHELL32.45]
368 */
369BOOL WINAPI PathFileExistsAW (LPCVOID lpszPath)
370{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000371 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000372 return PathFileExistsW (lpszPath);
373 return PathFileExistsA (lpszPath);
374}
375
376/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000377 * PathMatchSpecAW [SHELL32.46]
378 */
379BOOL WINAPI PathMatchSpecAW(LPVOID name, LPVOID mask)
380{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000381 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000382 return PathMatchSpecW( name, mask );
383 return PathMatchSpecA( name, mask );
384}
385
386/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000387 * PathIsSameRootAW [SHELL32.650]
388 */
389BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2)
390{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000391 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000392 return PathIsSameRootW(lpszPath1, lpszPath2);
393 return PathIsSameRootA(lpszPath1, lpszPath2);
394}
395
396/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000397 * IsLFNDriveA [SHELL32.119]
398 *
399 * NOTES
400 * exported by ordinal Name
401 */
402BOOL WINAPI IsLFNDriveA(LPCSTR lpszPath)
403{
404 DWORD fnlen;
405
406 if (!GetVolumeInformationA(lpszPath,NULL,0,NULL,&fnlen,NULL,NULL,0))
407 return FALSE;
408 return fnlen>12;
409}
410
411/*
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000412 ########## Creating Something Unique ##########
Juergen Schmied51c74d82000-04-28 20:23:46 +0000413*/
414/*************************************************************************
415 * PathMakeUniqueNameA [internal]
416 */
417BOOL WINAPI PathMakeUniqueNameA(
418 LPSTR lpszBuffer,
419 DWORD dwBuffSize,
420 LPCSTR lpszShortName,
421 LPCSTR lpszLongName,
422 LPCSTR lpszPathName)
423{
424 FIXME("%p %lu %s %s %s stub\n",
425 lpszBuffer, dwBuffSize, debugstr_a(lpszShortName),
426 debugstr_a(lpszLongName), debugstr_a(lpszPathName));
427 return TRUE;
428}
429
430/*************************************************************************
431 * PathMakeUniqueNameW [internal]
432 */
433BOOL WINAPI PathMakeUniqueNameW(
434 LPWSTR lpszBuffer,
435 DWORD dwBuffSize,
436 LPCWSTR lpszShortName,
437 LPCWSTR lpszLongName,
438 LPCWSTR lpszPathName)
439{
440 FIXME("%p %lu %s %s %s stub\n",
441 lpszBuffer, dwBuffSize, debugstr_w(lpszShortName),
442 debugstr_w(lpszLongName), debugstr_w(lpszPathName));
443 return TRUE;
444}
445
446/*************************************************************************
447 * PathMakeUniqueNameAW [SHELL32.47]
448 */
449BOOL WINAPI PathMakeUniqueNameAW(
450 LPVOID lpszBuffer,
451 DWORD dwBuffSize,
452 LPCVOID lpszShortName,
453 LPCVOID lpszLongName,
454 LPCVOID lpszPathName)
455{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000456 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000457 return PathMakeUniqueNameW(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
458 return PathMakeUniqueNameA(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName);
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000459}
460
461/*************************************************************************
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000462 * PathYetAnotherMakeUniqueNameA [SHELL32.75]
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000463 *
464 * NOTES
465 * exported by ordinal
466 */
Juergen Schmied51c74d82000-04-28 20:23:46 +0000467BOOL WINAPI PathYetAnotherMakeUniqueNameA(
468 LPSTR lpszBuffer,
469 LPCSTR lpszPathName,
470 LPCSTR lpszShortName,
471 LPCSTR lpszLongName)
472{
473 FIXME("(%p,%p, %p ,%p):stub.\n",
474 lpszBuffer, lpszPathName, lpszShortName, lpszLongName);
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000475 return TRUE;
476}
477
Juergen Schmied51c74d82000-04-28 20:23:46 +0000478
479/*
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000480 ########## cleaning and resolving paths ##########
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000481 */
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000482
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000483/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000484 * PathFindOnPathAW [SHELL32]
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000485 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000486BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs)
Juergen Schmied51c74d82000-04-28 20:23:46 +0000487{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000488 if (SHELL_OsIsUnicode())
Alexandre Julliarda3960291999-02-26 11:11:13 +0000489 return PathFindOnPathW(sFile, sOtherDirs);
490 return PathFindOnPathA(sFile, sOtherDirs);
Juergen Schmied07e0d941998-12-01 08:55:13 +0000491}
492
493/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000494 * PathCleanupSpecAW [SHELL32]
495 */
Juergen Schmiedeac255c1999-08-15 14:31:36 +0000496DWORD WINAPI PathCleanupSpecAW (LPVOID x, LPVOID y)
497{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000498 FIXME("(%p, %p) stub\n",x,y);
499 return TRUE;
Juergen Schmiedeac255c1999-08-15 14:31:36 +0000500}
501
502/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000503 * PathQualifyA [SHELL32]
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000504 */
Juergen Schmied51c74d82000-04-28 20:23:46 +0000505BOOL WINAPI PathQualifyA(LPCSTR pszPath)
506{
507 FIXME("%s\n",pszPath);
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000508 return 0;
509}
510
511/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000512 * PathQualifyW [SHELL32]
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000513 */
Juergen Schmied51c74d82000-04-28 20:23:46 +0000514BOOL WINAPI PathQualifyW(LPCWSTR pszPath)
515{
516 FIXME("%s\n",debugstr_w(pszPath));
Juergen Schmiedbcd05e91998-11-25 16:47:05 +0000517 return 0;
518}
519
520/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000521 * PathQualifyAW [SHELL32]
522 */
523BOOL WINAPI PathQualifyAW(LPCVOID pszPath)
Juergen Schmiedc4804be1999-07-10 11:56:34 +0000524{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000525 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000526 return PathQualifyW(pszPath);
527 return PathQualifyA(pszPath);
Juergen Schmiedc4804be1999-07-10 11:56:34 +0000528}
529
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000530/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000531 * PathResolveA [SHELL32.51]
532 */
533BOOL WINAPI PathResolveA(
534 LPSTR lpszPath,
535 LPCSTR *alpszPaths,
536 DWORD dwFlags)
537{
538 FIXME("(%s,%p,0x%08lx),stub!\n",
539 lpszPath, *alpszPaths, dwFlags);
540 return 0;
541}
542
543/*************************************************************************
544 * PathResolveW [SHELL32]
545 */
546BOOL WINAPI PathResolveW(
547 LPWSTR lpszPath,
548 LPCWSTR *alpszPaths,
549 DWORD dwFlags)
550{
551 FIXME("(%s,%p,0x%08lx),stub!\n",
552 debugstr_w(lpszPath), debugstr_w(*alpszPaths), dwFlags);
553 return 0;
554}
555
556/*************************************************************************
557 * PathResolveAW [SHELL32]
558 */
559BOOL WINAPI PathResolveAW(
560 LPVOID lpszPath,
561 LPCVOID *alpszPaths,
562 DWORD dwFlags)
563{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000564 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000565 return PathResolveW(lpszPath, (LPCWSTR*)alpszPaths, dwFlags);
566 return PathResolveA(lpszPath, (LPCSTR*)alpszPaths, dwFlags);
567}
568
569/*************************************************************************
570* PathProcessCommandA [SHELL32.653]
571*/
572HRESULT WINAPI PathProcessCommandA (
573 LPCSTR lpszPath,
574 LPSTR lpszBuff,
575 DWORD dwBuffSize,
576 DWORD dwFlags)
577{
578 FIXME("%s %p 0x%04lx 0x%04lx stub\n",
579 lpszPath, lpszBuff, dwBuffSize, dwFlags);
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000580 strcpy(lpszBuff, lpszPath);
Juergen Schmied51c74d82000-04-28 20:23:46 +0000581 return 0;
582}
583
584/*************************************************************************
585* PathProcessCommandW
586*/
587HRESULT WINAPI PathProcessCommandW (
588 LPCWSTR lpszPath,
589 LPWSTR lpszBuff,
590 DWORD dwBuffSize,
591 DWORD dwFlags)
592{
593 FIXME("(%s, %p, 0x%04lx, 0x%04lx) stub\n",
594 debugstr_w(lpszPath), lpszBuff, dwBuffSize, dwFlags);
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000595 strcpyW(lpszBuff, lpszPath);
Juergen Schmied51c74d82000-04-28 20:23:46 +0000596 return 0;
597}
598
599/*************************************************************************
600* PathProcessCommandAW
601*/
602HRESULT WINAPI PathProcessCommandAW (
603 LPCVOID lpszPath,
604 LPVOID lpszBuff,
605 DWORD dwBuffSize,
606 DWORD dwFlags)
607{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000608 if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000609 return PathProcessCommandW(lpszPath, lpszBuff, dwBuffSize, dwFlags);
610 return PathProcessCommandA(lpszPath, lpszBuff, dwBuffSize, dwFlags);
611}
612
613/*
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000614 ########## special ##########
Juergen Schmied51c74d82000-04-28 20:23:46 +0000615*/
616
617/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000618 * PathSetDlgItemPathAW
619 */
620BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath)
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000621{ if (SHELL_OsIsUnicode())
Juergen Schmied51c74d82000-04-28 20:23:46 +0000622 return PathSetDlgItemPathW(hDlg, id, pszPath);
623 return PathSetDlgItemPathA(hDlg, id, pszPath);
624}
625
626
627/*************************************************************************
628 * SHGetSpecialFolderPathA [SHELL32.175]
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000629 *
630 * converts csidl to path
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000631 */
Juergen Schmied8ddda031999-07-25 12:23:15 +0000632
633static char * szSHFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
Juergen Schmied51c74d82000-04-28 20:23:46 +0000634static char * szSHUserFolders = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
Patrik Stridvalle03fe5a2000-07-15 21:32:26 +0000635#if 0
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000636static char * szEnvUserProfile = "%USERPROFILE%";
637static char * szEnvSystemRoot = "%SYSTEMROOT%";
Patrik Stridvalle03fe5a2000-07-15 21:32:26 +0000638#endif
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000639
Juergen Schmied8ddda031999-07-25 12:23:15 +0000640BOOL WINAPI SHGetSpecialFolderPathA (
641 HWND hwndOwner,
642 LPSTR szPath,
643 DWORD csidl,
644 BOOL bCreate)
645{
646 CHAR szValueName[MAX_PATH], szDefaultPath[MAX_PATH];
647 HKEY hRootKey, hKey;
648 BOOL bRelative = TRUE;
649 DWORD dwType, dwDisp, dwPathLen = MAX_PATH;
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000650
Juergen Schmied8ddda031999-07-25 12:23:15 +0000651 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
652
653 /* build default values */
654 switch(csidl)
655 {
656 case CSIDL_APPDATA:
657 hRootKey = HKEY_CURRENT_USER;
658 strcpy (szValueName, "AppData");
659 strcpy (szDefaultPath, "AppData");
660 break;
661
662 case CSIDL_COOKIES:
663 hRootKey = HKEY_CURRENT_USER;
664 strcpy (szValueName, "Cookies");
665 strcpy(szDefaultPath, "Cookies");
666 break;
667
668 case CSIDL_DESKTOPDIRECTORY:
669 hRootKey = HKEY_CURRENT_USER;
670 strcpy(szValueName, "Desktop");
671 strcpy(szDefaultPath, "Desktop");
672 break;
673
674 case CSIDL_COMMON_DESKTOPDIRECTORY:
675 hRootKey = HKEY_LOCAL_MACHINE;
676 strcpy(szValueName, "Common Desktop");
677 strcpy(szDefaultPath, "Desktop");
678 break;
679
680 case CSIDL_FAVORITES:
681 hRootKey = HKEY_CURRENT_USER;
682 strcpy(szValueName, "Favorites");
683 strcpy(szDefaultPath, "Favorites");
684 break;
685
686 case CSIDL_FONTS:
687 hRootKey = HKEY_CURRENT_USER;
688 strcpy(szValueName, "Fonts");
689 strcpy(szDefaultPath, "Fonts");
690 break;
691
692 case CSIDL_HISTORY:
693 hRootKey = HKEY_CURRENT_USER;
694 strcpy(szValueName, "History");
695 strcpy(szDefaultPath, "History");
696 break;
697
698 case CSIDL_NETHOOD:
699 hRootKey = HKEY_CURRENT_USER;
700 strcpy(szValueName, "NetHood");
701 strcpy(szDefaultPath, "NetHood");
702 break;
703
704 case CSIDL_INTERNET_CACHE:
705 hRootKey = HKEY_CURRENT_USER;
706 strcpy(szValueName, "Cache");
707 strcpy(szDefaultPath, "Temporary Internet Files");
708 break;
709
710 case CSIDL_PERSONAL:
711 hRootKey = HKEY_CURRENT_USER;
712 strcpy(szValueName, "Personal");
713 strcpy(szDefaultPath, "My Own Files");
714 bRelative = FALSE;
715 break;
716
717 case CSIDL_PRINTHOOD:
718 hRootKey = HKEY_CURRENT_USER;
719 strcpy(szValueName, "PrintHood");
720 strcpy(szDefaultPath, "PrintHood");
721 break;
722
723 case CSIDL_PROGRAMS:
724 hRootKey = HKEY_CURRENT_USER;
725 strcpy(szValueName, "Programs");
Martin Pilkaea313582000-10-26 19:35:38 +0000726 strcpy(szDefaultPath, "Start Menu\\Programs");
Juergen Schmied8ddda031999-07-25 12:23:15 +0000727 break;
728
729 case CSIDL_COMMON_PROGRAMS:
730 hRootKey = HKEY_LOCAL_MACHINE;
731 strcpy(szValueName, "Common Programs");
732 strcpy(szDefaultPath, "");
733 break;
734
735 case CSIDL_RECENT:
736 hRootKey = HKEY_CURRENT_USER;
737 strcpy(szValueName, "Recent");
738 strcpy(szDefaultPath, "Recent");
739 break;
740
741 case CSIDL_SENDTO:
742 hRootKey = HKEY_CURRENT_USER;
743 strcpy(szValueName, "SendTo");
744 strcpy(szDefaultPath, "SendTo");
745 break;
746
747 case CSIDL_STARTMENU:
748 hRootKey = HKEY_CURRENT_USER;
Martin Pilkaea313582000-10-26 19:35:38 +0000749 strcpy(szValueName, "Start Menu");
750 strcpy(szDefaultPath, "Start Menu");
Juergen Schmied8ddda031999-07-25 12:23:15 +0000751 break;
752
753 case CSIDL_COMMON_STARTMENU:
754 hRootKey = HKEY_LOCAL_MACHINE;
Martin Pilkaea313582000-10-26 19:35:38 +0000755 strcpy(szValueName, "Common Start Menu");
756 strcpy(szDefaultPath, "Start Menu");
Juergen Schmied8ddda031999-07-25 12:23:15 +0000757 break;
758
759 case CSIDL_STARTUP:
760 hRootKey = HKEY_CURRENT_USER;
Martin Pilkaea313582000-10-26 19:35:38 +0000761 strcpy(szValueName, "StartUp");
762 strcpy(szDefaultPath, "Start Menu\\Programs\\StartUp");
Juergen Schmied8ddda031999-07-25 12:23:15 +0000763 break;
764
765 case CSIDL_COMMON_STARTUP:
766 hRootKey = HKEY_LOCAL_MACHINE;
Martin Pilkaea313582000-10-26 19:35:38 +0000767 strcpy(szValueName, "Common StartUp");
768 strcpy(szDefaultPath, "Start Menu\\Programs\\StartUp");
Juergen Schmied8ddda031999-07-25 12:23:15 +0000769 break;
770
771 case CSIDL_TEMPLATES:
772 hRootKey = HKEY_CURRENT_USER;
773 strcpy(szValueName, "Templates");
774 strcpy(szDefaultPath, "ShellNew");
775 break;
776
777 default:
778 ERR("folder unknown or not allowed\n");
779 return FALSE;
780 }
781
Juergen Schmied51c74d82000-04-28 20:23:46 +0000782 /* user shell folders */
783 if (RegCreateKeyExA(hRootKey,szSHUserFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
Juergen Schmied8ddda031999-07-25 12:23:15 +0000784
785 if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
786 {
Juergen Schmied51c74d82000-04-28 20:23:46 +0000787 RegCloseKey(hKey);
788
789 /* shell folders */
790 if (RegCreateKeyExA(hRootKey,szSHFolders,0,NULL,0,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp)) return FALSE;
791
792 if (RegQueryValueExA(hKey,szValueName,NULL,&dwType,(LPBYTE)szPath,&dwPathLen))
Juergen Schmied8ddda031999-07-25 12:23:15 +0000793 {
Juergen Schmied51c74d82000-04-28 20:23:46 +0000794
795 /* value not existing */
796 if (bRelative)
797 {
798 GetWindowsDirectoryA(szPath, MAX_PATH);
799 PathAddBackslashA(szPath);
800 strcat(szPath, szDefaultPath);
801 }
802 else
803 {
804 strcpy(szPath, "C:\\"); /* fixme ??? */
805 strcat(szPath, szDefaultPath);
806 }
807 RegSetValueExA(hKey,szValueName,0,REG_SZ,(LPBYTE)szPath,strlen(szPath)+1);
Juergen Schmied8ddda031999-07-25 12:23:15 +0000808 }
Juergen Schmied8ddda031999-07-25 12:23:15 +0000809 }
810 RegCloseKey(hKey);
811
Juergen Schmied1dbf403d2000-06-24 12:56:08 +0000812 /* expand paths like %USERPROFILE% */
813 if (dwType == REG_EXPAND_SZ)
814 {
815 ExpandEnvironmentStringsA(szPath, szDefaultPath, MAX_PATH);
816 strcpy(szPath, szDefaultPath);
817 }
818
Juergen Schmied13d74c52000-06-13 03:45:52 +0000819 /* if we don't care about existing directorys we are ready */
820 if(csidl & CSIDL_FLAG_DONT_VERIFY) return TRUE;
821
822 if (PathFileExistsA(szPath)) return TRUE;
823
824 /* not existing but we not allowed to create it */
825 if (!bCreate) return FALSE;
826
827 if (!CreateDirectoryA(szPath,NULL))
Juergen Schmied51c74d82000-04-28 20:23:46 +0000828 {
Juergen Schmied13d74c52000-06-13 03:45:52 +0000829 ERR("Failed to create directory '%s'.\n", szPath);
830 return FALSE;
Juergen Schmied51c74d82000-04-28 20:23:46 +0000831 }
832
Juergen Schmied13d74c52000-06-13 03:45:52 +0000833 MESSAGE("Created not existing system directory '%s'\n", szPath);
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000834 return TRUE;
835}
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000836
837/*************************************************************************
838 * SHGetSpecialFolderPathW
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000839 */
Juergen Schmied8ddda031999-07-25 12:23:15 +0000840BOOL WINAPI SHGetSpecialFolderPathW (
841 HWND hwndOwner,
842 LPWSTR szPath,
843 DWORD csidl,
844 BOOL bCreate)
845{
846 char szTemp[MAX_PATH];
847
848 if (SHGetSpecialFolderPathA(hwndOwner, szTemp, csidl, bCreate))
849 {
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000850 if (!MultiByteToWideChar( CP_ACP, 0, szTemp, -1, szPath, MAX_PATH ))
851 szPath[MAX_PATH-1] = 0;
852 }
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000853
Juergen Schmied8ddda031999-07-25 12:23:15 +0000854 TRACE("0x%04x,%p,csidl=%lu,0x%04x\n", hwndOwner,szPath,csidl,bCreate);
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000855
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000856 return TRUE;
857}
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000858
859/*************************************************************************
Juergen Schmied51c74d82000-04-28 20:23:46 +0000860 * SHGetSpecialFolderPathAW
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000861 */
Juergen Schmied8ddda031999-07-25 12:23:15 +0000862BOOL WINAPI SHGetSpecialFolderPathAW (
863 HWND hwndOwner,
864 LPVOID szPath,
865 DWORD csidl,
866 BOOL bCreate)
867
868{
Alexandre Julliardd586dc92000-08-14 14:35:01 +0000869 if (SHELL_OsIsUnicode())
Juergen Schmied8ddda031999-07-25 12:23:15 +0000870 return SHGetSpecialFolderPathW (hwndOwner, szPath, csidl, bCreate);
871 return SHGetSpecialFolderPathA (hwndOwner, szPath, csidl, bCreate);
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000872}
Jim Aston2f2c8171999-10-23 18:54:21 +0000873
Patrik Stridvallfcfacb92000-03-24 20:46:04 +0000874/*************************************************************************
Juergen Schmied13d74c52000-06-13 03:45:52 +0000875 * SHGetFolderPathA [SHFOLDER.@]
876 */
Patrik Stridvallb167d4b2000-06-23 15:47:36 +0000877HRESULT WINAPI SHGetFolderPathA(
Juergen Schmied13d74c52000-06-13 03:45:52 +0000878 HWND hwndOwner,
879 int nFolder,
880 HANDLE hToken, /* FIXME: get paths for specific user */
881 DWORD dwFlags, /* FIXME: SHGFP_TYPE_CURRENT|SHGFP_TYPE_DEFAULT */
882 LPSTR pszPath)
883{
884 return (SHGetSpecialFolderPathA(
885 hwndOwner,
886 pszPath,
887 CSIDL_FOLDER_MASK & nFolder,
888 CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;
889}
890
891/*************************************************************************
892 * SHGetFolderPathW [SHFOLDER.@]
893 */
Patrik Stridvallb167d4b2000-06-23 15:47:36 +0000894HRESULT WINAPI SHGetFolderPathW(
Juergen Schmied13d74c52000-06-13 03:45:52 +0000895 HWND hwndOwner,
896 int nFolder,
897 HANDLE hToken,
898 DWORD dwFlags,
899 LPWSTR pszPath)
900{
901 return (SHGetSpecialFolderPathW(
902 hwndOwner,
903 pszPath,
904 CSIDL_FOLDER_MASK & nFolder,
905 CSIDL_FLAG_CREATE & nFolder )) ? S_OK : E_FAIL;
906}