xref: /aoo4110/main/sal/osl/w32/path_helper.cxx (revision b1cdbd2c)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sal.hxx"
26 
27 /*******************************************************************
28  Includes
29  ******************************************************************/
30 
31 #include "path_helper.hxx"
32 #include <osl/diagnose.h>
33 #include <rtl/ustring.hxx>
34 
35 #include <algorithm>
36 #include <wchar.h>
37 
38 /*******************************************************************
39  Constants
40  ******************************************************************/
41 
42 const rtl::OUString BACKSLASH = rtl::OUString::createFromAscii("\\");
43 const rtl::OUString SLASH     = rtl::OUString::createFromAscii("/");
44 
45 /*******************************************************************
46  osl_systemPathEnsureSeparator
47  ******************************************************************/
48 
osl_systemPathEnsureSeparator(rtl_uString ** ppustrPath)49 void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath)
50 {
51     OSL_PRECOND(ppustrPath && (NULL != *ppustrPath), \
52 				"osl_systemPathEnsureSeparator: Invalid parameter");
53 
54  	rtl::OUString path(*ppustrPath);
55 	sal_Int32     i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH));
56 
57 	if (i < (path.getLength()-1))
58 	{
59 		path += BACKSLASH;
60 		rtl_uString_assign(ppustrPath, path.pData);
61 	}
62 
63 	OSL_POSTCOND(path.lastIndexOf(BACKSLASH) == (path.getLength() - 1), \
64 				 "osl_systemPathEnsureSeparator: Post condition failed");
65 }
66 
67 /*******************************************************************
68  osl_systemPathRemoveSeparator
69  ******************************************************************/
70 
osl_systemPathRemoveSeparator(rtl_uString ** ppustrPath)71 void SAL_CALL osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath)
72 {
73     rtl::OUString path(*ppustrPath);
74 
75     if (!osl::systemPathIsLogicalDrivePattern(path))
76     {
77         sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH));
78 
79         if (i > -1 && (i == (path.getLength() - 1)))
80         {
81             path = rtl::OUString(path.getStr(), path.getLength() - 1);
82             rtl_uString_assign(ppustrPath, path.pData);
83         }
84     }
85 }
86 
87 /*******************************************************************
88  osl_is_logical_drive_pattern
89  ******************************************************************/
90 
91 // is [A-Za-z]:[/|\]\0
92 const sal_Char* LDP                    = ":";
93 const sal_Char* LDP_WITH_BACKSLASH     = ":\\";
94 const sal_Char* LDP_WITH_SLASH         = ":/";
95 
96 // degenerated case returned by the Windows FileOpen dialog
97 // when someone enters for instance "x:filename", the Win32
98 // API accepts this case
99 const sal_Char* LDP_WITH_DOT_BACKSLASH = ":.\\";
100 
osl_systemPathIsLogicalDrivePattern(const rtl_uString * pustrPath)101 sal_Int32 osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath)
102 {
103     const sal_Unicode* p = rtl_uString_getStr(const_cast<rtl_uString*>(pustrPath));
104     if (iswalpha(*p++))
105     {
106         return ((0 == rtl_ustr_ascii_compare(p, LDP)) ||
107                 (0 == rtl_ustr_ascii_compare(p, LDP_WITH_BACKSLASH)) ||
108                 (0 == rtl_ustr_ascii_compare(p, LDP_WITH_SLASH)) ||
109                 (0 == rtl_ustr_ascii_compare(p, LDP_WITH_DOT_BACKSLASH)));
110     }
111     return 0;
112 }
113 
114 
115