blob: 1943f593b932b20464b91f306413ea727e0ca12c [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_filter.hxx"
#include <osl/file.h>
#if defined( UNX) || defined(OS2)
#include <stdio.h>
#include <string.h>
#include <osl/thread.h>
oslFileError SAL_CALL my_getTempDirURL( rtl_uString** pustrTempDir )
{
const char *pValue = getenv( "TEMP" );
if ( !pValue )
{
pValue = getenv( "TMP" );
#if defined(SOLARIS) || defined (LINUX)
if ( !pValue )
pValue = P_tmpdir;
#endif
}
if ( pValue )
{
oslFileError error;
rtl_uString *ustrTempPath = NULL;
rtl_string2UString( &ustrTempPath, pValue, strlen( pValue ), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
error = osl_getFileURLFromSystemPath( ustrTempPath, pustrTempDir );
rtl_uString_release( ustrTempPath );
return error;
}
else
return osl_File_E_NOENT;
}
#else
#ifdef NDEBUG
# define NO_DEBUG_CRT
#endif
#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0400
# define _CTYPE_DISABLE_MACROS /* wg. dynamischer C-Runtime MH */
#endif
#if defined _MSC_VER
#pragma warning(push, 1)
#endif
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <malloc.h>
#if defined _MSC_VER
#pragma warning(pop)
#endif
#define elementsof(arr) (sizeof(arr)/sizeof(arr[0]))
oslFileError SAL_CALL my_getTempDirURL( rtl_uString** pustrTempDir )
{
WCHAR szBuffer[MAX_PATH];
LPWSTR lpBuffer = szBuffer;
DWORD nBufferLength = elementsof(szBuffer) - 1;
DWORD nLength;
oslFileError error;
do
{
nLength = GetTempPathW( elementsof(szBuffer), lpBuffer );
if ( nLength > nBufferLength )
{
nLength++;
lpBuffer = (LPWSTR)alloca( sizeof(WCHAR) * nLength );
nBufferLength = nLength - 1;
}
} while ( nLength > nBufferLength );
if ( nLength )
{
rtl_uString *ustrTempPath = NULL;
if ( '\\' == lpBuffer[nLength-1] )
lpBuffer[nLength-1] = 0;
rtl_uString_newFromStr( &ustrTempPath, reinterpret_cast<const sal_Unicode*>(lpBuffer) );
error = osl_getFileURLFromSystemPath( ustrTempPath, pustrTempDir );
rtl_uString_release( ustrTempPath );
}
else
error = GetLastError() == ERROR_SUCCESS ? osl_File_E_None : osl_File_E_INVAL;
return error;
}
#endif
#include "tempfile.hxx"
using namespace rtl;
TempFile::TempFile( const OUString& rTempFileURL )
:osl::File( rTempFileURL ), maURL( rTempFileURL )
{
}
TempFile::~TempFile()
{
close();
if( maURL.getLength() )
osl::File::remove( maURL );
}
OUString TempFile::createTempFileURL()
{
OUString aTempFileURL;
const sal_uInt32 nRadix = 26;
OUString aTempDirURL;
/* oslFileError nRC = */ my_getTempDirURL( &aTempDirURL.pData );
static sal_uInt32 u = osl_getGlobalTimer();
for ( sal_uInt32 nOld = u; ++u != nOld; )
{
u %= (nRadix*nRadix*nRadix);
OUString aTmp( aTempDirURL );
if( aTmp.getStr()[ aTmp.getLength() - 1 ] != sal_Unicode( '/' ) )
aTmp += OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ));
aTmp += OUString::valueOf( (sal_Int32) (unsigned) u, nRadix );
aTmp += OUString::createFromAscii( ".tmp" );
osl::File aFile( aTmp );
osl::FileBase::RC err = aFile.open(osl_File_OpenFlag_Create);
if ( err == FileBase::E_None )
{
aTempFileURL = aTmp;
aFile.close();
break;
}
else if ( err != FileBase::E_EXIST )
{
// if f.e. name contains invalid chars stop trying to create files
break;
}
}
return aTempFileURL;
}
OUString TempFile::getFileURL()
{
return maURL;
}