1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. 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, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 /******************************************************************* 25 Includes 26 ******************************************************************/ 27 28 #include "path_helper.hxx" 29 #include <osl/diagnose.h> 30 #include <rtl/ustring.hxx> 31 32 #include <algorithm> 33 #include <wchar.h> 34 #include <wctype.h> 35 36 /******************************************************************* 37 Constants 38 ******************************************************************/ 39 40 const rtl::OUString BACKSLASH = rtl::OUString::createFromAscii("\\"); 41 const rtl::OUString SLASH = rtl::OUString::createFromAscii("/"); 42 43 /******************************************************************* 44 osl_systemPathEnsureSeparator 45 ******************************************************************/ 46 47 void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath) 48 { 49 OSL_PRECOND(ppustrPath && (NULL != *ppustrPath), \ 50 "osl_systemPathEnsureSeparator: Invalid parameter"); 51 52 rtl::OUString path(*ppustrPath); 53 sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH)); 54 55 if (i < (path.getLength()-1)) 56 { 57 path += BACKSLASH; 58 rtl_uString_assign(ppustrPath, path.pData); 59 } 60 61 OSL_POSTCOND(path.lastIndexOf(BACKSLASH) == (path.getLength() - 1), \ 62 "osl_systemPathEnsureSeparator: Post condition failed"); 63 } 64 65 /******************************************************************* 66 osl_systemPathRemoveSeparator 67 ******************************************************************/ 68 69 void SAL_CALL osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath) 70 { 71 rtl::OUString path(*ppustrPath); 72 73 if (!osl::systemPathIsLogicalDrivePattern(path)) 74 { 75 sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH)); 76 77 if (i > -1 && (i == (path.getLength() - 1))) 78 { 79 path = rtl::OUString(path.getStr(), path.getLength() - 1); 80 rtl_uString_assign(ppustrPath, path.pData); 81 } 82 } 83 } 84 85 /******************************************************************* 86 osl_is_logical_drive_pattern 87 ******************************************************************/ 88 89 // is [A-Za-z]:[/|\]\0 90 const sal_Unicode* LDP = L":"; 91 const sal_Unicode* LDP_WITH_BACKSLASH = L":\\"; 92 const sal_Unicode* LDP_WITH_SLASH = L":/"; 93 94 // degenerated case returned by the Windows FileOpen dialog 95 // when someone enters for instance "x:filename", the Win32 96 // API accepts this case 97 const sal_Unicode* LDP_WITH_DOT_BACKSLASH = L":.\\"; 98 99 sal_Int32 osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath) 100 { 101 const sal_Unicode* p = rtl_uString_getStr(const_cast<rtl_uString*>(pustrPath)); 102 if (iswalpha(*p++)) 103 { 104 return ((0 == wcscmp(p, LDP)) || 105 (0 == wcscmp(p, LDP_WITH_BACKSLASH)) || 106 (0 == wcscmp(p, LDP_WITH_SLASH)) || 107 (0 == wcscmp(p, LDP_WITH_DOT_BACKSLASH))); 108 } 109 return 0; 110 } 111 112 113