path.h (14329B)
1/** 2 * WinPR: Windows Portable Runtime 3 * Path Functions 4 * 5 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com> 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 */ 19 20#ifndef WINPR_PATH_H 21#define WINPR_PATH_H 22 23#include <winpr/winpr.h> 24#include <winpr/tchar.h> 25#include <winpr/error.h> 26#include <winpr/wtypes.h> 27 28//#define HAVE_PATHCCH_H 1 29 30#ifdef HAVE_PATHCCH_H 31 32#include <Pathcch.h> 33 34#else 35 36#ifdef __cplusplus 37extern "C" 38{ 39#endif 40 41#define PATHCCH_ALLOW_LONG_PATHS \ 42 0x00000001 /* Allow building of \\?\ paths if longer than MAX_PATH */ 43 44#define VOLUME_PREFIX _T("\\\\?\\Volume") 45#define VOLUME_PREFIX_LEN ((sizeof(VOLUME_PREFIX) / sizeof(TCHAR)) - 1) 46 47 /* 48 * Maximum number of characters we support using the "\\?\" syntax 49 * (0x7FFF + 1 for NULL terminator) 50 */ 51 52#define PATHCCH_MAX_CCH 0x8000 53 54 WINPR_API HRESULT PathCchAddBackslashA(PSTR pszPath, size_t cchPath); 55 WINPR_API HRESULT PathCchAddBackslashW(PWSTR pszPath, size_t cchPath); 56 57 WINPR_API HRESULT PathCchRemoveBackslashA(PSTR pszPath, size_t cchPath); 58 WINPR_API HRESULT PathCchRemoveBackslashW(PWSTR pszPath, size_t cchPath); 59 60 WINPR_API HRESULT PathCchAddBackslashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, 61 size_t* pcchRemaining); 62 WINPR_API HRESULT PathCchAddBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd, 63 size_t* pcchRemaining); 64 65 WINPR_API HRESULT PathCchRemoveBackslashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, 66 size_t* pcchRemaining); 67 WINPR_API HRESULT PathCchRemoveBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd, 68 size_t* pcchRemaining); 69 70 WINPR_API HRESULT PathCchAddExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt); 71 WINPR_API HRESULT PathCchAddExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt); 72 73 WINPR_API HRESULT PathCchAppendA(PSTR pszPath, size_t cchPath, PCSTR pszMore); 74 WINPR_API HRESULT PathCchAppendW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore); 75 76 WINPR_API HRESULT PathCchAppendExA(PSTR pszPath, size_t cchPath, PCSTR pszMore, 77 unsigned long dwFlags); 78 WINPR_API HRESULT PathCchAppendExW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore, 79 unsigned long dwFlags); 80 81 WINPR_API HRESULT PathCchCanonicalizeA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn); 82 WINPR_API HRESULT PathCchCanonicalizeW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn); 83 84 WINPR_API HRESULT PathCchCanonicalizeExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, 85 unsigned long dwFlags); 86 WINPR_API HRESULT PathCchCanonicalizeExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, 87 unsigned long dwFlags); 88 89 WINPR_API HRESULT PathAllocCanonicalizeA(PCSTR pszPathIn, unsigned long dwFlags, 90 PSTR* ppszPathOut); 91 WINPR_API HRESULT PathAllocCanonicalizeW(PCWSTR pszPathIn, unsigned long dwFlags, 92 PWSTR* ppszPathOut); 93 94 WINPR_API HRESULT PathCchCombineA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, 95 PCSTR pszMore); 96 WINPR_API HRESULT PathCchCombineW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, 97 PCWSTR pszMore); 98 99 WINPR_API HRESULT PathCchCombineExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, 100 PCSTR pszMore, unsigned long dwFlags); 101 WINPR_API HRESULT PathCchCombineExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, 102 PCWSTR pszMore, unsigned long dwFlags); 103 104 WINPR_API HRESULT PathAllocCombineA(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags, 105 PSTR* ppszPathOut); 106 WINPR_API HRESULT PathAllocCombineW(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags, 107 PWSTR* ppszPathOut); 108 109 WINPR_API HRESULT PathCchFindExtensionA(PCSTR pszPath, size_t cchPath, PCSTR* ppszExt); 110 WINPR_API HRESULT PathCchFindExtensionW(PCWSTR pszPath, size_t cchPath, PCWSTR* ppszExt); 111 112 WINPR_API HRESULT PathCchRenameExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt); 113 WINPR_API HRESULT PathCchRenameExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt); 114 115 WINPR_API HRESULT PathCchRemoveExtensionA(PSTR pszPath, size_t cchPath); 116 WINPR_API HRESULT PathCchRemoveExtensionW(PWSTR pszPath, size_t cchPath); 117 118 WINPR_API BOOL PathCchIsRootA(PCSTR pszPath); 119 WINPR_API BOOL PathCchIsRootW(PCWSTR pszPath); 120 121 WINPR_API BOOL PathIsUNCExA(PCSTR pszPath, PCSTR* ppszServer); 122 WINPR_API BOOL PathIsUNCExW(PCWSTR pszPath, PCWSTR* ppszServer); 123 124 WINPR_API HRESULT PathCchSkipRootA(PCSTR pszPath, PCSTR* ppszRootEnd); 125 WINPR_API HRESULT PathCchSkipRootW(PCWSTR pszPath, PCWSTR* ppszRootEnd); 126 127 WINPR_API HRESULT PathCchStripToRootA(PSTR pszPath, size_t cchPath); 128 WINPR_API HRESULT PathCchStripToRootW(PWSTR pszPath, size_t cchPath); 129 130 WINPR_API HRESULT PathCchStripPrefixA(PSTR pszPath, size_t cchPath); 131 WINPR_API HRESULT PathCchStripPrefixW(PWSTR pszPath, size_t cchPath); 132 133 WINPR_API HRESULT PathCchRemoveFileSpecA(PSTR pszPath, size_t cchPath); 134 WINPR_API HRESULT PathCchRemoveFileSpecW(PWSTR pszPath, size_t cchPath); 135 136#ifdef UNICODE 137#define PathCchAddBackslash PathCchAddBackslashW 138#define PathCchRemoveBackslash PathCchRemoveBackslashW 139#define PathCchAddBackslashEx PathCchAddBackslashExW 140#define PathCchRemoveBackslashEx PathCchRemoveBackslashExW 141#define PathCchAddExtension PathCchAddExtensionW 142#define PathCchAppend PathCchAppendW 143#define PathCchAppendEx PathCchAppendExW 144#define PathCchCanonicalize PathCchCanonicalizeW 145#define PathCchCanonicalizeEx PathCchCanonicalizeExW 146#define PathAllocCanonicalize PathAllocCanonicalizeW 147#define PathCchCombine PathCchCombineW 148#define PathCchCombineEx PathCchCombineExW 149#define PathAllocCombine PathAllocCombineW 150#define PathCchFindExtension PathCchFindExtensionW 151#define PathCchRenameExtension PathCchRenameExtensionW 152#define PathCchRemoveExtension PathCchRemoveExtensionW 153#define PathCchIsRoot PathCchIsRootW 154#define PathIsUNCEx PathIsUNCExW 155#define PathCchSkipRoot PathCchSkipRootW 156#define PathCchStripToRoot PathCchStripToRootW 157#define PathCchStripPrefix PathCchStripPrefixW 158#define PathCchRemoveFileSpec PathCchRemoveFileSpecW 159#else 160#define PathCchAddBackslash PathCchAddBackslashA 161#define PathCchRemoveBackslash PathCchRemoveBackslashA 162#define PathCchAddBackslashEx PathCchAddBackslashExA 163#define PathCchRemoveBackslashEx PathCchRemoveBackslashExA 164#define PathCchAddExtension PathCchAddExtensionA 165#define PathCchAppend PathCchAppendA 166#define PathCchAppendEx PathCchAppendExA 167#define PathCchCanonicalize PathCchCanonicalizeA 168#define PathCchCanonicalizeEx PathCchCanonicalizeExA 169#define PathAllocCanonicalize PathAllocCanonicalizeA 170#define PathCchCombine PathCchCombineA 171#define PathCchCombineEx PathCchCombineExA 172#define PathAllocCombine PathAllocCombineA 173#define PathCchFindExtension PathCchFindExtensionA 174#define PathCchRenameExtension PathCchRenameExtensionA 175#define PathCchRemoveExtension PathCchRemoveExtensionA 176#define PathCchIsRoot PathCchIsRootA 177#define PathIsUNCEx PathIsUNCExA 178#define PathCchSkipRoot PathCchSkipRootA 179#define PathCchStripToRoot PathCchStripToRootA 180#define PathCchStripPrefix PathCchStripPrefixA 181#define PathCchRemoveFileSpec PathCchRemoveFileSpecA 182#endif 183 184 /* Unix-style Paths */ 185 186 WINPR_API HRESULT PathCchAddSlashA(PSTR pszPath, size_t cchPath); 187 WINPR_API HRESULT PathCchAddSlashW(PWSTR pszPath, size_t cchPath); 188 189 WINPR_API HRESULT PathCchAddSlashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, 190 size_t* pcchRemaining); 191 WINPR_API HRESULT PathCchAddSlashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd, 192 size_t* pcchRemaining); 193 194 WINPR_API HRESULT UnixPathCchAddExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt); 195 WINPR_API HRESULT UnixPathCchAddExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt); 196 197 WINPR_API HRESULT UnixPathCchAppendA(PSTR pszPath, size_t cchPath, PCSTR pszMore); 198 WINPR_API HRESULT UnixPathCchAppendW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore); 199 200 WINPR_API HRESULT UnixPathAllocCombineA(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags, 201 PSTR* ppszPathOut); 202 WINPR_API HRESULT UnixPathAllocCombineW(PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags, 203 PWSTR* ppszPathOut); 204 205#ifdef UNICODE 206#define PathCchAddSlash PathCchAddSlashW 207#define PathCchAddSlashEx PathCchAddSlashExW 208#define UnixPathCchAddExtension UnixPathCchAddExtensionW 209#define UnixPathCchAppend UnixPathCchAppendW 210#define UnixPathAllocCombine UnixPathAllocCombineW 211#else 212#define PathCchAddSlash PathCchAddSlashA 213#define PathCchAddSlashEx PathCchAddSlashExA 214#define UnixPathCchAddExtension UnixPathCchAddExtensionA 215#define UnixPathCchAppend UnixPathCchAppendA 216#define UnixPathAllocCombine UnixPathAllocCombineA 217#endif 218 219 /* Native-style Paths */ 220 221 WINPR_API HRESULT PathCchAddSeparatorA(PSTR pszPath, size_t cchPath); 222 WINPR_API HRESULT PathCchAddSeparatorW(PWSTR pszPath, size_t cchPath); 223 224 WINPR_API HRESULT PathCchAddSeparatorExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, 225 size_t* pcchRemaining); 226 WINPR_API HRESULT PathCchAddSeparatorExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd, 227 size_t* pcchRemaining); 228 229 WINPR_API HRESULT NativePathCchAddExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt); 230 WINPR_API HRESULT NativePathCchAddExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt); 231 232 WINPR_API HRESULT NativePathCchAppendA(PSTR pszPath, size_t cchPath, PCSTR pszMore); 233 WINPR_API HRESULT NativePathCchAppendW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore); 234 235 WINPR_API HRESULT NativePathAllocCombineA(PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags, 236 PSTR* ppszPathOut); 237 WINPR_API HRESULT NativePathAllocCombineW(PCWSTR pszPathIn, PCWSTR pszMore, 238 unsigned long dwFlags, PWSTR* ppszPathOut); 239 240#ifdef UNICODE 241#define PathCchAddSeparator PathCchAddSeparatorW 242#define PathCchAddSeparatorEx PathCchAddSeparatorExW 243#define NativePathCchAddExtension NativePathCchAddExtensionW 244#define NativePathCchAppend NativePathCchAppendW 245#define NativePathAllocCombine NativePathAllocCombineW 246#else 247#define PathCchAddSeparator PathCchAddSeparatorA 248#define PathCchAddSeparatorEx PathCchAddSeparatorExA 249#define NativePathCchAddExtension NativePathCchAddExtensionA 250#define NativePathCchAppend NativePathCchAppendA 251#define NativePathAllocCombine NativePathAllocCombineA 252#endif 253 254 /* Path Portability Functions */ 255 256#define PATH_STYLE_WINDOWS 0x00000001 257#define PATH_STYLE_UNIX 0x00000002 258#define PATH_STYLE_NATIVE 0x00000003 259 260#define PATH_SHARED_LIB_EXT_WITH_DOT 0x00000001 261#define PATH_SHARED_LIB_EXT_APPLE_SO 0x00000002 262#define PATH_SHARED_LIB_EXT_EXPLICIT 0x80000000 263#define PATH_SHARED_LIB_EXT_EXPLICIT_DLL 0x80000001 264#define PATH_SHARED_LIB_EXT_EXPLICIT_SO 0x80000002 265#define PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB 0x80000003 266 267 WINPR_API HRESULT PathCchConvertStyleA(PSTR pszPath, size_t cchPath, unsigned long dwFlags); 268 WINPR_API HRESULT PathCchConvertStyleW(PWSTR pszPath, size_t cchPath, unsigned long dwFlags); 269 270 WINPR_API char PathGetSeparatorA(unsigned long dwFlags); 271 WINPR_API WCHAR PathGetSeparatorW(unsigned long dwFlags); 272 273 WINPR_API PCSTR PathGetSharedLibraryExtensionA(unsigned long dwFlags); 274 WINPR_API PCWSTR PathGetSharedLibraryExtensionW(unsigned long dwFlags); 275 276#ifdef UNICODE 277#define PathCchConvertStyle PathCchConvertStyleW 278#define PathGetSeparator PathGetSeparatorW 279#define PathGetSharedLibraryExtension PathGetSharedLibraryExtensionW 280#else 281#define PathCchConvertStyle PathCchConvertStyleA 282#define PathGetSeparator PathGetSeparatorW 283#define PathGetSharedLibraryExtension PathGetSharedLibraryExtensionA 284#endif 285 286#ifdef __cplusplus 287} 288#endif 289 290#endif 291 292/** 293 * Shell Path Functions 294 */ 295 296#define KNOWN_PATH_HOME 1 297#define KNOWN_PATH_TEMP 2 298#define KNOWN_PATH_XDG_DATA_HOME 3 299#define KNOWN_PATH_XDG_CONFIG_HOME 4 300#define KNOWN_PATH_XDG_CACHE_HOME 5 301#define KNOWN_PATH_XDG_RUNTIME_DIR 6 302 303#ifdef __cplusplus 304extern "C" 305{ 306#endif 307 308 WINPR_API char* GetKnownPath(int id); 309 WINPR_API char* GetKnownSubPath(int id, const char* path); 310 WINPR_API char* GetEnvironmentPath(char* name); 311 WINPR_API char* GetEnvironmentSubPath(char* name, const char* path); 312 WINPR_API char* GetCombinedPath(const char* basePath, const char* subPath); 313 314 WINPR_API BOOL PathMakePathA(LPCSTR path, LPSECURITY_ATTRIBUTES lpAttributes); 315 316#if !defined(_WIN32) || defined(_UWP) 317 318 WINPR_API BOOL PathIsRelativeA(LPCSTR pszPath); 319 WINPR_API BOOL PathIsRelativeW(LPCWSTR pszPath); 320 321 WINPR_API BOOL PathFileExistsA(LPCSTR pszPath); 322 WINPR_API BOOL PathFileExistsW(LPCWSTR pszPath); 323 324 WINPR_API BOOL PathIsDirectoryEmptyA(LPCSTR pszPath); 325 WINPR_API BOOL PathIsDirectoryEmptyW(LPCWSTR pszPath); 326 327#ifdef UNICODE 328#define PathFileExists PathFileExistsW 329#define PathIsDirectoryEmpty PathIsDirectoryEmptyW 330#else 331#define PathFileExists PathFileExistsA 332#define PathIsDirectoryEmpty PathIsDirectoryEmptyA 333#endif 334 335#endif 336 337WINPR_API BOOL winpr_MoveFile(LPCSTR lpExistingFileName, LPCSTR lpNewFileName); 338WINPR_API BOOL winpr_DeleteFile(const char* lpFileName); 339WINPR_API BOOL winpr_RemoveDirectory(LPCSTR lpPathName); 340WINPR_API BOOL winpr_PathFileExists(const char* pszPath); 341WINPR_API BOOL winpr_PathMakePath(const char* path, LPSECURITY_ATTRIBUTES lpAttributes); 342 343#ifdef __cplusplus 344} 345#endif 346 347#ifdef _WIN32 348#include <shlwapi.h> 349#endif 350 351#endif /* WINPR_PATH_H */