summaryrefslogtreecommitdiff
path: root/sal/osl
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2024-02-20 18:01:47 +0600
committerMike Kaganski <mike.kaganski@collabora.com>2024-02-20 16:56:43 +0100
commit2567f58f20cdc38b6ed92c639c0fcb19af84295f (patch)
treebf3bd761b2239bb387c9cae164671c8520a4783c /sal/osl
parentc14574e7ad2d3ec2ada40808be3332fac71e9767 (diff)
Simplify a bit
Change-Id: Icc7589bdf5d2e3d061dfa3d34761316d9e9323be Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163653 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'sal/osl')
-rw-r--r--sal/osl/w32/file_dirvol.cxx205
1 files changed, 77 insertions, 128 deletions
diff --git a/sal/osl/w32/file_dirvol.cxx b/sal/osl/w32/file_dirvol.cxx
index ca1709fcdf0c..939af1d03807 100644
--- a/sal/osl/w32/file_dirvol.cxx
+++ b/sal/osl/w32/file_dirvol.cxx
@@ -31,8 +31,7 @@
#include <sal/log.hxx>
#include <o3tl/char16_t2wchar_t.hxx>
-const wchar_t BACKSLASH = '\\';
-const wchar_t SLASH = '/';
+#include <memory>
BOOL TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime)
{
@@ -163,7 +162,7 @@ void systemPathRemoveSeparator(/*inout*/ OUString& path)
UNCComponents uncc;
uncc.server_.begin_ = ppos;
- while ((ppos < pend) && (*ppos != BACKSLASH))
+ while ((ppos < pend) && (*ppos != '\\'))
ppos++;
uncc.server_.end_ = ppos;
@@ -171,18 +170,15 @@ void systemPathRemoveSeparator(/*inout*/ OUString& path)
if (ppos < pend)
{
uncc.share_.begin_ = ++ppos;
- while ((ppos < pend) && (*ppos != BACKSLASH))
+ while ((ppos < pend) && (*ppos != '\\'))
ppos++;
uncc.share_.end_ = ppos;
if (ppos < pend)
{
- uncc.resource_.begin_ = ++ppos;
- while (ppos < pend)
- ppos++;
-
- uncc.resource_.end_ = ppos;
+ uncc.resource_.begin_ = ppos + 1;
+ uncc.resource_.end_ = pend;
}
}
@@ -289,7 +285,7 @@ typedef struct tagDRIVEENUM
}
-static HANDLE WINAPI OpenLogicalDrivesEnum()
+static HANDLE OpenLogicalDrivesEnum()
{
LPDRIVEENUM pEnum = static_cast<LPDRIVEENUM>(HeapAlloc( GetProcessHeap(), 0, sizeof(DRIVEENUM) ));
if ( pEnum )
@@ -310,7 +306,7 @@ static HANDLE WINAPI OpenLogicalDrivesEnum()
return pEnum ? static_cast<HANDLE>(pEnum) : INVALID_HANDLE_VALUE;
}
-static bool WINAPI EnumLogicalDrives(HANDLE hEnum, LPWSTR lpBuffer)
+static bool EnumLogicalDrives(HANDLE hEnum, LPWSTR lpBuffer)
{
LPDRIVEENUM pEnum = static_cast<LPDRIVEENUM>(hEnum);
if ( !pEnum )
@@ -331,7 +327,7 @@ static bool WINAPI EnumLogicalDrives(HANDLE hEnum, LPWSTR lpBuffer)
return true;
}
-static bool WINAPI CloseLogicalDrivesEnum(HANDLE hEnum)
+static bool CloseLogicalDrivesEnum(HANDLE hEnum)
{
bool fSuccess = false;
LPDRIVEENUM pEnum = static_cast<LPDRIVEENUM>(hEnum);
@@ -357,36 +353,26 @@ typedef struct tagDIRECTORY
}
-static HANDLE WINAPI OpenDirectory( rtl_uString* pPath)
+static HANDLE OpenDirectory(const OUString& path)
{
- if ( !pPath )
- return nullptr;
-
- sal_uInt32 nLen = rtl_uString_getLength( pPath );
- if ( !nLen )
+ if (path.isEmpty())
return nullptr;
- const WCHAR* pSuffix = nullptr;
- sal_uInt32 nSuffLen = 0;
- if ( pPath->buffer[nLen - 1] != L'\\' )
- {
- pSuffix = L"\\*.*";
- nSuffLen = 4;
- }
+ std::u16string_view suffix;
+ if (!path.endsWith(u"\\"))
+ suffix = u"*.*";
else
- {
- pSuffix = L"*.*";
- nSuffLen = 3;
- }
+ suffix = u"\\*.*";
- WCHAR* szFileMask = static_cast< WCHAR* >( malloc( sizeof( WCHAR ) * ( nLen + nSuffLen + 1 ) ) );
+ std::unique_ptr<WCHAR[]> szFileMask(new (std::nothrow) WCHAR[path.getLength() + suffix.length() + 1]);
assert(szFileMask); // Don't handle OOM conditions
- wcscpy( szFileMask, o3tl::toW(rtl_uString_getStr( pPath )) );
- wcscat( szFileMask, pSuffix );
+ WCHAR* pos = std::copy_n(path.getStr(), path.getLength(), szFileMask.get());
+ pos = std::copy_n(suffix.data(), suffix.length(), pos);
+ *pos = 0;
LPDIRECTORY pDirectory = static_cast<LPDIRECTORY>(HeapAlloc(GetProcessHeap(), 0, sizeof(DIRECTORY)));
assert(pDirectory); // Don't handle OOM conditions
- pDirectory->hFind = FindFirstFileW(szFileMask, &pDirectory->aFirstData);
+ pDirectory->hFind = FindFirstFileW(szFileMask.get(), &pDirectory->aFirstData);
if (!IsValidHandle(pDirectory->hFind))
{
@@ -396,12 +382,11 @@ static HANDLE WINAPI OpenDirectory( rtl_uString* pPath)
pDirectory = nullptr;
}
}
- free(szFileMask);
return static_cast<HANDLE>(pDirectory);
}
-static bool WINAPI EnumDirectory(HANDLE hDirectory, LPWIN32_FIND_DATAW pFindData)
+static bool EnumDirectory(HANDLE hDirectory, LPWIN32_FIND_DATAW pFindData)
{
LPDIRECTORY pDirectory = static_cast<LPDIRECTORY>(hDirectory);
if ( !pDirectory )
@@ -435,7 +420,7 @@ static bool WINAPI EnumDirectory(HANDLE hDirectory, LPWIN32_FIND_DATAW pFindData
return fSuccess;
}
-static bool WINAPI CloseDirectory(HANDLE hDirectory)
+static bool CloseDirectory(HANDLE hDirectory)
{
bool fSuccess = false;
LPDIRECTORY pDirectory = static_cast<LPDIRECTORY>(hDirectory);
@@ -466,7 +451,7 @@ static oslFileError osl_openLocalRoot(
if ( osl_File_E_None != error )
return error;
- Directory_Impl* pDirImpl = new (std::nothrow) Directory_Impl;
+ std::unique_ptr<Directory_Impl> pDirImpl(new (std::nothrow) Directory_Impl);
assert(pDirImpl); // Don't handle OOM conditions
pDirImpl->m_sDirectoryPath = strSysPath;
@@ -487,34 +472,21 @@ static oslFileError osl_openLocalRoot(
/* @@@ToDo
Use IsValidHandle(...)
*/
- if ( pDirImpl->hEnumDrives != INVALID_HANDLE_VALUE )
- {
- *pDirectory = static_cast<oslDirectory>(pDirImpl);
- error = osl_File_E_None;
- }
- else
- {
- if ( pDirImpl )
- {
- delete pDirImpl;
- pDirImpl = nullptr;
- }
+ if (pDirImpl->hEnumDrives == INVALID_HANDLE_VALUE)
+ return oslTranslateFileError(GetLastError());
- error = oslTranslateFileError( GetLastError() );
- }
- return error;
+ *pDirectory = pDirImpl.release();
+ return osl_File_E_None;
}
static oslFileError osl_openFileDirectory(
rtl_uString *strDirectoryPath, oslDirectory *pDirectory)
{
- oslFileError error = osl_File_E_None;
-
if ( !pDirectory )
return osl_File_E_INVAL;
*pDirectory = nullptr;
- Directory_Impl *pDirImpl = new (std::nothrow) Directory_Impl;
+ std::unique_ptr<Directory_Impl> pDirImpl(new (std::nothrow) Directory_Impl);
assert(pDirImpl); // Don't handle OOM conditions
pDirImpl->m_sDirectoryPath = strDirectoryPath;
@@ -528,18 +500,13 @@ static oslFileError osl_openFileDirectory(
pDirImpl->m_sDirectoryPath += "\\";
pDirImpl->uType = DIRECTORYTYPE_FILESYSTEM;
- pDirImpl->hDirectory = OpenDirectory( pDirImpl->m_sDirectoryPath.pData );
+ pDirImpl->hDirectory = OpenDirectory(pDirImpl->m_sDirectoryPath);
if ( !pDirImpl->hDirectory )
- {
- error = oslTranslateFileError( GetLastError() );
-
- delete pDirImpl;
- pDirImpl = nullptr;
- }
+ return oslTranslateFileError(GetLastError());
- *pDirectory = static_cast<oslDirectory>(pDirImpl);
- return error;
+ *pDirectory = pDirImpl.release();
+ return osl_File_E_None;
}
static oslFileError osl_openNetworkServer(
@@ -595,7 +562,7 @@ static DWORD create_dir_with_callback(
return GetLastError();
}
-static int path_make_parent(sal_Unicode* path)
+static sal_Int32 path_make_parent(rtl_uString* path)
{
/* Cut off the last part of the given path to
get the parent only, e.g. 'c:\dir\subdir' ->
@@ -605,12 +572,13 @@ static int path_make_parent(sal_Unicode* path)
If there are no more parents 0 will be returned,
e.g. 'c:\' or '\\Share' have no more parents */
- OSL_PRECOND(rtl_ustr_indexOfChar(path, SLASH) == -1, "Path must not contain slashes");
- OSL_PRECOND(has_path_parent(path), "Path must have a parent");
+ OSL_PRECOND(OUString::unacquired(&path).indexOf('/') == -1, "Path must not contain slashes");
+ OSL_PRECOND(has_path_parent(OUString::unacquired(&path)), "Path must have a parent");
- sal_Unicode* pos_last_backslash = path + rtl_ustr_lastIndexOfChar(path, BACKSLASH);
- *pos_last_backslash = 0;
- return (pos_last_backslash - path);
+ sal_Int32 pos = OUString::unacquired(&path).lastIndexOf('\\');
+ assert(pos >= 0);
+ *(path->buffer + pos) = 0;
+ return pos;
}
static DWORD create_dir_recursively_(
@@ -618,21 +586,22 @@ static DWORD create_dir_recursively_(
oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
void* pData)
{
- OSL_PRECOND(
- rtl_ustr_lastIndexOfChar_WithLength(dir_path->buffer, dir_path->length, BACKSLASH) != dir_path->length,
+ OSL_PRECOND(!OUString::unacquired(&dir_path).endsWith(u"\\"),
"Path must not end with a backslash");
DWORD w32_error = create_dir_with_callback(
dir_path, aDirectoryCreationCallbackFunc, pData);
- if ((w32_error != ERROR_PATH_NOT_FOUND) || !has_path_parent(dir_path->buffer))
+ if ((w32_error != ERROR_PATH_NOT_FOUND) || !has_path_parent(OUString::unacquired(&dir_path)))
return w32_error;
- int pos = path_make_parent(dir_path->buffer); // dir_path->buffer[pos] = 0, restore below
+ const sal_Int32 oldLen = dir_path->length;
+ dir_path->length = path_make_parent(dir_path); // dir_path->buffer[pos] = 0, restore below
w32_error = create_dir_recursively_(
dir_path, aDirectoryCreationCallbackFunc, pData);
- dir_path->buffer[pos] = BACKSLASH; // restore
+ dir_path->buffer[dir_path->length] = '\\'; // restore
+ dir_path->length = oldLen;
if (ERROR_SUCCESS != w32_error && ERROR_ALREADY_EXISTS != w32_error)
return w32_error;
@@ -783,8 +752,6 @@ static oslFileError osl_getNextDrive(
oslDirectory Directory, oslDirectoryItem *pItem, sal_uInt32 /*uHint*/ )
{
Directory_Impl *pDirImpl = static_cast<Directory_Impl *>(Directory);
- DirectoryItem_Impl *pItemImpl = nullptr;
- bool fSuccess;
if ( !pItem )
return osl_File_E_INVAL;
@@ -793,32 +760,23 @@ static oslFileError osl_getNextDrive(
if ( !pDirImpl )
return osl_File_E_INVAL;
- pItemImpl = new (std::nothrow) DirectoryItem_Impl;
+ std::unique_ptr<DirectoryItem_Impl> pItemImpl(new (std::nothrow) DirectoryItem_Impl);
if ( !pItemImpl )
return osl_File_E_NOMEM;
pItemImpl->uType = DIRECTORYITEM_DRIVE;
- osl_acquireDirectoryItem( static_cast<oslDirectoryItem>(pItemImpl) );
- fSuccess = EnumLogicalDrives( pDirImpl->hEnumDrives, pItemImpl->cDriveString );
+ osl_acquireDirectoryItem(pItemImpl.get());
+ if (!EnumLogicalDrives(pDirImpl->hEnumDrives, pItemImpl->cDriveString))
+ return oslTranslateFileError(GetLastError());
- if ( fSuccess )
- {
- *pItem = pItemImpl;
- return osl_File_E_None;
- }
- else
- {
- delete pItemImpl;
- return oslTranslateFileError( GetLastError() );
- }
+ *pItem = pItemImpl.release();
+ return osl_File_E_None;
}
static oslFileError osl_getNextFileItem(
oslDirectory Directory, oslDirectoryItem *pItem, sal_uInt32 /*uHint*/)
{
Directory_Impl *pDirImpl = static_cast<Directory_Impl *>(Directory);
- DirectoryItem_Impl *pItemImpl = nullptr;
- bool fFound;
if ( !pItem )
return osl_File_E_INVAL;
@@ -827,16 +785,12 @@ static oslFileError osl_getNextFileItem(
if ( !pDirImpl )
return osl_File_E_INVAL;
- pItemImpl = new (std::nothrow) DirectoryItem_Impl;
+ std::unique_ptr<DirectoryItem_Impl> pItemImpl(new (std::nothrow) DirectoryItem_Impl);
if ( !pItemImpl )
return osl_File_E_NOMEM;
- fFound = EnumDirectory( pDirImpl->hDirectory, &pItemImpl->FindData );
- if ( !fFound )
- {
- delete pItemImpl;
+ if (!EnumDirectory(pDirImpl->hDirectory, &pItemImpl->FindData))
return oslTranslateFileError( GetLastError() );
- }
pItemImpl->uType = DIRECTORYITEM_FILE;
pItemImpl->nRefCount = 1;
@@ -844,7 +798,7 @@ static oslFileError osl_getNextFileItem(
pItemImpl->m_sFullPath = pDirImpl->m_sDirectoryPath + o3tl::toU(pItemImpl->FindData.cFileName);
pItemImpl->bFullPathNormalized = true;
- *pItem = static_cast<oslDirectoryItem>(pItemImpl);
+ *pItem = pItemImpl.release();
return osl_File_E_None;
}
@@ -955,28 +909,25 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString *strFilePath, oslDirector
DirectoryItem_Impl* pItemImpl = new (std::nothrow) DirectoryItem_Impl;
if ( !pItemImpl )
- error = osl_File_E_NOMEM;
+ return osl_File_E_NOMEM;
- if ( osl_File_E_None == error )
- {
- pItemImpl->uType = DIRECTORYITEM_SERVER;
+ pItemImpl->uType = DIRECTORYITEM_SERVER;
- osl_acquireDirectoryItem( static_cast<oslDirectoryItem>(pItemImpl) );
- pItemImpl->m_sFullPath = strSysFilePath;
+ osl_acquireDirectoryItem(pItemImpl);
+ pItemImpl->m_sFullPath = strSysFilePath;
- // Assign a title anyway
- {
- int iSrc = 2;
- int iDst = 0;
+ // Assign a title anyway
+ {
+ int iSrc = 2;
+ int iDst = 0;
- while( iSrc < strSysFilePath.getLength() && strSysFilePath[iSrc] && strSysFilePath[iSrc] != '\\')
- {
- pItemImpl->FindData.cFileName[iDst++] = strSysFilePath[iSrc++];
- }
+ while( iSrc < strSysFilePath.getLength() && strSysFilePath[iSrc] && strSysFilePath[iSrc] != '\\')
+ {
+ pItemImpl->FindData.cFileName[iDst++] = strSysFilePath[iSrc++];
}
-
- *pItem = pItemImpl;
}
+
+ *pItem = pItemImpl;
}
break;
case PATHTYPE_VOLUME:
@@ -984,22 +935,20 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString *strFilePath, oslDirector
DirectoryItem_Impl* pItemImpl = new (std::nothrow) DirectoryItem_Impl;
if ( !pItemImpl )
- error = osl_File_E_NOMEM;
+ return osl_File_E_NOMEM;
- if ( osl_File_E_None == error )
- {
- pItemImpl->uType = DIRECTORYITEM_DRIVE;
+ pItemImpl->uType = DIRECTORYITEM_DRIVE;
- osl_acquireDirectoryItem( static_cast<oslDirectoryItem>(pItemImpl) );
+ osl_acquireDirectoryItem(pItemImpl);
- wcscpy( pItemImpl->cDriveString, o3tl::toW(strSysFilePath.getStr()) );
- pItemImpl->cDriveString[0] = rtl::toAsciiUpperCase( pItemImpl->cDriveString[0] );
+ auto pos = std::copy_n(strSysFilePath.getStr(), strSysFilePath.getLength(), pItemImpl->cDriveString);
+ pItemImpl->cDriveString[0] = rtl::toAsciiUpperCase( pItemImpl->cDriveString[0] );
- if ( pItemImpl->cDriveString[wcslen(pItemImpl->cDriveString) - 1] != '\\' )
- wcscat( pItemImpl->cDriveString, L"\\" );
+ if (!strSysFilePath.endsWith(u"\\"))
+ *pos++ = '\\';
+ *pos = 0;
- *pItem = pItemImpl;
- }
+ *pItem = pItemImpl;
}
break;
case PATHTYPE_SYNTAXERROR:
@@ -1314,11 +1263,11 @@ static oslFileError get_filesystem_attributes(
static bool path_get_parent(OUString& path)
{
- OSL_PRECOND(path.lastIndexOf(SLASH) == -1, "Path must not have slashes");
+ OSL_PRECOND(path.lastIndexOf('/') == -1, "Path must not have slashes");
if (!has_path_parent(path))
{
- sal_Int32 i = path.lastIndexOf(BACKSLASH);
+ sal_Int32 i = path.lastIndexOf('\\');
if (-1 < i)
{
path = path.copy(0, i);