sal/Library_sal.mk          |    1 
 sal/osl/unx/file_misc.cxx   |   19 +++----
 sal/osl/w32/file_dirvol.cxx |  106 ++++++++++++++++++++++++++------------------
 sal/osl/w32/path_helper.cxx |   89 ------------------------------------
 sal/osl/w32/path_helper.hxx |   58 +-----------------------
 5 files changed, 76 insertions(+), 197 deletions(-)

New commits:
commit 43f49c3b50b406f0334085dcf302180718f3ecb3
Author:     Mike Kaganski <[email protected]>
AuthorDate: Tue Feb 20 13:45:12 2024 +0600
Commit:     Mike Kaganski <[email protected]>
CommitDate: Tue Feb 20 10:25:59 2024 +0100

    Move some stuff from path_helper to file_dirvol, and simplify
    
    Change-Id: Ic9dcff74c16e5f9c107ca060a3d22866f552c398
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163632
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>

diff --git a/sal/Library_sal.mk b/sal/Library_sal.mk
index e0bf325e38cd..a7026e8327d8 100644
--- a/sal/Library_sal.mk
+++ b/sal/Library_sal.mk
@@ -232,7 +232,6 @@ $(eval $(call gb_Library_add_exception_objects,sal,\
        sal/osl/w32/module \
        sal/osl/w32/mutex \
        sal/osl/w32/nlsupport \
-       sal/osl/w32/path_helper \
        sal/osl/w32/pipe \
        sal/osl/w32/process \
        sal/osl/w32/procimpl \
diff --git a/sal/osl/unx/file_misc.cxx b/sal/osl/unx/file_misc.cxx
index eb0cb1b414df..566f5c87a65f 100644
--- a/sal/osl/unx/file_misc.cxx
+++ b/sal/osl/unx/file_misc.cxx
@@ -481,7 +481,7 @@ static int path_make_parent(char* path)
     return 0;
 }
 
-static int create_dir_with_callback(
+static oslFileError create_dir_with_callback(
     char* directory_path,
     oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
     void* pData)
@@ -494,9 +494,9 @@ static int create_dir_with_callback(
             osl::detail::convertPathnameToUrl(directory_path, &url);
             aDirectoryCreationCallbackFunc(pData, url.pData);
         }
-        return 0;
+        return osl_File_E_None;
     }
-    return errno;
+    return oslTranslateFileError(errno);
 }
 
 static oslFileError create_dir_recursively_(
@@ -507,14 +507,11 @@ static oslFileError create_dir_recursively_(
     OSL_PRECOND((rtl_str_getLength(dir_path) > 0) && ((dir_path + 
(rtl_str_getLength(dir_path) - 1)) != (dir_path + 
rtl_str_lastIndexOfChar(dir_path, '/'))),
     "Path must not end with a slash");
 
-    int native_err = create_dir_with_callback(
+    oslFileError osl_error = create_dir_with_callback(
         dir_path, aDirectoryCreationCallbackFunc, pData);
 
-    if (native_err == 0)
-        return osl_File_E_None;
-
-    if (native_err != ENOENT)
-        return oslTranslateFileError(native_err);
+    if (osl_error != osl_File_E_NOENT)
+        return osl_error;
 
     // we step back until '/a_dir' at maximum because
     // we should get an error unequal ENOENT when
@@ -522,7 +519,7 @@ static oslFileError create_dir_recursively_(
     // return before
     int pos = path_make_parent(dir_path);
 
-    oslFileError osl_error = create_dir_recursively_(
+    osl_error = create_dir_recursively_(
         dir_path, aDirectoryCreationCallbackFunc, pData);
 
     if (osl_error != osl_File_E_None && osl_error != osl_File_E_EXIST)
@@ -530,7 +527,7 @@ static oslFileError create_dir_recursively_(
 
     dir_path[pos] = '/';
 
-    return create_dir_recursively_(dir_path, aDirectoryCreationCallbackFunc, 
pData);
+    return create_dir_with_callback(dir_path, aDirectoryCreationCallbackFunc, 
pData);
 }
 
 oslFileError SAL_CALL osl_createDirectoryPath(
diff --git a/sal/osl/w32/file_dirvol.cxx b/sal/osl/w32/file_dirvol.cxx
index 65b8d889b017..ca1709fcdf0c 100644
--- a/sal/osl/w32/file_dirvol.cxx
+++ b/sal/osl/w32/file_dirvol.cxx
@@ -31,7 +31,6 @@
 #include <sal/log.hxx>
 #include <o3tl/char16_t2wchar_t.hxx>
 
-const wchar_t UNC_PREFIX[] = L"\\";
 const wchar_t BACKSLASH = '\';
 const wchar_t SLASH = '/';
 
@@ -99,18 +98,50 @@ BOOL FileTimeToTimeValue(const FILETIME *cpFTime, TimeValue 
*pTimeVal)
 
 namespace
 {
+// Returns whether a given path is only a logical drive pattern or not.
+// A logical drive pattern is something like "a:\", "c:\".
+// No logical drive pattern is something like "c:      est"
+bool systemPathIsLogicalDrivePattern(std::u16string_view path)
+{
+    // is [A-Za-z]:[/|\]
+    if (path.length() < 2 || !rtl::isAsciiAlpha(path[0]) || path[1] != ':')
+        return false;
+    auto rest = path.substr(2);
+    return rest.empty() // "c:"
+           || rest == u"\" // "c:\"
+           || rest == u"/" // "c:/"
+           || rest == u".\"; // "c:.\"
+               // degenerated case returned by the Windows FileOpen dialog
+               // when someone enters for instance "x:filename", the Win32
+               // API accepts this case
+}
+
+// Adds a trailing path separator to the given system path if not
+// already there and if the path is not the root path or a logical
+// drive alone
+void systemPathEnsureSeparator(/*inout*/ OUString& path)
+{
+    if (!path.endsWith(u"\") && !path.endsWith(u"/"))
+        path += "\";
+
+    SAL_WARN_IF(!path.endsWith(u"\"), "sal.osl",
+                "systemPathEnsureSeparator: Post condition failed");
+}
+
+// Removes the last separator from the given system path if any and
+// if the path is not the root path '\'
+void systemPathRemoveSeparator(/*inout*/ OUString& path)
+{
+    if (!systemPathIsLogicalDrivePattern(path) && (path.endsWith(u"\") || 
path.endsWith(u"/")))
+        path = path.copy(0, path.getLength() - 1);
+}
 
     struct Component
     {
-        Component() :
-            begin_(nullptr), end_(nullptr)
-        {}
+        bool isPresent() const { return begin_ < end_; }
 
-        bool isPresent() const
-        { return (static_cast<sal_IntPtr>(end_ - begin_) > 0); }
-
-        const sal_Unicode* begin_;
-        const sal_Unicode* end_;
+        const sal_Unicode* begin_ = nullptr;
+        const sal_Unicode* end_ = nullptr;
     };
 
     struct UNCComponents
@@ -120,47 +151,48 @@ namespace
         Component resource_;
     };
 
-    bool is_UNC_path(const sal_Unicode* path)
-    { return (0 == wcsncmp(UNC_PREFIX, o3tl::toW(path), 
SAL_N_ELEMENTS(UNC_PREFIX) - 1)); }
+    bool is_UNC_path(std::u16string_view path) { return 
path.starts_with(u"\\"); }
 
-    void parse_UNC_path(const sal_Unicode* path, UNCComponents* puncc)
+    UNCComponents parse_UNC_path(std::u16string_view path)
     {
         OSL_PRECOND(is_UNC_path(path), "Precondition violated: No UNC path");
-        OSL_PRECOND(rtl_ustr_indexOfChar(path, SLASH) == -1, "Path must not 
contain slashes");
+        OSL_PRECOND(path.find('/') == std::u16string_view::npos, "Path must 
not contain slashes");
 
-        const sal_Unicode* pend = path + rtl_ustr_getLength(path);
-        const sal_Unicode* ppos = path + 2;
+        const sal_Unicode* pend = path.data() + path.length();
+        const sal_Unicode* ppos = path.data() + 2;
+        UNCComponents uncc;
 
-        puncc->server_.begin_ = ppos;
+        uncc.server_.begin_ = ppos;
         while ((ppos < pend) && (*ppos != BACKSLASH))
             ppos++;
 
-        puncc->server_.end_ = ppos;
+        uncc.server_.end_ = ppos;
 
-        if (BACKSLASH == *ppos)
+        if (ppos < pend)
         {
-            puncc->share_.begin_ = ++ppos;
+            uncc.share_.begin_ = ++ppos;
             while ((ppos < pend) && (*ppos != BACKSLASH))
                 ppos++;
 
-            puncc->share_.end_ = ppos;
+            uncc.share_.end_ = ppos;
 
-            if (BACKSLASH == *ppos)
+            if (ppos < pend)
             {
-                puncc->resource_.begin_ = ++ppos;
+                uncc.resource_.begin_ = ++ppos;
                 while (ppos < pend)
                     ppos++;
 
-                puncc->resource_.end_ = ppos;
+                uncc.resource_.end_ = ppos;
             }
         }
 
-        SAL_WARN_IF(!puncc->server_.isPresent() || !puncc->share_.isPresent(),
+        SAL_WARN_IF(!uncc.server_.isPresent() || !uncc.share_.isPresent(),
             "sal.osl",
             "Postcondition violated: Invalid UNC path detected");
+        return uncc;
     }
 
-    bool has_path_parent(const sal_Unicode* path)
+    bool has_path_parent(std::u16string_view path)
     {
         // Has the given path a parent or are we already there,
         // e.g. 'c:\' or '\server\share\'?
@@ -168,20 +200,15 @@ namespace
         bool has_parent = false;
         if (is_UNC_path(path))
         {
-            UNCComponents unc_comp;
-            parse_UNC_path(path, &unc_comp);
+            UNCComponents unc_comp = parse_UNC_path(path);
             has_parent = unc_comp.resource_.isPresent();
         }
         else
         {
-            has_parent = !osl::systemPathIsLogicalDrivePattern(OUString(path));
+            has_parent = !systemPathIsLogicalDrivePattern(path);
         }
         return has_parent;
     }
-
-    bool has_path_parent(const OUString& path)
-    { return has_path_parent(path.getStr()); }
-
 }
 
 oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle 
Handle )
@@ -597,9 +624,6 @@ static DWORD create_dir_recursively_(
 
     DWORD w32_error = create_dir_with_callback(
         dir_path, aDirectoryCreationCallbackFunc, pData);
-    if (w32_error == ERROR_SUCCESS)
-        return ERROR_SUCCESS;
-
     if ((w32_error != ERROR_PATH_NOT_FOUND) || 
!has_path_parent(dir_path->buffer))
         return w32_error;
 
@@ -613,7 +637,7 @@ static DWORD create_dir_recursively_(
     if (ERROR_SUCCESS != w32_error && ERROR_ALREADY_EXISTS != w32_error)
         return w32_error;
 
-    return create_dir_recursively_(dir_path, aDirectoryCreationCallbackFunc, 
pData);
+    return create_dir_with_callback(dir_path, aDirectoryCreationCallbackFunc, 
pData);
 }
 
 oslFileError SAL_CALL osl_createDirectoryPath(
@@ -631,7 +655,7 @@ oslFileError SAL_CALL osl_createDirectoryPath(
     if (osl_error != osl_File_E_None)
         return osl_error;
 
-    osl::systemPathRemoveSeparator(sys_path);
+    systemPathRemoveSeparator(sys_path);
 
     return oslTranslateFileError(create_dir_recursively_(
         sys_path.pData, aDirectoryCreationCallbackFunc, pData));
@@ -1073,7 +1097,7 @@ static bool is_floppy_volume_mount_point(const OUString& 
path)
     static const LPCWSTR FLOPPY_B = L"B:\";
 
     OUString p(path);
-    osl::systemPathEnsureSeparator(p);
+    systemPathEnsureSeparator(p);
 
     WCHAR vn[51];
     if (GetVolumeNameForVolumeMountPointW(o3tl::toW(p.getStr()), vn, 
SAL_N_ELEMENTS(vn)))
@@ -1109,7 +1133,7 @@ static bool is_floppy_drive(const OUString& path)
 static bool is_volume_mount_point(const OUString& path)
 {
     OUString p(path);
-    osl::systemPathRemoveSeparator(p);
+    systemPathRemoveSeparator(p);
 
     if (is_floppy_drive(p))
         return false;
@@ -1140,7 +1164,7 @@ static UINT get_volume_mount_point_drive_type(const 
OUString& path)
         return GetDriveTypeW(nullptr);
 
     OUString p(path);
-    osl::systemPathEnsureSeparator(p);
+    systemPathEnsureSeparator(p);
 
     WCHAR vn[51];
     if (GetVolumeNameForVolumeMountPointW(o3tl::toW(p.getStr()), vn, 
SAL_N_ELEMENTS(vn)))
@@ -1312,7 +1336,7 @@ static void path_travel_to_volume_root(const OUString& 
system_path, OUString& vo
         /**/;
 
     volume_root = sys_path;
-    osl::systemPathEnsureSeparator(volume_root);
+    systemPathEnsureSeparator(volume_root);
 }
 
 oslFileError SAL_CALL osl_getVolumeInformation(
diff --git a/sal/osl/w32/path_helper.cxx b/sal/osl/w32/path_helper.cxx
deleted file mode 100644
index 23a2412d91ac..000000000000
--- a/sal/osl/w32/path_helper.cxx
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include "path_helper.hxx"
-#include <osl/diagnose.h>
-#include <rtl/ustring.hxx>
-#include <sal/log.hxx>
-
-#include <algorithm>
-#include <wchar.h>
-
-constexpr OUString BACKSLASH (u"\"_ustr);
-constexpr OUString SLASH     (u"/"_ustr);
-
-void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath)
-{
-    OSL_PRECOND(ppustrPath && (nullptr != *ppustrPath),
-                "osl_systemPathEnsureSeparator: Invalid parameter");
-
-    OUString path(*ppustrPath);
-    sal_Int32     i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), 
path.lastIndexOf(SLASH));
-
-    if (i < (path.getLength()-1))
-    {
-        path += BACKSLASH;
-        rtl_uString_assign(ppustrPath, path.pData);
-    }
-
-    SAL_WARN_IF( !path.endsWith(BACKSLASH),
-                 "sal.osl",
-                 "osl_systemPathEnsureSeparator: Post condition failed");
-}
-
-void osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath)
-{
-    OUString path(*ppustrPath);
-
-    if (!osl::systemPathIsLogicalDrivePattern(path))
-    {
-        sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), 
path.lastIndexOf(SLASH));
-
-        if (i > -1 && (i == (path.getLength() - 1)))
-        {
-            path = path.copy(0, path.getLength() - 1);
-            rtl_uString_assign(ppustrPath, path.pData);
-        }
-    }
-}
-
-// is [A-Za-z]:[/|\]
-const char* const LDP                = ":";
-const char* const LDP_WITH_BACKSLASH = ":\";
-const char* const LDP_WITH_SLASH     = ":/";
-
-// degenerated case returned by the Windows FileOpen dialog
-// when someone enters for instance "x:filename", the Win32
-// API accepts this case
-const char* const LDP_WITH_DOT_BACKSLASH = ":.\";
-
-bool osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath)
-{
-    const sal_Unicode* p = 
rtl_uString_getStr(const_cast<rtl_uString*>(pustrPath));
-    if (iswalpha(*p++))
-    {
-        return ((0 == rtl_ustr_ascii_compare(p, LDP)) ||
-                (0 == rtl_ustr_ascii_compare(p, LDP_WITH_BACKSLASH)) ||
-                (0 == rtl_ustr_ascii_compare(p, LDP_WITH_SLASH)) ||
-                (0 == rtl_ustr_ascii_compare(p, LDP_WITH_DOT_BACKSLASH)));
-    }
-    return false;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sal/osl/w32/path_helper.hxx b/sal/osl/w32/path_helper.hxx
index beda51992058..cd7b822d9d32 100644
--- a/sal/osl/w32/path_helper.hxx
+++ b/sal/osl/w32/path_helper.hxx
@@ -23,71 +23,19 @@
 #include <sal/config.h>
 
 #include <osl/diagnose.h>
-#include <rtl/ustring.h>
-#include <rtl/ustring.hxx>
 #include <sal/types.h>
 
-/**
- Adds a trailing path separator to the given system path if not
- already there and if the path is not the root path or a logical
- drive alone
-*/
-
-void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath);
-
-/**
- Removes the last separator from the given system path if any and
- if the path is not the root path '\'
-*/
-
-void osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath);
-
-/**
- Returns whether a given path is only a logical drive pattern or not.
- A logical drive pattern is something like "a:\", "c:\".
- No logical drive pattern is something like "c:        est"
-*/
-
-bool osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath);
-
 namespace osl
 {
-
-/**
- Adds a trailing path separator to the given system path if not
- already there and if the path is not the root path or a logical
- drive alone
-*/
-
-inline void systemPathEnsureSeparator(/*inout*/ OUString& Path)
-{
-    osl_systemPathEnsureSeparator(&Path.pData);
-}
-
-/**
- Removes the last separator from the given system path if any and
- if the path is not the root path '\'
-*/
-
-inline void systemPathRemoveSeparator(/*inout*/ OUString& Path)
-{
-    osl_systemPathRemoveSeparator(&Path.pData);
-}
-
-inline bool systemPathIsLogicalDrivePattern(/*in*/ const OUString& path)
-{
-    return osl_systemPathIsLogicalDrivePattern(path.pData);
-}
-
 template< class T >
 class LongPathBuffer
 {
     T* m_pBuffer;
     sal_uInt32 m_nCharNum;
 
-    LongPathBuffer();
-    LongPathBuffer( const LongPathBuffer& );
-    LongPathBuffer& operator=( const LongPathBuffer& );
+    LongPathBuffer() = delete;
+    LongPathBuffer(const LongPathBuffer&) = delete;
+    LongPathBuffer& operator=(const LongPathBuffer&) = delete;
 
 public:
     explicit LongPathBuffer( sal_uInt32 nCharNum )

Reply via email to