sal/osl/w32/file_dirvol.cxx | 152 +++++++++++--------------------------------- 1 file changed, 39 insertions(+), 113 deletions(-)
New commits: commit 61462eff266903fe495ecd185ca84b57f6cb3cd8 Author: Noel Grandin <n...@peralex.com> AuthorDate: Thu Apr 15 10:36:08 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Sat Apr 17 08:41:12 2021 +0200 use OUString in dir handling operations which simplifies things nicely Change-Id: I1bcc1dae9a7f2e4bbadfacff1332b7453c0c29b5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114131 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sal/osl/w32/file_dirvol.cxx b/sal/osl/w32/file_dirvol.cxx index 0b8824674d79..d7d03501f0e1 100644 --- a/sal/osl/w32/file_dirvol.cxx +++ b/sal/osl/w32/file_dirvol.cxx @@ -225,14 +225,14 @@ namespace { struct DirectoryItem_Impl { - UINT uType; + UINT uType = 0; union { WIN32_FIND_DATAW FindData; WCHAR cDriveString[MAX_PATH]; }; - rtl_uString* m_pFullPath; - bool bFullPathNormalized; - int nRefCount; + OUString m_sFullPath; + bool bFullPathNormalized = false; + int nRefCount = 0; }; } @@ -245,12 +245,12 @@ namespace { struct Directory_Impl { - UINT uType; + UINT uType = 0; union { - HANDLE hDirectory; + HANDLE hDirectory = 0; HANDLE hEnumDrives; }; - rtl_uString* m_pDirectoryPath; + OUString m_sDirectoryPath; }; typedef struct tagDRIVEENUM @@ -447,29 +447,19 @@ static oslFileError osl_openLocalRoot( error = osl_getSystemPathFromFileURL_( strDirectoryPath, &strSysPath, false ); if ( osl_File_E_None == error ) { - Directory_Impl *pDirImpl; - - pDirImpl = static_cast<Directory_Impl*>(malloc( sizeof(Directory_Impl))); + Directory_Impl* pDirImpl = new (std::nothrow) Directory_Impl; assert(pDirImpl); // Don't handle OOM conditions - ZeroMemory( pDirImpl, sizeof(Directory_Impl) ); - rtl_uString_newFromString( &pDirImpl->m_pDirectoryPath, strSysPath ); + pDirImpl->m_sDirectoryPath = OUString(strSysPath, SAL_NO_ACQUIRE); /* Append backslash if necessary */ /* @@@ToDo use function ensure backslash */ - sal_uInt32 nLen = rtl_uString_getLength( pDirImpl->m_pDirectoryPath ); - if ( nLen && pDirImpl->m_pDirectoryPath->buffer[nLen - 1] != L'\\' ) + sal_uInt32 nLen = pDirImpl->m_sDirectoryPath.getLength(); + if ( nLen && pDirImpl->m_sDirectoryPath[nLen - 1] != L'\\' ) { - rtl_uString* pCurDir = nullptr; - rtl_uString* pBackSlash = nullptr; - - rtl_uString_assign( &pCurDir, pDirImpl->m_pDirectoryPath ); - rtl_uString_newFromAscii( &pBackSlash, "\\" ); - rtl_uString_newConcat( &pDirImpl->m_pDirectoryPath, pCurDir, pBackSlash ); - rtl_uString_release( pBackSlash ); - rtl_uString_release( pCurDir ); + pDirImpl->m_sDirectoryPath += "\\"; } pDirImpl->uType = DIRECTORYTYPE_LOCALROOT; @@ -487,20 +477,12 @@ static oslFileError osl_openLocalRoot( { if ( pDirImpl ) { - if ( pDirImpl->m_pDirectoryPath ) - { - rtl_uString_release( pDirImpl->m_pDirectoryPath ); - pDirImpl->m_pDirectoryPath = nullptr; - } - - free(pDirImpl); + delete pDirImpl; pDirImpl = nullptr; } error = oslTranslateFileError( GetLastError() ); } - - rtl_uString_release( strSysPath ); } return error; } @@ -514,43 +496,27 @@ static oslFileError osl_openFileDirectory( return osl_File_E_INVAL; *pDirectory = nullptr; - Directory_Impl *pDirImpl = static_cast<Directory_Impl*>(malloc(sizeof(Directory_Impl))); + Directory_Impl *pDirImpl = new (std::nothrow) Directory_Impl; assert(pDirImpl); // Don't handle OOM conditions - ZeroMemory( pDirImpl, sizeof(Directory_Impl) ); - rtl_uString_newFromString( &pDirImpl->m_pDirectoryPath, strDirectoryPath ); + pDirImpl->m_sDirectoryPath = strDirectoryPath; /* Append backslash if necessary */ /* @@@ToDo use function ensure backslash */ - sal_uInt32 nLen = rtl_uString_getLength( pDirImpl->m_pDirectoryPath ); - if ( nLen && pDirImpl->m_pDirectoryPath->buffer[nLen - 1] != L'\\' ) - { - rtl_uString* pCurDir = nullptr; - rtl_uString* pBackSlash = nullptr; - - rtl_uString_assign( &pCurDir, pDirImpl->m_pDirectoryPath ); - rtl_uString_newFromAscii( &pBackSlash, "\\" ); - rtl_uString_newConcat( &pDirImpl->m_pDirectoryPath, pCurDir, pBackSlash ); - rtl_uString_release( pBackSlash ); - rtl_uString_release( pCurDir ); - } + sal_uInt32 nLen = pDirImpl->m_sDirectoryPath.getLength(); + if ( nLen && pDirImpl->m_sDirectoryPath[nLen - 1] != '\\' ) + pDirImpl->m_sDirectoryPath += "\\"; pDirImpl->uType = DIRECTORYTYPE_FILESYSTEM; - pDirImpl->hDirectory = OpenDirectory( pDirImpl->m_pDirectoryPath ); + pDirImpl->hDirectory = OpenDirectory( pDirImpl->m_sDirectoryPath.pData ); if ( !pDirImpl->hDirectory ) { error = oslTranslateFileError( GetLastError() ); - if ( pDirImpl->m_pDirectoryPath ) - { - rtl_uString_release( pDirImpl->m_pDirectoryPath ); - pDirImpl->m_pDirectoryPath = nullptr; - } - - free(pDirImpl); + delete pDirImpl; pDirImpl = nullptr; } @@ -578,11 +544,8 @@ static oslFileError osl_openNetworkServer( if ( ERROR_SUCCESS == dwError ) { - Directory_Impl *pDirImpl; - - pDirImpl = static_cast<Directory_Impl*>(malloc(sizeof(Directory_Impl))); + Directory_Impl *pDirImpl = new (std::nothrow) Directory_Impl; assert(pDirImpl); // Don't handle OOM conditions - ZeroMemory( pDirImpl, sizeof(Directory_Impl) ); pDirImpl->uType = DIRECTORYTYPE_NETROOT; pDirImpl->hDirectory = hEnum; *pDirectory = static_cast<oslDirectory>(pDirImpl); @@ -799,11 +762,10 @@ static oslFileError osl_getNextNetResource( case NO_ERROR: case ERROR_MORE_DATA: { - pItemImpl = static_cast<DirectoryItem_Impl*>(malloc(sizeof(DirectoryItem_Impl))); + pItemImpl = new (std::nothrow) DirectoryItem_Impl; if ( !pItemImpl ) return osl_File_E_NOMEM; - ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) ); pItemImpl->uType = DIRECTORYITEM_DRIVE; osl_acquireDirectoryItem( static_cast<oslDirectoryItem>(pItemImpl) ); @@ -833,11 +795,10 @@ static oslFileError osl_getNextDrive( if ( !pDirImpl ) return osl_File_E_INVAL; - pItemImpl = static_cast<DirectoryItem_Impl*>(malloc(sizeof(DirectoryItem_Impl))); + pItemImpl = new (std::nothrow) DirectoryItem_Impl; if ( !pItemImpl ) return osl_File_E_NOMEM; - ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) ); pItemImpl->uType = DIRECTORYITEM_DRIVE; osl_acquireDirectoryItem( static_cast<oslDirectoryItem>(pItemImpl) ); fSuccess = EnumLogicalDrives( pDirImpl->hEnumDrives, pItemImpl->cDriveString ); @@ -849,13 +810,7 @@ static oslFileError osl_getNextDrive( } else { - if ( pItemImpl->m_pFullPath ) - { - rtl_uString_release( pItemImpl->m_pFullPath ); - pItemImpl->m_pFullPath = nullptr; - } - - free( pItemImpl ); + delete pItemImpl; return oslTranslateFileError( GetLastError() ); } } @@ -874,7 +829,7 @@ static oslFileError osl_getNextFileItem( if ( !pDirImpl ) return osl_File_E_INVAL; - pItemImpl = static_cast<DirectoryItem_Impl*>(calloc(1, sizeof(DirectoryItem_Impl))); + pItemImpl = new (std::nothrow) DirectoryItem_Impl; if ( !pItemImpl ) return osl_File_E_NOMEM; @@ -885,10 +840,7 @@ static oslFileError osl_getNextFileItem( pItemImpl->uType = DIRECTORYITEM_FILE; pItemImpl->nRefCount = 1; - rtl_uString* pTmpFileName = nullptr; - rtl_uString_newFromStr( &pTmpFileName, o3tl::toU(pItemImpl->FindData.cFileName) ); - rtl_uString_newConcat( &pItemImpl->m_pFullPath, pDirImpl->m_pDirectoryPath, pTmpFileName ); - rtl_uString_release( pTmpFileName ); + pItemImpl->m_sFullPath = pDirImpl->m_sDirectoryPath + o3tl::toU(pItemImpl->FindData.cFileName); pItemImpl->bFullPathNormalized = true; *pItem = static_cast<oslDirectoryItem>(pItemImpl); @@ -896,13 +848,7 @@ static oslFileError osl_getNextFileItem( } else { - if ( pItemImpl->m_pFullPath ) - { - rtl_uString_release( pItemImpl->m_pFullPath ); - pItemImpl->m_pFullPath = nullptr; - } - - free( pItemImpl ); + delete pItemImpl; return oslTranslateFileError( GetLastError() ); } } @@ -960,13 +906,7 @@ oslFileError SAL_CALL osl_closeDirectory(oslDirectory Directory) break; } - if ( pDirImpl->m_pDirectoryPath ) - { - rtl_uString_release( pDirImpl->m_pDirectoryPath ); - pDirImpl->m_pDirectoryPath = nullptr; - } - - free(pDirImpl); + delete pDirImpl; } return eError; } @@ -1017,19 +957,17 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString *strFilePath, oslDirector { case PATHTYPE_NETSERVER: { - DirectoryItem_Impl* pItemImpl = - static_cast<DirectoryItem_Impl*>(malloc(sizeof(DirectoryItem_Impl))); + DirectoryItem_Impl* pItemImpl = new (std::nothrow) DirectoryItem_Impl; if ( !pItemImpl ) error = osl_File_E_NOMEM; if ( osl_File_E_None == error ) { - ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) ); pItemImpl->uType = DIRECTORYITEM_SERVER; osl_acquireDirectoryItem( static_cast<oslDirectoryItem>(pItemImpl) ); - rtl_uString_newFromString( &pItemImpl->m_pFullPath, strSysFilePath ); + pItemImpl->m_sFullPath = strSysFilePath; // Assign a title anyway { @@ -1048,15 +986,13 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString *strFilePath, oslDirector break; case PATHTYPE_VOLUME: { - DirectoryItem_Impl* pItemImpl = - static_cast<DirectoryItem_Impl*>(malloc(sizeof(DirectoryItem_Impl))); + DirectoryItem_Impl* pItemImpl = new (std::nothrow) DirectoryItem_Impl; if ( !pItemImpl ) error = osl_File_E_NOMEM; if ( osl_File_E_None == error ) { - ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) ); pItemImpl->uType = DIRECTORYITEM_DRIVE; osl_acquireDirectoryItem( static_cast<oslDirectoryItem>(pItemImpl) ); @@ -1085,18 +1021,16 @@ oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString *strFilePath, oslDirector if ( hFind != INVALID_HANDLE_VALUE ) { - DirectoryItem_Impl *pItemImpl = - static_cast<DirectoryItem_Impl*>(malloc(sizeof(DirectoryItem_Impl))); + DirectoryItem_Impl *pItemImpl = new (std::nothrow) DirectoryItem_Impl; if (!pItemImpl) error = osl_File_E_NOMEM; if (osl_File_E_None == error) { - ZeroMemory(pItemImpl, sizeof(DirectoryItem_Impl)); osl_acquireDirectoryItem(static_cast<oslDirectoryItem>(pItemImpl)); CopyMemory(&pItemImpl->FindData, &aFindData, sizeof(WIN32_FIND_DATAW)); - rtl_uString_newFromString(&pItemImpl->m_pFullPath, strSysFilePath); + pItemImpl->m_sFullPath = strSysFilePath; // MT: This costs 600ms startup time on fast v60x! // GetCaseCorrectPathName( pItemImpl->szFullPath, pItemImpl->szFullPath, sizeof(pItemImpl->szFullPath) ); @@ -1138,15 +1072,7 @@ oslFileError SAL_CALL osl_releaseDirectoryItem( oslDirectoryItem Item ) return osl_File_E_INVAL; if ( ! --pItemImpl->nRefCount ) - { - if ( pItemImpl->m_pFullPath ) - { - rtl_uString_release( pItemImpl->m_pFullPath ); - pItemImpl->m_pFullPath = nullptr; - } - - free( pItemImpl ); - } + delete pItemImpl; return osl_File_E_None; } @@ -1159,7 +1085,7 @@ SAL_CALL osl_identicalDirectoryItem( oslDirectoryItem a, oslDirectoryItem b) if (a == b) return true; /* same name => same item, unless renaming / moving madness has occurred */ - if (pA->m_pFullPath == pB->m_pFullPath) + if (pA->m_sFullPath == pB->m_sFullPath) return true; // FIXME: as/when/if this is used in anger on Windows we could @@ -1571,7 +1497,7 @@ static oslFileError osl_getServerInfo( if ( uFieldMask & osl_FileStatus_Mask_FileURL ) { - oslFileError error = osl_getFileURLFromSystemPath( pItemImpl->m_pFullPath, &pStatus->ustrFileURL ); + oslFileError error = osl_getFileURLFromSystemPath( pItemImpl->m_sFullPath.pData, &pStatus->ustrFileURL ); if (error != osl_File_E_None) return error; pStatus->uValidFields |= osl_FileStatus_Mask_FileURL; @@ -1599,7 +1525,7 @@ oslFileError SAL_CALL osl_getFileStatus( break; } - OUString sFullPath(pItemImpl->m_pFullPath); + OUString sFullPath(pItemImpl->m_sFullPath); // Prefix long paths, windows API calls expect this prefix // (only local paths starting with something like C: or D:) @@ -1687,8 +1613,8 @@ oslFileError SAL_CALL osl_getFileStatus( if ( nNewLen ) { - rtl_uString_newFromStr( &pItemImpl->m_pFullPath, aBuffer ); - sFullPath = OUString( pItemImpl->m_pFullPath ); + pItemImpl->m_sFullPath = OUString(&*aBuffer, nNewLen); + sFullPath = pItemImpl->m_sFullPath; pItemImpl->bFullPathNormalized = true; } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits