[Libreoffice-commits] core.git: Branch 'feature/cib_contract57b' - sal/osl

Samuel Mehrbrodt Samuel.Mehrbrodt at cib.de
Thu Feb 22 09:07:43 UTC 2018


 sal/osl/w32/file_dirvol.cxx |   28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

New commits:
commit 85c640f19f6a5b0ea34236141db37f2967b986ea
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Thu Feb 22 09:03:08 2018 +0100

    Use long path prefix in osl_getFileStatus
    
    Follow-up fixes after 51afd886e59e519be0546c980dcc724d771fd245
    
    Change-Id: I29ce4af850978322cab60743119a02d47305e739

diff --git a/sal/osl/w32/file_dirvol.cxx b/sal/osl/w32/file_dirvol.cxx
index ed6adb974365..bf9e88abf84c 100644
--- a/sal/osl/w32/file_dirvol.cxx
+++ b/sal/osl/w32/file_dirvol.cxx
@@ -43,8 +43,6 @@ static const wchar_t UNC_PREFIX[] = L"\\\\";
 static const wchar_t BACKSLASH = '\\';
 static const wchar_t SLASH = '/';
 
-#define STR_LONG_PATH_PREFIX "\\\\?\\"
-
 extern "C" BOOL TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime)
 {
     SYSTEMTIME  BaseSysTime;
@@ -1587,14 +1585,6 @@ oslFileError SAL_CALL osl_getFileStatus(
     if ( !pItemImpl )
         return osl_File_E_INVAL;
 
-    // Provide a long path version of the file name, because when
-    // the path is longer than 255 chars, windows api calls expect this prefix.
-    rtl_uString* sPrefix = nullptr;
-    rtl_uString* sLongPath = nullptr;
-    rtl_uString_newFromAscii( &sPrefix, STR_LONG_PATH_PREFIX );
-    rtl_uString_newConcat( &sLongPath, sPrefix, pItemImpl->m_pFullPath );
-    rtl_uString_release( sPrefix );
-
     switch ( pItemImpl->uType  )
     {
     case DIRECTORYITEM_DRIVE:
@@ -1605,9 +1595,16 @@ oslFileError SAL_CALL osl_getFileStatus(
         break;
     }
 
+    // Provide a long path version of the file name, because when
+    // the path is longer than 255 chars, windows api calls expect this prefix.
+    OUString sFullPath(pItemImpl->m_pFullPath);
+
+    if (sFullPath.getLength() >= MAX_PATH && isalpha(sFullPath[0]) && sFullPath[1] == ':')
+        sFullPath = "\\\\?\\" + sFullPath;
+
     if ( uFieldMask & osl_FileStatus_Mask_Validate )
     {
-        HANDLE  hFind = FindFirstFile( rtl_uString_getStr( sLongPath ), &pItemImpl->FindData );
+        HANDLE  hFind = FindFirstFile( sFullPath.getStr(), &pItemImpl->FindData );
 
         if ( hFind != INVALID_HANDLE_VALUE )
             FindClose( hFind );
@@ -1667,7 +1664,7 @@ oslFileError SAL_CALL osl_getFileStatus(
 
     if ( uFieldMask & osl_FileStatus_Mask_LinkTargetURL )
     {
-        oslFileError error = osl_getFileURLFromSystemPath( pItemImpl->m_pFullPath, &pStatus->ustrLinkTargetURL );
+        oslFileError error = osl_getFileURLFromSystemPath( sFullPath.pData, &pStatus->ustrLinkTargetURL );
         if (error != osl_File_E_None)
             return error;
 
@@ -1679,7 +1676,7 @@ oslFileError SAL_CALL osl_getFileStatus(
         if ( !pItemImpl->bFullPathNormalized )
         {
             ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
-            sal_uInt32 nNewLen = GetCaseCorrectPathName( rtl_uString_getStr( sLongPath ),
+            sal_uInt32 nNewLen = GetCaseCorrectPathName( sFullPath.getStr(),
                                                       ::osl::mingw_reinterpret_cast<LPWSTR>( aBuffer ),
                                                       aBuffer.getBufSizeInSymbols(),
                                                       sal_True );
@@ -1687,18 +1684,17 @@ oslFileError SAL_CALL osl_getFileStatus(
             if ( nNewLen )
             {
                 rtl_uString_newFromStr( &pItemImpl->m_pFullPath, aBuffer );
+                sFullPath = OUString( pItemImpl->m_pFullPath );
                 pItemImpl->bFullPathNormalized = TRUE;
             }
         }
 
-        oslFileError error = osl_getFileURLFromSystemPath( sLongPath, &pStatus->ustrFileURL );
+        oslFileError error = osl_getFileURLFromSystemPath( sFullPath.pData, &pStatus->ustrFileURL );
         if (error != osl_File_E_None)
             return error;
         pStatus->uValidFields |= osl_FileStatus_Mask_FileURL;
     }
 
-    rtl_uString_release( sLongPath );
-
     return osl_File_E_None;
 }
 


More information about the Libreoffice-commits mailing list