sal/osl/w32/file.cxx        |   60 ++------
 sal/osl/w32/file_dirvol.cxx |   85 ++++-------
 sal/osl/w32/file_url.cxx    |  312 ++++++++++++++++++++------------------------
 sal/osl/w32/file_url.hxx    |   10 -
 sal/osl/w32/tempfile.cxx    |   18 --
 5 files changed, 213 insertions(+), 272 deletions(-)

New commits:
commit d2272426cc79d9aacf4a34c5fd7744b59c29e95b
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Mon Aug 29 10:14:53 2022 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Tue Aug 30 12:41:51 2022 +0200

    Use some more C++ in sal/osl/w32
    
    Change-Id: I407bd4b044143a42d5652dc4164421b602cfe486
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138958
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/sal/osl/w32/file.cxx b/sal/osl/w32/file.cxx
index 57d95e14dfed..be921aede733 100644
--- a/sal/osl/w32/file.cxx
+++ b/sal/osl/w32/file.cxx
@@ -640,8 +640,8 @@ oslFileError SAL_CALL osl_openFile(
     oslFileHandle * pHandle,
     sal_uInt32      uFlags)
 {
-    rtl_uString * strSysPath = nullptr;
-    oslFileError result = osl_getSystemPathFromFileURL_(strPath, &strSysPath, 
false);
+    OUString strSysPath;
+    oslFileError result = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strPath), 
&strSysPath.pData, false);
     if (result != osl_File_E_None)
         return result;
 
@@ -661,7 +661,7 @@ oslFileError SAL_CALL osl_openFile(
         dwCreation |= OPEN_EXISTING;
 
     HANDLE hFile = CreateFileW(
-        o3tl::toW(rtl_uString_getStr(strSysPath)),
+        o3tl::toW(strSysPath.getStr()),
         dwAccess, dwShare, nullptr, dwCreation, 0, nullptr);
 
     // @@@ ERROR HANDLING @@@
@@ -670,7 +670,6 @@ oslFileError SAL_CALL osl_openFile(
 
     *pHandle = osl_createFileHandleFromOSHandle(hFile, uFlags | 
osl_File_OpenFlag_Read);
 
-    rtl_uString_release(strSysPath);
     return result;
 }
 
@@ -1030,33 +1029,31 @@ oslFileError SAL_CALL osl_setFileSize(oslFileHandle 
Handle, sal_uInt64 uSize)
 
 oslFileError SAL_CALL osl_removeFile(rtl_uString* strPath)
 {
-    rtl_uString *strSysPath = nullptr;
-    oslFileError    error = osl_getSystemPathFromFileURL_(strPath, 
&strSysPath, false);
+    OUString strSysPath;
+    oslFileError    error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strPath), 
&strSysPath.pData, false);
 
     if (error == osl_File_E_None)
     {
-        if (DeleteFileW(o3tl::toW(rtl_uString_getStr(strSysPath))))
+        if (DeleteFileW(o3tl::toW(strSysPath.getStr())))
             error = osl_File_E_None;
         else
             error = oslTranslateFileError(GetLastError());
-
-        rtl_uString_release(strSysPath);
     }
     return error;
 }
 
 oslFileError SAL_CALL osl_copyFile(rtl_uString* strPath, rtl_uString 
*strDestPath)
 {
-    rtl_uString *strSysPath = nullptr, *strSysDestPath = nullptr;
-    oslFileError    error = osl_getSystemPathFromFileURL_(strPath, 
&strSysPath, false);
+    OUString strSysPath, strSysDestPath;
+    oslFileError    error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strPath), 
&strSysPath.pData, false);
 
     if (error == osl_File_E_None)
-        error = osl_getSystemPathFromFileURL_(strDestPath, &strSysDestPath, 
false);
+        error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strDestPath), 
&strSysDestPath.pData, false);
 
     if (error == osl_File_E_None)
     {
-        LPCWSTR src = o3tl::toW(rtl_uString_getStr(strSysPath));
-        LPCWSTR dst = o3tl::toW(rtl_uString_getStr(strSysDestPath));
+        LPCWSTR src = o3tl::toW(strSysPath.getStr());
+        LPCWSTR dst = o3tl::toW(strSysDestPath.getStr());
 
         if (CopyFileW(src, dst, FALSE))
             error = osl_File_E_None;
@@ -1064,26 +1061,21 @@ oslFileError SAL_CALL osl_copyFile(rtl_uString* 
strPath, rtl_uString *strDestPat
             error = oslTranslateFileError(GetLastError());
     }
 
-    if (strSysPath)
-        rtl_uString_release(strSysPath);
-    if (strSysDestPath)
-        rtl_uString_release(strSysDestPath);
-
     return error;
 }
 
 oslFileError SAL_CALL osl_moveFile(rtl_uString* strPath, rtl_uString 
*strDestPath)
 {
-    rtl_uString *strSysPath = nullptr, *strSysDestPath = nullptr;
-    oslFileError    error = osl_getSystemPathFromFileURL_(strPath, 
&strSysPath, false);
+    OUString strSysPath, strSysDestPath;
+    oslFileError    error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strPath), 
&strSysPath.pData, false);
 
     if (error == osl_File_E_None)
-        error = osl_getSystemPathFromFileURL_(strDestPath, &strSysDestPath, 
false);
+        error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strDestPath), 
&strSysDestPath.pData, false);
 
     if (error == osl_File_E_None)
     {
-        LPCWSTR src = o3tl::toW(rtl_uString_getStr(strSysPath));
-        LPCWSTR dst = o3tl::toW(rtl_uString_getStr(strSysDestPath));
+        LPCWSTR src = o3tl::toW(strSysPath.getStr());
+        LPCWSTR dst = o3tl::toW(strSysDestPath.getStr());
 
         if (MoveFileExW(src, dst, MOVEFILE_COPY_ALLOWED | 
MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING))
             error = osl_File_E_None;
@@ -1091,26 +1083,21 @@ oslFileError SAL_CALL osl_moveFile(rtl_uString* 
strPath, rtl_uString *strDestPat
             error = oslTranslateFileError(GetLastError());
     }
 
-    if (strSysPath)
-        rtl_uString_release(strSysPath);
-    if (strSysDestPath)
-        rtl_uString_release(strSysDestPath);
-
     return error;
 }
 
 oslFileError SAL_CALL osl_replaceFile(rtl_uString* strPath, rtl_uString* 
strDestPath)
 {
-    rtl_uString *strSysPath = nullptr, *strSysDestPath = nullptr;
-    oslFileError    error = osl_getSystemPathFromFileURL_(strPath, 
&strSysPath, false);
+    OUString strSysPath, strSysDestPath;
+    oslFileError    error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strPath), 
&strSysPath.pData, false);
 
     if (error == osl_File_E_None)
-        error = osl_getSystemPathFromFileURL_(strDestPath, &strSysDestPath, 
false);
+        error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strDestPath), 
&strSysDestPath.pData, false);
 
     if (error == osl_File_E_None)
     {
-        LPCWSTR src = o3tl::toW(rtl_uString_getStr(strSysPath));
-        LPCWSTR dst = o3tl::toW(rtl_uString_getStr(strSysDestPath));
+        LPCWSTR src = o3tl::toW(strSysPath.getStr());
+        LPCWSTR dst = o3tl::toW(strSysDestPath.getStr());
 
         if (!ReplaceFileW(dst, src, nullptr,
                           REPLACEFILE_WRITE_THROUGH | 
REPLACEFILE_IGNORE_MERGE_ERRORS
@@ -1128,11 +1115,6 @@ oslFileError SAL_CALL osl_replaceFile(rtl_uString* 
strPath, rtl_uString* strDest
         }
     }
 
-    if (strSysPath)
-        rtl_uString_release(strSysPath);
-    if (strSysDestPath)
-        rtl_uString_release(strSysDestPath);
-
     return error;
 }
 
diff --git a/sal/osl/w32/file_dirvol.cxx b/sal/osl/w32/file_dirvol.cxx
index 793a5ed52d21..f9d821605e86 100644
--- a/sal/osl/w32/file_dirvol.cxx
+++ b/sal/osl/w32/file_dirvol.cxx
@@ -434,14 +434,14 @@ static oslFileError osl_openLocalRoot(
 
     *pDirectory = nullptr;
 
-    rtl_uString     *strSysPath = nullptr;
-    oslFileError     error = osl_getSystemPathFromFileURL_( strDirectoryPath, 
&strSysPath, false );
+    OUString strSysPath;
+    oslFileError error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strDirectoryPath), 
&strSysPath.pData, false);
     if ( osl_File_E_None != error )
         return error;
 
     Directory_Impl* pDirImpl = new (std::nothrow) Directory_Impl;
     assert(pDirImpl); // Don't handle OOM conditions
-    pDirImpl->m_sDirectoryPath = OUString(strSysPath, SAL_NO_ACQUIRE);
+    pDirImpl->m_sDirectoryPath = strSysPath;
 
     /* Append backslash if necessary */
 
@@ -626,7 +626,7 @@ oslFileError SAL_CALL osl_createDirectoryPath(
 
     OUString sys_path;
     oslFileError osl_error =
-        osl_getSystemPathFromFileURL_(aDirectoryUrl, &sys_path.pData, false);
+        osl_getSystemPathFromFileURL_(OUString::unacquired(&aDirectoryUrl), 
&sys_path.pData, false);
 
     if (osl_error != osl_File_E_None)
         return osl_error;
@@ -648,13 +648,13 @@ oslFileError SAL_CALL osl_createDirectory(rtl_uString* 
strPath)
 
 oslFileError osl_createDirectoryWithFlags(rtl_uString * strPath, sal_uInt32)
 {
-    rtl_uString *strSysPath = nullptr;
-    oslFileError    error = osl_getSystemPathFromFileURL_( strPath, 
&strSysPath, false );
+    OUString strSysPath;
+    oslFileError error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strPath), 
&strSysPath.pData, false);
 
     if ( osl_File_E_None != error )
         return error;
 
-    bool bCreated = CreateDirectoryW( o3tl::toW(rtl_uString_getStr( strSysPath 
)), nullptr );
+    bool bCreated = CreateDirectoryW(o3tl::toW(strSysPath.getStr()), nullptr);
     if ( !bCreated )
     {
         /*@@@ToDo
@@ -663,36 +663,27 @@ oslFileError osl_createDirectoryWithFlags(rtl_uString * 
strPath, sal_uInt32)
           case the path is only a logical drive, should be removed!
         */
 
-        const sal_Unicode   *pBuffer = rtl_uString_getStr( strSysPath );
-        sal_Int32           nLen = rtl_uString_getLength( strSysPath );
-
-        if (
-            ( ( pBuffer[0] >= 'A' && pBuffer[0] <= 'Z' ) ||
-              ( pBuffer[0] >= 'a' && pBuffer[0] <= 'z' ) ) &&
-            pBuffer[1] == ':' && ( nLen ==2 || ( nLen == 3 && pBuffer[2] == 
'\\' ) )
-            )
+        if ((strSysPath.getLength() == 2 || (strSysPath.getLength() == 3 && 
strSysPath[2] == '\\'))
+            && rtl::isAsciiAlpha(strSysPath[0]) && strSysPath[1] == ':')
             SetLastError( ERROR_ALREADY_EXISTS );
 
         error = oslTranslateFileError( GetLastError() );
     }
 
-    rtl_uString_release( strSysPath );
     return error;
 }
 
 oslFileError SAL_CALL osl_removeDirectory(rtl_uString* strPath)
 {
-    rtl_uString *strSysPath = nullptr;
-    oslFileError    error = osl_getSystemPathFromFileURL_( strPath, 
&strSysPath, false );
+    OUString strSysPath;
+    oslFileError error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strPath), 
&strSysPath.pData, false);
 
     if ( osl_File_E_None == error )
     {
-        if ( RemoveDirectoryW( o3tl::toW(rtl_uString_getStr( strSysPath ) )) )
+        if (RemoveDirectoryW(o3tl::toW(strSysPath.getStr())))
             error = osl_File_E_None;
         else
             error = oslTranslateFileError( GetLastError() );
-
-        rtl_uString_release( strSysPath );
     }
     return error;
 }
@@ -705,24 +696,20 @@ oslFileError SAL_CALL osl_openDirectory(rtl_uString 
*strDirectoryPath, oslDirect
         error = osl_openLocalRoot( strDirectoryPath, pDirectory );
     else
     {
-        rtl_uString *strSysDirectoryPath = nullptr;
+        OUString strSysDirectoryPath;
         DWORD       dwPathType;
 
-        error = osl_getSystemPathFromFileURL_( strDirectoryPath, 
&strSysDirectoryPath, false );
+        error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&strDirectoryPath), 
&strSysDirectoryPath.pData, false);
 
         if ( osl_File_E_None != error )
                 return error;
 
-        dwPathType = IsValidFilePath( strSysDirectoryPath, 
VALIDATEPATH_NORMAL, nullptr );
+        dwPathType = IsValidFilePath(strSysDirectoryPath, VALIDATEPATH_NORMAL, 
nullptr);
 
         if ( dwPathType & PATHTYPE_IS_SERVER )
-        {
-            error = osl_openNetworkServer( strSysDirectoryPath, pDirectory );
-        }
+            error = osl_openNetworkServer(strSysDirectoryPath.pData, 
pDirectory);
         else
-            error = osl_openFileDirectory( strSysDirectoryPath, pDirectory );
-
-        rtl_uString_release( strSysDirectoryPath );
+            error = osl_openFileDirectory(strSysDirectoryPath.pData, 
pDirectory);
     }
     return error;
 }
@@ -915,7 +902,7 @@ enum PATHTYPE
 oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString *strFilePath, 
oslDirectoryItem *pItem)
 {
     oslFileError    error = osl_File_E_None;
-    rtl_uString*    strSysFilePath = nullptr;
+    OUString strSysFilePath;
     PATHTYPE        type = PATHTYPE_FILE;
     DWORD           dwPathType;
 
@@ -926,7 +913,7 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString 
*strFilePath, oslDirector
 
     *pItem = nullptr;
 
-    error = osl_getSystemPathFromFileURL_( strFilePath, &strSysFilePath, false 
);
+    error = osl_getSystemPathFromFileURL_(OUString::unacquired(&strFilePath), 
&strSysFilePath.pData, false);
 
     if ( osl_File_E_None != error )
             return error;
@@ -961,9 +948,9 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString 
*strFilePath, oslDirector
                     int iSrc = 2;
                     int iDst = 0;
 
-                    while( iSrc < strSysFilePath->length && 
strSysFilePath->buffer[iSrc] && strSysFilePath->buffer[iSrc] != '\\' )
+                    while( iSrc < strSysFilePath.getLength() && 
strSysFilePath[iSrc] && strSysFilePath[iSrc] != '\\')
                     {
-                        pItemImpl->FindData.cFileName[iDst++] = 
strSysFilePath->buffer[iSrc++];
+                        pItemImpl->FindData.cFileName[iDst++] = 
strSysFilePath[iSrc++];
                     }
                 }
 
@@ -984,7 +971,7 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString 
*strFilePath, oslDirector
 
                 osl_acquireDirectoryItem( 
static_cast<oslDirectoryItem>(pItemImpl) );
 
-                wcscpy( pItemImpl->cDriveString, 
o3tl::toW(strSysFilePath->buffer) );
+                wcscpy( pItemImpl->cDriveString, 
o3tl::toW(strSysFilePath.getStr()) );
                 pItemImpl->cDriveString[0] = rtl::toAsciiUpperCase( 
pItemImpl->cDriveString[0] );
 
                 if ( pItemImpl->cDriveString[wcslen(pItemImpl->cDriveString) - 
1] != '\\' )
@@ -1001,10 +988,10 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString 
*strFilePath, oslDirector
             HANDLE              hFind;
             WIN32_FIND_DATAW     aFindData;
 
-            if ( strSysFilePath->length > 0 && 
strSysFilePath->buffer[strSysFilePath->length - 1] == '\\' )
-                rtl_uString_newFromStr_WithLength( &strSysFilePath, 
strSysFilePath->buffer, strSysFilePath->length - 1 );
+            if (!strSysFilePath.isEmpty() && 
strSysFilePath[strSysFilePath.getLength() - 1] == '\\')
+                strSysFilePath = strSysFilePath.copy(0, 
strSysFilePath.getLength() - 1);
 
-            hFind = FindFirstFileW( 
o3tl::toW(rtl_uString_getStr(strSysFilePath)), &aFindData );
+            hFind = FindFirstFileW( o3tl::toW(strSysFilePath.getStr()), 
&aFindData );
 
             if ( hFind != INVALID_HANDLE_VALUE )
             {
@@ -1031,9 +1018,6 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString 
*strFilePath, oslDirector
         break;
     }
 
-    if ( strSysFilePath )
-        rtl_uString_release( strSysFilePath );
-
     return error;
 }
 
@@ -1341,7 +1325,7 @@ oslFileError SAL_CALL osl_getVolumeInformation(
         return osl_File_E_INVAL;
 
     OUString system_path;
-    oslFileError error = osl_getSystemPathFromFileURL_(ustrURL, 
&system_path.pData, false);
+    oslFileError error = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&ustrURL), 
&system_path.pData, false);
 
     if (osl_File_E_None != error)
         return error;
