Kaydet (Commit) 45e8fd5f authored tarafından Stephan Bergmann's avatar Stephan Bergmann

For now, reintroduce the horrible static counter into utl::TempFile

...i.e., bug fdo#41295 and its fix rediscovered.

Change-Id: If958fad74c853f51660a9e0bfffd99969052ea80
üst e25bdf7f
...@@ -237,6 +237,84 @@ OUString lcl_createName( ...@@ -237,6 +237,84 @@ OUString lcl_createName(
} }
} }
OUString lcl_createName_BROKEN(
const OUString& rLeadingChars, sal_Int16 nRadix,
bool bFirst, const OUString* pExtension, const OUString* pParent,
bool bDirectory, bool bKeep, bool bLock)
{
// 36 ** 6 == 2176782336
unsigned long const nMaxRadix = 36;
unsigned long const nMax = (nMaxRadix*nMaxRadix*nMaxRadix*nMaxRadix*nMaxRadix*nMaxRadix);
static unsigned long nSeed = Time::GetSystemTicks() % nMax;
// get correct directory
OUString aName = ConstructTempDir_Impl( pParent );
bool bUseNumber = bFirst;
// now use special naming scheme ( name takes leading chars and an index counting up from zero
aName += rLeadingChars;
for ( unsigned long i=nSeed;; )
{
OUString aTmp( aName );
if ( bUseNumber )
aTmp += OUString::number(nSeed, nRadix);
bUseNumber = true;
if ( pExtension )
aTmp += *pExtension;
else
aTmp += ".tmp";
if ( bDirectory )
{
FileBase::RC err = Directory::create( aTmp );
if ( err == FileBase::E_None )
{
// !bKeep: only for creating a name, not a file or directory
if ( bKeep || Directory::remove( aTmp ) == FileBase::E_None )
return aTmp;
else
return OUString();
}
else if ( err != FileBase::E_EXIST )
// if f.e. name contains invalid chars stop trying to create dirs
return OUString();
}
else
{
DBG_ASSERT( bKeep, "Too expensive, use directory for creating name!" );
File aFile( aTmp );
#ifdef UNX
/* RW permission for the user only! */
mode_t old_mode = umask(077);
#endif
FileBase::RC err = aFile.open(osl_File_OpenFlag_Create | (bLock ? 0 : osl_File_OpenFlag_NoLock));
#ifdef UNX
umask(old_mode);
#endif
if ( err == FileBase::E_None || (bLock && err == FileBase::E_NOLCK) )
{
aFile.close();
return aTmp;
}
else if ( err != FileBase::E_EXIST )
{
// if f.e. name contains invalid chars stop trying to create dirs
// but if there is a folder with such name proceed further
DirectoryItem aTmpItem;
FileStatus aTmpStatus( osl_FileStatus_Mask_Type );
if ( DirectoryItem::get( aTmp, aTmpItem ) != FileBase::E_None
|| aTmpItem.getFileStatus( aTmpStatus ) != FileBase::E_None
|| aTmpStatus.getFileType() != FileStatus::Directory )
return OUString();
}
}
nSeed = (nSeed + 1) % nMax;
if (i == nSeed) {
return OUString();
}
}
}
OUString CreateTempName_Impl( const OUString* pParent, bool bKeep, bool bDir = true ) OUString CreateTempName_Impl( const OUString* pParent, bool bKeep, bool bDir = true )
{ {
OUString aEyeCatcher = "lu"; OUString aEyeCatcher = "lu";
...@@ -249,8 +327,8 @@ OUString CreateTempName_Impl( const OUString* pParent, bool bKeep, bool bDir = t ...@@ -249,8 +327,8 @@ OUString CreateTempName_Impl( const OUString* pParent, bool bKeep, bool bDir = t
} }
#endif #endif
#endif #endif
return lcl_createName( return lcl_createName_BROKEN(
aEyeCatcher, Time::GetSystemTicks(), 36, true, 0, pParent, bDir, bKeep, aEyeCatcher, 36, true, 0, pParent, bDir, bKeep,
false); false);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment