| /************************************************************** |
| * |
| * 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; |
| } |