@@ -1623,17 +1607,17 @@ oslFileError SAL_CALL osl_setFileAttributes(
     sal_uInt64 uAttributes )
 {
     oslFileError    error;
-    rtl_uString     *ustrSysPath = nullptr;
+    OUString ustrSysPath;
     DWORD           dwFileAttributes;
     bool            fSuccess;
 
     // Converts the normalized path into a systempath
-    error = osl_getSystemPathFromFileURL_( ustrFileURL, &ustrSysPath, false );
+    error = osl_getSystemPathFromFileURL_(OUString::unacquired(&ustrFileURL), 
&ustrSysPath.pData, false);
 
     if ( osl_File_E_None != error )
         return error;
 
-    dwFileAttributes = GetFileAttributesW( 
o3tl::toW(rtl_uString_getStr(ustrSysPath)) );
+    dwFileAttributes = GetFileAttributesW(o3tl::toW(ustrSysPath.getStr()));
 
     if ( DWORD(-1) != dwFileAttributes )
     {
@@ -1645,7 +1629,7 @@ oslFileError SAL_CALL osl_setFileAttributes(
         if ( uAttributes & osl_File_Attribute_Hidden )
             dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN;
 
-        fSuccess = SetFileAttributesW( 
o3tl::toW(rtl_uString_getStr(ustrSysPath)), dwFileAttributes );
+        fSuccess = SetFileAttributesW(o3tl::toW(ustrSysPath.getStr()), 
dwFileAttributes);
     }
     else
     {
@@ -1655,8 +1639,6 @@ oslFileError SAL_CALL osl_setFileAttributes(
     if ( !fSuccess )
         error = oslTranslateFileError( GetLastError() );
 
-    rtl_uString_release( ustrSysPath );
-
     return error;
 }
 
@@ -1667,7 +1649,7 @@ oslFileError SAL_CALL osl_setFileTime(
     const TimeValue *aLastWriteTime)
 {
     oslFileError error;
-    rtl_uString *sysPath=nullptr;
+    OUString sysPath;
     FILETIME *lpCreationTime=nullptr;
     FILETIME *lpLastAccessTime=nullptr;
     FILETIME *lpLastWriteTime=nullptr;
@@ -1677,13 +1659,12 @@ oslFileError SAL_CALL osl_setFileTime(
     HANDLE hFile;
     bool fSuccess;
 
-    error=osl_getSystemPathFromFileURL_(filePath, &sysPath, false);
+    error=osl_getSystemPathFromFileURL_(OUString::unacquired(&filePath), 
&sysPath.pData, false);
 
     if (error==osl_File_E_INVAL)
         return error;
 
-    hFile=CreateFileW(o3tl::toW(rtl_uString_getStr(sysPath)), GENERIC_WRITE, 
0, nullptr , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
-    rtl_uString_release(sysPath);
+    hFile=CreateFileW(o3tl::toW(sysPath.getStr()), GENERIC_WRITE, 0, nullptr , 
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
 
     if (hFile==INVALID_HANDLE_VALUE)
         return osl_File_E_NOENT;
diff --git a/sal/osl/w32/file_url.cxx b/sal/osl/w32/file_url.cxx
index c452a3624977..390b58beed63 100644
--- a/sal/osl/w32/file_url.cxx
+++ b/sal/osl/w32/file_url.cxx
@@ -37,6 +37,7 @@
 #include <rtl/ustrbuf.hxx>
 #include <osl/mutex.h>
 #include <o3tl/char16_t2wchar_t.hxx>
+#include <o3tl/string_view.hxx>
 
 #include "path_helper.hxx"
 
@@ -50,47 +51,45 @@ namespace
 {
 // Internal functions that expect only backslashes as path separators
 
-bool startsWithDriveColon(const sal_Unicode* p) { return 
rtl::isAsciiAlpha(p[0]) && p[1] == ':'; }
-
-bool startsWithDriveColon(const rtl_uString* p) { return 
startsWithDriveColon(p->buffer); }
-
-bool startsWithDriveColonSlash(const rtl_uString* p)
+bool startsWithDriveColon(std::u16string_view s)
 {
-    return startsWithDriveColon(p) && p->buffer[2] == '\\';
+    return s.length() >= 2 && rtl::isAsciiAlpha(s[0]) && s[1] == ':';
 }
 
-bool startsWithSlashSlash(const sal_Unicode* p) { return p[0] == '\\' && p[1] 
== '\\'; }
+bool startsWithDriveColonSlash(std::u16string_view s)
+{
+    return s.length() >= 3 && startsWithDriveColon(s) && s[2] == '\\';
+}
 
-bool startsWithSlashSlash(const rtl_uString* p) { return 
startsWithSlashSlash(p->buffer); }
+bool startsWithSlashSlash(std::u16string_view s) { return o3tl::starts_with(s, 
u"\\\\"); }
 
 // An absolute path starts either with \\ (an UNC or device path like \\.\ or 
\\?\)
 // or with a ASCII alpha character followed by colon followed by backslash.
-bool isAbsolute(const rtl_uString* p)
+bool isAbsolute(std::u16string_view s)
 {
-    return startsWithSlashSlash(p) || startsWithDriveColonSlash(p);
+    return startsWithSlashSlash(s) || startsWithDriveColonSlash(s);
 }
 
-bool onSameDrive(const rtl_uString* p1, const rtl_uString* p2)
+bool onSameDrive(std::u16string_view s1, std::u16string_view s2)
 {
-    return rtl::toAsciiUpperCase(p1->buffer[0]) == 
rtl::toAsciiUpperCase(p2->buffer[0])
-           && rtl::toAsciiUpperCase(p1->buffer[1]) == 
rtl::toAsciiUpperCase(p2->buffer[1]);
+    assert(startsWithDriveColon(s1) && startsWithDriveColon(s2));
+    return rtl::toAsciiUpperCase(s1[0]) == rtl::toAsciiUpperCase(s2[0]) && 
s1[1] == s2[1];
 }
 
-sal_Int32 getRootLength(const rtl_uString* path)
+sal_Int32 getRootLength(std::u16string_view path)
 {
     assert(isAbsolute(path));
-    const sal_Unicode* p = path->buffer;
-    sal_Int32 nResult = 0;
-    if (startsWithSlashSlash(p))
+    size_t nResult = 0;
+    if (startsWithSlashSlash(path))
     {
         // Cases:
         //   1. Device UNC: \\?\UNC\server\share or \\.\UNC\server\share
         //   2. Non-device UNC: \\server\share
         //   3. Device non-UNC: \\?\C: or \\.\C:
         bool bUNC = false;
-        if ((p[2] == '.' || p[2] == '?') && p[3] == '\\')
+        if (path.length() > 3 && (path[2] == '.' || path[2] == '?') && path[3] 
== '\\')
         {
-            if (p[4] == 'U' && p[5] == 'N' && p[6] == 'C' && p[7] == '\\')
+            if (path.substr(4, 4) == u"UNC\\")
             {
                 // \\?\UNC\server\share or \\.\UNC\server\share
                 nResult = 8;
@@ -99,7 +98,7 @@ sal_Int32 getRootLength(const rtl_uString* path)
             else
             {
                 // \\?\C: or \\.\C:
-                assert(startsWithDriveColon(p + 4));
+                assert(startsWithDriveColon(path.substr(4)));
                 nResult = 6;
             }
         }
@@ -112,11 +111,11 @@ sal_Int32 getRootLength(const rtl_uString* path)
         if (bUNC)
         {
             // \\?\UNC\server\share or \\.\UNC\server\share or \\server\share
-            assert(nResult < path->length && p[nResult] != '\\');
+            assert(nResult < path.length() && path[nResult] != '\\');
             // Skip server name and share name
-            for (int nSlashes = 0; nResult < path->length; ++nResult)
+            for (int nSlashes = 0; nResult < path.length(); ++nResult)
             {
-                if (p[nResult] == '\\' && ++nSlashes == 2)
+                if (path[nResult] == '\\' && ++nSlashes == 2)
                     break;
             }
         }
@@ -124,29 +123,29 @@ sal_Int32 getRootLength(const rtl_uString* path)
     else
     {
         // C:
-        assert(startsWithDriveColon(p));
+        assert(startsWithDriveColon(path));
         nResult = 2;
     }
-    return std::min(nResult, path->length);
+    return std::min(nResult, path.length());
 }
 
-std::u16string_view pathView(const rtl_uString* path, bool bOnlyRoot)
+std::u16string_view pathView(std::u16string_view path, bool bOnlyRoot)
 {
-    return std::u16string_view(path->buffer, bOnlyRoot ? getRootLength(path) : 
path->length);
+    return bOnlyRoot ? path.substr(0, getRootLength(path)) : path;
 }
 
-OUString combinePath(std::u16string_view basePath, const sal_Unicode* relPath)
+OUString combinePath(std::u16string_view basePath, std::u16string_view relPath)
 {
-    const bool needSep = basePath.back() != '\\' && relPath[0] != '\\';
+    const bool needSep = !o3tl::ends_with(basePath, u'\\');
     const auto sSeparator = needSep ? std::u16string_view(u"\\") : 
std::u16string_view();
-    if (basePath.back() == '\\' && relPath[0] == '\\')
-        ++relPath; // avoid two adjacent backslashes
+    if (o3tl::starts_with(relPath, u'\\'))
+        relPath.remove_prefix(1); // avoid two adjacent backslashes
     return OUString::Concat(basePath) + sSeparator + relPath;
 }
 
 OUString removeRelativeParts(const OUString& p)
 {
-    const sal_Int32 rootPos = getRootLength(p.pData);
+    const sal_Int32 rootPos = getRootLength(p);
     OUStringBuffer buf(p.getLength());
     buf.append(p.subView(0, rootPos));
     std::stack<sal_Int32> partPositions;
@@ -191,18 +190,24 @@ OUString removeRelativeParts(const OUString& p)
 }
 
 static bool IsValidFilePathComponent(
-    sal_Unicode const * lpComponent, sal_Unicode const **lppComponentEnd,
+    std::optional<std::u16string_view>& roComponent,
     DWORD dwFlags)
 {
-        sal_Unicode const * lpComponentEnd = nullptr;
-        sal_Unicode const * lpCurrent = lpComponent;
-        bool    bValid = true;  /* Assume success */
+        assert(roComponent);
+        auto lpComponentEnd = roComponent->end();
+        auto lpCurrent = roComponent->begin();
+        bool bValid = lpCurrent != lpComponentEnd; // Empty components are not 
allowed
         sal_Unicode cLast = 0;
 
-        /* Path component length must not exceed MAX_PATH even if long path 
with "\\?\" prefix is used */
-
-        while ( !lpComponentEnd && lpCurrent && lpCurrent - lpComponent < 
MAX_PATH )
+        while (bValid)
         {
+            /* Path component length must not exceed MAX_PATH even if long 
path with "\\?\" prefix is used */
+            if (lpCurrent - roComponent->begin() >= MAX_PATH)
+            {
+                bValid = false;
+                break;
+            }
+
             switch ( *lpCurrent )
             {
                 /* Both backslash and slash determine the end of a path 
component */
@@ -217,13 +222,13 @@ static bool IsValidFilePathComponent(
                     if ( dwFlags & VALIDATEPATH_ALLOW_ELLIPSE )
                     {
                         if ( (dwFlags & 
VALIDATEPATH_ALLOW_INVALID_SPACE_AND_PERIOD) ||
-                             1 == lpCurrent - lpComponent )
+                             1 == lpCurrent - roComponent->begin() )
                         {
                             /* Either do allow periods anywhere, or current 
directory */
                             lpComponentEnd = lpCurrent;
                             break;
                         }
-                        else if ( 2 == lpCurrent - lpComponent && '.' == 
*lpComponent )
+                        else if ( 2 == lpCurrent - roComponent->begin() && '.' 
== roComponent->front() )
                         {
                             /* Parent directory is O.K. */
                             lpComponentEnd = lpCurrent;
@@ -236,10 +241,7 @@ static bool IsValidFilePathComponent(
                     if ( dwFlags & VALIDATEPATH_ALLOW_INVALID_SPACE_AND_PERIOD 
)
                         lpComponentEnd = lpCurrent;
                     else
-                    {
-                        lpComponentEnd = lpCurrent - 1;
                         bValid = false;
-                    }
                     break;
                 default:
                     lpComponentEnd = lpCurrent;
@@ -254,101 +256,88 @@ static bool IsValidFilePathComponent(
             case '\"':
             case '|':
             case ':':
-                lpComponentEnd = lpCurrent;
                 bValid = false;
                 break;
             default:
                 /* Characters below ASCII 32 are not allowed */
                 if ( *lpCurrent < ' ' )
-                {
-                    lpComponentEnd = lpCurrent;
                     bValid = false;
-                }
                 break;
             }
-            cLast = *lpCurrent++;
-        }
 
-        /*  If we don't reached the end of the component the length of the 
component was too long
-            (See condition of while loop) */
-        if ( !lpComponentEnd )
-        {
-            bValid = false;
-            lpComponentEnd = lpCurrent;
+            if (lpCurrent != lpComponentEnd)
+                cLast = *lpCurrent++;
+
+            if (lpCurrent == lpComponentEnd)
+                break;
         }
 
         if ( bValid )
         {
             // Empty components are not allowed
-            if ( lpComponentEnd - lpComponent < 1 )
+            if (lpComponentEnd - roComponent->begin() < 1)
                 bValid = false;
-
-            // If we reached the end of the string nullptr is returned
-            else if ( !*lpComponentEnd )
-                lpComponentEnd = nullptr;
-
+            // If we reached the end of the string nullopt is returned
+            else if (lpComponentEnd == roComponent->end())
+                roComponent.reset();
+            else
+                roComponent->remove_prefix(lpComponentEnd - 
roComponent->begin());
         }
 
-        if ( lppComponentEnd )
-            *lppComponentEnd = lpComponentEnd;
-
         return bValid;
 }
 
-static sal_Int32 countInitialSeparators(sal_Unicode const * path) {
-    sal_Unicode const * p = path;
-    while (*p == '\\' || *p == '/') {
-        ++p;
-    }
-    return p - path;
+static sal_Int32 countInitialSeparators(std::u16string_view path) {
+    size_t n = 0;
+    while (n < path.length() && (path[n] == '\\' || path[n] == '/'))
+        ++n;
+    return n;
 }
 
-DWORD IsValidFilePath(rtl_uString *path, DWORD dwFlags, rtl_uString 
**corrected)
+DWORD IsValidFilePath(const OUString& path, DWORD dwFlags, OUString* corrected)
 {
-        sal_Unicode const * lpszPath = path->buffer;
-        sal_Unicode const * lpComponent = lpszPath;
+        std::optional<std::u16string_view> oComponent = path;
         bool    bValid = true;
         DWORD   dwPathType = PATHTYPE_ERROR;
-        sal_Int32 nLength = rtl_uString_getLength( path );
 
         if ( dwFlags & VALIDATEPATH_ALLOW_RELATIVE )
             dwFlags |= VALIDATEPATH_ALLOW_ELLIPSE;
 
         DWORD   dwCandidatPathType = PATHTYPE_ERROR;
 
-        if ( 0 == rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( 
path->buffer, nLength, WSTR_LONG_PATH_PREFIX_UNC, 
SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX_UNC) - 1, 
SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX_UNC) - 1 ) )
+        if (path.matchIgnoreAsciiCase(WSTR_LONG_PATH_PREFIX_UNC))
         {
             /* This is long path in UNC notation */
-            lpComponent = lpszPath + SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX_UNC) 
- 1;
+            oComponent = 
path.subView(SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX_UNC) - 1);
             dwCandidatPathType = PATHTYPE_ABSOLUTE_UNC | PATHTYPE_IS_LONGPATH;
         }
-        else if ( 0 == rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( 
path->buffer, nLength, WSTR_LONG_PATH_PREFIX, 
SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX) - 1, 
SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX) - 1 ) )
+        else if (path.matchIgnoreAsciiCase(WSTR_LONG_PATH_PREFIX))
         {
             /* This is long path */
-            lpComponent = lpszPath + SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX) - 1;
+            oComponent = path.subView(SAL_N_ELEMENTS(WSTR_LONG_PATH_PREFIX) - 
1);
 
-            if (startsWithDriveColon(lpComponent))
+            if (startsWithDriveColon(*oComponent))
             {
-                lpComponent += 2;
+                oComponent->remove_prefix(2);
                 dwCandidatPathType = PATHTYPE_ABSOLUTE_LOCAL | 
PATHTYPE_IS_LONGPATH;
             }
         }
-        else if ( 2 == countInitialSeparators( lpszPath ) )
+        else if ( 2 == countInitialSeparators(path) )
         {
             /* The UNC path notation */
-            lpComponent = lpszPath + 2;
+            oComponent = path.subView(2);
             dwCandidatPathType = PATHTYPE_ABSOLUTE_UNC;
         }
-        else if (startsWithDriveColon(lpszPath))
+        else if (startsWithDriveColon(path))
         {
             /* Local path verification. Must start with <drive>: */
-            lpComponent = lpszPath + 2;
+            oComponent = path.subView(2);
             dwCandidatPathType = PATHTYPE_ABSOLUTE_LOCAL;
         }
 
         if ( ( dwCandidatPathType & PATHTYPE_MASK_TYPE ) == 
PATHTYPE_ABSOLUTE_UNC )
         {
-            bValid = IsValidFilePathComponent( lpComponent, &lpComponent, 
VALIDATEPATH_ALLOW_ELLIPSE );
+            bValid = IsValidFilePathComponent(oComponent, 
VALIDATEPATH_ALLOW_ELLIPSE);
 
             /* So far we have a valid servername. Now let's see if we also 
have a network resource */
 
@@ -356,10 +345,14 @@ DWORD IsValidFilePath(rtl_uString *path, DWORD dwFlags, 
rtl_uString **corrected)
 
             if ( bValid )
             {
-                if ( lpComponent &&  !*++lpComponent )
-                    lpComponent = nullptr;
+                if (oComponent)
+                {
+                    oComponent->remove_prefix(1);
+                    if (oComponent->empty())
+                        oComponent.reset();
+                }
 
-                if ( !lpComponent )
+                if (!oComponent)
                 {
                     dwPathType |= PATHTYPE_IS_SERVER;
                 }
@@ -367,47 +360,53 @@ DWORD IsValidFilePath(rtl_uString *path, DWORD dwFlags, 
rtl_uString **corrected)
                 {
                     /* Now test the network resource */
 
-                    bValid = IsValidFilePathComponent( lpComponent, 
&lpComponent, 0 );
+                    bValid = IsValidFilePathComponent(oComponent, 0);
 
                     /* If we now reached the end of the path, everything is 
O.K. */
 
-                    if ( bValid && (!lpComponent || !*++lpComponent ) )
+                    if (bValid)
                     {
-                        lpComponent = nullptr;
-                        dwPathType |= PATHTYPE_IS_VOLUME;
+                        if (oComponent)
+                        {
+                            oComponent->remove_prefix(1);
+                            if (oComponent->empty())
+                                oComponent.reset();
+                        }
+                        if (!oComponent)
+                            dwPathType |= PATHTYPE_IS_VOLUME;
                     }
                 }
             }
         }
         else if (  ( dwCandidatPathType & PATHTYPE_MASK_TYPE ) == 
PATHTYPE_ABSOLUTE_LOCAL )
         {
-            if ( 1 == countInitialSeparators( lpComponent ) )
-                lpComponent++;
-            else if ( *lpComponent )
+            if (1 == countInitialSeparators(*oComponent))
+                oComponent->remove_prefix(1);
+            else if (!oComponent->empty())
                 bValid = false;
 
             dwPathType = dwCandidatPathType;
 
             /* Now we are behind the backslash or it was a simple drive 
without backslash */
 
-            if ( bValid && !*lpComponent )
+            if (bValid && oComponent->empty())
             {
-                lpComponent = nullptr;
+                oComponent.reset();
                 dwPathType |= PATHTYPE_IS_VOLUME;
             }
         }
         else if ( dwFlags & VALIDATEPATH_ALLOW_RELATIVE )
         {
             /* Can be a relative path */
-            lpComponent = lpszPath;
+            oComponent = path;
 
             /* Relative path can start with a backslash */
 
-            if ( 1 == countInitialSeparators( lpComponent ) )
+            if (1 == countInitialSeparators(*oComponent))
             {
-                lpComponent++;
-                if ( !*lpComponent )
-                    lpComponent = nullptr;
+                oComponent->remove_prefix(1);
+                if (oComponent->empty())
+                    oComponent.reset();
             }
 
             dwPathType = PATHTYPE_RELATIVE;
@@ -416,38 +415,36 @@ DWORD IsValidFilePath(rtl_uString *path, DWORD dwFlags, 
rtl_uString **corrected)
         {
             /* Anything else is an error */
             bValid = false;
-            lpComponent = lpszPath;
         }
 
         /* Now validate each component of the path */
-        rtl_uString * lastCorrected = path;
-        while ( bValid && lpComponent )
+        OUString lastCorrected = path;
+        while (bValid && oComponent)
         {
             // Correct path by merging consecutive slashes:
-            if (*lpComponent == '\\' && corrected != nullptr) {
-                sal_Int32 i = lpComponent - lpszPath;
-                rtl_uString_newReplaceStrAt(corrected, lastCorrected, i, 1, 
nullptr);
+            if (o3tl::starts_with(*oComponent, u"\\") && corrected != nullptr) 
{
+                sal_Int32 i = oComponent->data() - lastCorrected.getStr();
+                *corrected = lastCorrected.replaceAt(i, 1, {});
                     //TODO: handle out-of-memory
                 lastCorrected = *corrected;
-                lpszPath = (*corrected)->buffer;
-                lpComponent = lpszPath + i;
+                oComponent = lastCorrected.subView(i);
             }
 
-            bValid = IsValidFilePathComponent( lpComponent, &lpComponent, 
dwFlags | VALIDATEPATH_ALLOW_INVALID_SPACE_AND_PERIOD);
+            bValid = IsValidFilePathComponent(oComponent, dwFlags | 
VALIDATEPATH_ALLOW_INVALID_SPACE_AND_PERIOD);
 
-            if ( bValid && lpComponent )
+            if (bValid && oComponent)
             {
-                lpComponent++;
+                oComponent->remove_prefix(1);
 
                 /* If the string behind the backslash is empty, we've done */
 
-                if ( !*lpComponent )
-                    lpComponent = nullptr;
+                if (oComponent->empty())
+                    oComponent.reset();
             }
         }
 
         /* The path can be longer than MAX_PATH only in case it has the 
longpath prefix */
-        if ( bValid && !( dwPathType &  PATHTYPE_IS_LONGPATH ) && 
rtl_ustr_getLength( lpszPath ) >= MAX_PATH )
+        if (bValid && !(dwPathType & PATHTYPE_IS_LONGPATH) && path.getLength() 
>= MAX_PATH)
         {
             bValid = false;
         }
@@ -570,7 +567,7 @@ static OUString osl_encodeURL_(std::u16string_view sURL)
     return sEncodedURL.makeStringAndClear();
 }
 
-oslFileError osl_getSystemPathFromFileURL_( rtl_uString *strURL, rtl_uString 
**pustrPath, bool bAllowRelative )
+oslFileError osl_getSystemPathFromFileURL_(const OUString& strURL, rtl_uString 
**pustrPath, bool bAllowRelative)
 {
     OUString sTempPath;
     oslFileError        nError = osl_File_E_INVAL;  /* Assume failure */
@@ -578,15 +575,15 @@ oslFileError osl_getSystemPathFromFileURL_( rtl_uString 
*strURL, rtl_uString **p
     /*  If someone hasn't encoded the complete URL we convert it to UTF8 now 
to prevent from
         having a mixed encoded URL later */
 
-    OString sUTF8 = OUStringToOString(OUString::unacquired(&strURL), 
RTL_TEXTENCODING_UTF8);
+    OString sUTF8 = OUStringToOString(strURL, RTL_TEXTENCODING_UTF8);
 
     /* If the length of strUTF8 and strURL differs it indicates that the URL 
was not correct encoded */
 
     SAL_WARN_IF(
-        sUTF8.getLength() != strURL->length &&
-        0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( 
strURL->buffer, strURL->length, "file:\\", 6 )
+        sUTF8.getLength() != strURL.getLength() &&
+        0 == strURL.matchIgnoreAsciiCase("file:\\")
         , "sal.osl"
-        ,"osl_getSystemPathFromFileURL: \"" << OUString(strURL) << "\" is not 
encoded !!!");
+        ,"osl_getSystemPathFromFileURL: \"" << strURL << "\" is not encoded 
!!!");
 
     if (auto sDecodedURL = osl_decodeURL_(sUTF8))
     {
@@ -648,7 +645,7 @@ oslFileError osl_getSystemPathFromFileURL_( rtl_uString 
*strURL, rtl_uString **p
                 }
             }
 
-            if ( IsValidFilePath( sTempPath.pData, VALIDATEPATH_ALLOW_ELLIPSE, 
&sTempPath.pData ) )
+            if (IsValidFilePath(sTempPath, VALIDATEPATH_ALLOW_ELLIPSE, 
&sTempPath))
                 nError = osl_File_E_None;
         }
         else if ( bAllowRelative )  /* This maybe a relative file URL */
@@ -656,20 +653,20 @@ oslFileError osl_getSystemPathFromFileURL_( rtl_uString 
*strURL, rtl_uString **p
             /* In future the relative path could be converted to absolute if 
it is too long */
             sTempPath = *sDecodedURL;
 
-            if ( IsValidFilePath( sTempPath.pData, VALIDATEPATH_ALLOW_RELATIVE 
| VALIDATEPATH_ALLOW_ELLIPSE, &sTempPath.pData ) )
+            if (IsValidFilePath(sTempPath, VALIDATEPATH_ALLOW_RELATIVE | 
VALIDATEPATH_ALLOW_ELLIPSE, &sTempPath))
                 nError = osl_File_E_None;
         }
         else
           SAL_INFO_IF(nError, "sal.osl",
-              "osl_getSystemPathFromFileURL: \"" << OUString(strURL) << "\" is 
not an absolute FileURL");
+              "osl_getSystemPathFromFileURL: \"" << strURL << "\" is not an 
absolute FileURL");
 
     }
 
     if ( osl_File_E_None == nError )
-        rtl_uString_assign( pustrPath, sTempPath.pData );
+        rtl_uString_assign(pustrPath, sTempPath.pData);
 
     SAL_INFO_IF(nError, "sal.osl",
-        "osl_getSystemPathFromFileURL: \"" << OUString(strURL) << "\" is not a 
FileURL");
+        "osl_getSystemPathFromFileURL: \"" << strURL << "\" is not a FileURL");
 
     return nError;
 }
@@ -681,7 +678,7 @@ oslFileError osl_getFileURLFromSystemPath( rtl_uString* 
strPath, rtl_uString** p
     DWORD dwPathType = PATHTYPE_ERROR;
 
     if (strPath)
-        dwPathType = IsValidFilePath(strPath, VALIDATEPATH_ALLOW_RELATIVE, 
nullptr);
+        dwPathType = IsValidFilePath(OUString::unacquired(&strPath), 
VALIDATEPATH_ALLOW_RELATIVE, nullptr);
 
     if (dwPathType)
     {
@@ -748,14 +745,14 @@ oslFileError osl_getFileURLFromSystemPath( rtl_uString* 
strPath, rtl_uString** p
     }
 
     SAL_INFO_IF(nError, "sal.osl",
-        "osl_getFileURLFromSystemPath: \"" << OUString(strPath) << "\" is not 
a systemPath");
+        "osl_getFileURLFromSystemPath: \"" << OUString::unacquired(&strPath) 
<< "\" is not a systemPath");
     return nError;
 }
 
 oslFileError SAL_CALL osl_getSystemPathFromFileURL(
     rtl_uString *ustrURL, rtl_uString **pustrPath)
 {
-    return osl_getSystemPathFromFileURL_( ustrURL, pustrPath, true );
+    return osl_getSystemPathFromFileURL_(OUString::unacquired(&ustrURL), 
pustrPath, true);
 }
 
 oslFileError SAL_CALL osl_searchFileURL(
@@ -763,17 +760,17 @@ oslFileError SAL_CALL osl_searchFileURL(
     rtl_uString *ustrSystemSearchPath,
     rtl_uString **pustrPath)
 {
-    rtl_uString     *ustrUNCPath = nullptr;
-    rtl_uString     *ustrSysPath = nullptr;
+    OUString     ustrUNCPath;
+    OUString     ustrSysPath;
     oslFileError    error;
 
     /* First try to interpret the file name as a URL even a relative one */
-    error = osl_getSystemPathFromFileURL_( ustrFileName, &ustrUNCPath, true );
+    error = osl_getSystemPathFromFileURL_(OUString::unacquired(&ustrFileName), 
&ustrUNCPath.pData, true);
 
     /* So far we either have an UNC path or something invalid
        Now create a system path */
     if ( osl_File_E_None == error )
-        error = osl_getSystemPathFromFileURL_( ustrUNCPath, &ustrSysPath, true 
);
+        error = osl_getSystemPathFromFileURL_(ustrUNCPath, &ustrSysPath.pData, 
true);
 
     if ( osl_File_E_None == error )
     {
@@ -791,7 +788,7 @@ oslFileError SAL_CALL osl_searchFileURL(
         {
             /* If search path is empty use a nullptr pointer instead according 
to MSDN documentation of SearchPath */
             LPCWSTR lpszSearchPath = ustrSystemSearchPath && 
ustrSystemSearchPath->length ? o3tl::toW(ustrSystemSearchPath->buffer) : 
nullptr;
-            LPCWSTR lpszSearchFile = o3tl::toW(ustrSysPath->buffer);
+            LPCWSTR lpszSearchFile = o3tl::toW(ustrSysPath.getStr());
 
             /* Allocate space for buffer according to previous returned count 
of required chars */
             /* +1 is not necessary if we follow MSDN documentation but for 
robustness we do so */
@@ -808,8 +805,8 @@ oslFileError SAL_CALL osl_searchFileURL(
 
         if ( dwResult )
         {
-            rtl_uString_newFromStr( &ustrSysPath, o3tl::toU(lpBuffer) );
-            error = osl_getFileURLFromSystemPath( ustrSysPath, pustrPath );
+            ustrSysPath = o3tl::toU(lpBuffer);
+            error = osl_getFileURLFromSystemPath(ustrSysPath.pData, pustrPath);
         }
         else
         {
@@ -819,11 +816,11 @@ oslFileError SAL_CALL osl_searchFileURL(
             /* something went wrong, perhaps the path was absolute */
             error = oslTranslateFileError( GetLastError() );
 
-            hFind = FindFirstFileW( o3tl::toW(ustrSysPath->buffer), 
&aFindFileData );
+            hFind = FindFirstFileW(o3tl::toW(ustrSysPath.getStr()), 
&aFindFileData);
 
             if ( IsValidHandle(hFind) )
             {
-                error = osl_getFileURLFromSystemPath( ustrSysPath, pustrPath );
+                error = osl_getFileURLFromSystemPath(ustrSysPath.pData, 
pustrPath);
                 FindClose( hFind );
             }
         }
@@ -831,30 +828,24 @@ oslFileError SAL_CALL osl_searchFileURL(
         free( lpBuffer );
     }
 
-    if ( ustrSysPath )
-        rtl_uString_release( ustrSysPath );
-
-    if ( ustrUNCPath )
-        rtl_uString_release( ustrUNCPath );
-
     return error;
 }
 
 oslFileError SAL_CALL osl_getAbsoluteFileURL( rtl_uString* ustrBaseURL, 
rtl_uString* ustrRelativeURL, rtl_uString** pustrAbsoluteURL )
 {
     oslFileError eError = osl_File_E_None;
-    rtl_uString     *ustrRelSysPath = nullptr;
-    rtl_uString     *ustrBaseSysPath = nullptr;
+    OUString     ustrRelSysPath;
+    OUString     ustrBaseSysPath;
 
     if ( ustrBaseURL && ustrBaseURL->length )
     {
-        eError = osl_getSystemPathFromFileURL_( ustrBaseURL, &ustrBaseSysPath, 
false );
+        eError = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&ustrBaseURL), 
&ustrBaseSysPath.pData, false);
         OSL_ENSURE( osl_File_E_None == eError, "osl_getAbsoluteFileURL called 
with relative or invalid base URL" );
     }
     if (eError == osl_File_E_None)
     {
-        eError = osl_getSystemPathFromFileURL_(ustrRelativeURL, 
&ustrRelSysPath,
-                                               ustrBaseSysPath != nullptr);
+        eError = 
osl_getSystemPathFromFileURL_(OUString::unacquired(&ustrRelativeURL), 
&ustrRelSysPath.pData,
+                                               !ustrBaseSysPath.isEmpty());
         OSL_ENSURE( osl_File_E_None == eError, "osl_getAbsoluteFileURL called 
with empty base URL and/or invalid relative URL" );
     }
 
@@ -866,7 +857,7 @@ oslFileError SAL_CALL osl_getAbsoluteFileURL( rtl_uString* 
ustrBaseURL, rtl_uStr
   with the rtl/uri class.
 */
         // If ustrRelSysPath is absolute, we don't need ustrBaseSysPath.
-        if (ustrBaseSysPath && !isAbsolute(ustrRelSysPath))
+        if (!ustrBaseSysPath.isEmpty() && !isAbsolute(ustrRelSysPath))
         {
             // ustrBaseSysPath is known here to be a valid absolute path -> 
its first two characters
             // are ASCII (either alpha + colon, or double backslashes)
@@ -884,13 +875,12 @@ oslFileError SAL_CALL osl_getAbsoluteFileURL( 
rtl_uString* ustrBaseURL, rtl_uStr
                 // as is; otherwise, use current directory on ustrRelSysPath's 
drive as base path
                 if (onSameDrive(ustrRelSysPath, ustrBaseSysPath))
                 {
-                    sResultPath = 
combinePath(OUString::unacquired(&ustrBaseSysPath),
-                                              ustrRelSysPath->buffer + 2);
+                    sResultPath = combinePath(ustrBaseSysPath, 
ustrRelSysPath.subView(2));
                 }
                 else
                 {
                     // Call GetFullPathNameW to get current directory on 
ustrRelSysPath's drive
-                    wchar_t baseDrive[3] = { ustrRelSysPath->buffer[0], ':' }; 
// just "C:"
+                    wchar_t baseDrive[3] = { ustrRelSysPath[0], ':' }; // just 
"C:"
                     osl::LongPathBuffer<wchar_t> aBuf(MAX_LONG_PATH);
                     DWORD dwResult
                         = GetFullPathNameW(baseDrive, 
aBuf.getBufSizeInSymbols(), aBuf, nullptr);
@@ -899,7 +889,7 @@ oslFileError SAL_CALL osl_getAbsoluteFileURL( rtl_uString* 
ustrBaseURL, rtl_uStr
                         if (dwResult >= aBuf.getBufSizeInSymbols())
                             eError = osl_File_E_INVAL;
                         else
-                            sResultPath = combinePath(o3tl::toU(aBuf), 
ustrRelSysPath->buffer + 2);
+                            sResultPath = combinePath(o3tl::toU(aBuf), 
ustrRelSysPath.subView(2));
                     }
                     else
                         eError = oslTranslateFileError(GetLastError());
@@ -913,12 +903,12 @@ oslFileError SAL_CALL osl_getAbsoluteFileURL( 
rtl_uString* ustrBaseURL, rtl_uStr
                 //   => \\server\share\path2\to\file
                 // ustrBaseSysPath is "D:\path1\" and ustrRelSysPath is 
"\path2\to\file"
                 //   => D:\path2\to\file
-                auto sBaseView(pathView(ustrBaseSysPath, 
ustrRelSysPath->buffer[0] == '\\'));
-                sResultPath = combinePath(sBaseView, ustrRelSysPath->buffer);
+                auto sBaseView(pathView(ustrBaseSysPath, 
ustrRelSysPath.startsWith("\\")));
+                sResultPath = combinePath(sBaseView, ustrRelSysPath);
             }
         }
         else
-            sResultPath = OUString::unacquired(&ustrRelSysPath);
+            sResultPath = ustrRelSysPath;
 
         if (eError == osl_File_E_None)
         {
@@ -927,12 +917,6 @@ oslFileError SAL_CALL osl_getAbsoluteFileURL( rtl_uString* 
ustrBaseURL, rtl_uStr
         }
     }
 
-    if ( ustrBaseSysPath )
-        rtl_uString_release( ustrBaseSysPath );
-
-    if ( ustrRelSysPath )
-        rtl_uString_release( ustrRelSysPath );
-
     return  eError;
 }
 
diff --git a/sal/osl/w32/file_url.hxx b/sal/osl/w32/file_url.hxx
index d5d5c6952cd6..86ce27060db7 100644
--- a/sal/osl/w32/file_url.hxx
+++ b/sal/osl/w32/file_url.hxx
@@ -21,7 +21,7 @@
 #define INCLUDED_SAL_OSL_W32_FILE_URL_HXX
 
 #include <sal/types.h>
-#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
 #include <osl/file.h>
 #include <osl/mutex.hxx>
 
@@ -47,14 +47,14 @@
 #define MAX_LONG_PATH 32767
 
 DWORD IsValidFilePath (
-    rtl_uString *  path,
+    const OUString&  path,
     DWORD          dwFlags,
-    rtl_uString ** corrected
+    OUString* corrected
 );
 
 oslFileError osl_getSystemPathFromFileURL_ (
-    rtl_uString * strURL,
-    rtl_uString ** pustrPath,
+    const OUString& strURL,
+    rtl_uString** pustrPath,
     bool bAllowRelative
 );
 
diff --git a/sal/osl/w32/tempfile.cxx b/sal/osl/w32/tempfile.cxx
index 5d5d758ce244..f0065bf2d8ef 100644
--- a/sal/osl/w32/tempfile.cxx
+++ b/sal/osl/w32/tempfile.cxx
@@ -41,26 +41,20 @@ static oslFileError osl_setup_base_directory_impl_(
     rtl_uString*  pustrDirectoryURL,
     rtl_uString** ppustr_base_dir)
 {
-    rtl_uString* dir_url = nullptr;
-    rtl_uString* dir     = nullptr;
+    OUString dir_url;
+    OUString dir;
     oslFileError error   = osl_File_E_None;
 
     if (pustrDirectoryURL)
-        rtl_uString_assign(&dir_url, pustrDirectoryURL);
+        dir_url = pustrDirectoryURL;
     else
-        error = osl_getTempDirURL(&dir_url);
+        error = osl_getTempDirURL(&dir_url.pData);
 
     if (error == osl_File_E_None)
-    {
-        error = osl_getSystemPathFromFileURL_(dir_url, &dir, false);
-        rtl_uString_release(dir_url);
-    }
+        error = osl_getSystemPathFromFileURL_(dir_url, &dir.pData, false);
 
     if (error == osl_File_E_None)
-    {
-        rtl_uString_assign(ppustr_base_dir, dir);
-        rtl_uString_release(dir);
-    }
+        rtl_uString_assign(ppustr_base_dir, dir.pData);
 
     return error;
 }

Reply via email to