[Libreoffice-commits] core.git: tools/inc tools/Library_tl.mk tools/Package_inc.mk tools/source
Andras Timar
atimar at suse.com
Thu Apr 4 13:40:13 PDT 2013
tools/Library_tl.mk | 4
tools/Package_inc.mk | 1
tools/inc/tools/fsys.hxx | 335 --------
tools/source/fsys/comdep.cxx | 32
tools/source/fsys/comdep.hxx | 98 --
tools/source/fsys/dirent.cxx | 1627 -----------------------------------------
tools/source/fsys/fstat.cxx | 133 ---
tools/source/fsys/tdir.cxx | 416 ----------
tools/source/fsys/tempfile.cxx | 1
tools/source/fsys/unx.cxx | 366 ---------
tools/source/fsys/unx.hxx | 74 -
tools/source/fsys/wntmsc.cxx | 770 -------------------
tools/source/fsys/wntmsc.hxx | 67 -
13 files changed, 3924 deletions(-)
New commits:
commit 75e014c30753f635ddc74cdb654a8342049a114b
Author: Andras Timar <atimar at suse.com>
Date: Thu Apr 4 21:40:03 2013 +0200
fdo#61514 clean obsolete tools/ filesystem abstraction
Change-Id: I7d1d5eca43d0b0f9a013e31383abc574a7b15f93
diff --git a/tools/Library_tl.mk b/tools/Library_tl.mk
index cf29eff..a48117e 100644
--- a/tools/Library_tl.mk
+++ b/tools/Library_tl.mk
@@ -49,10 +49,6 @@ $(eval $(call gb_Library_add_exception_objects,tl,\
tools/source/datetime/tdate \
tools/source/datetime/ttime \
tools/source/debug/debug \
- tools/source/fsys/comdep \
- tools/source/fsys/dirent \
- tools/source/fsys/fstat \
- tools/source/fsys/tdir \
tools/source/fsys/tempfile \
tools/source/fsys/urlobj \
tools/source/fsys/wldcrd \
diff --git a/tools/Package_inc.mk b/tools/Package_inc.mk
index 5557b12..6d6f402 100644
--- a/tools/Package_inc.mk
+++ b/tools/Package_inc.mk
@@ -36,7 +36,6 @@ $(eval $(call gb_Package_add_file,tools_inc,inc/tools/extendapplicationenvironme
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/fldunit.hxx,tools/fldunit.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/fontenum.hxx,tools/fontenum.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/fract.hxx,tools/fract.hxx))
-$(eval $(call gb_Package_add_file,tools_inc,inc/tools/fsys.hxx,tools/fsys.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/gen.hxx,tools/gen.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/getprocessworkingdir.hxx,tools/getprocessworkingdir.hxx))
$(eval $(call gb_Package_add_file,tools_inc,inc/tools/globname.hxx,tools/globname.hxx))
diff --git a/tools/inc/tools/fsys.hxx b/tools/inc/tools/fsys.hxx
deleted file mode 100644
index e135a76..0000000
--- a/tools/inc/tools/fsys.hxx
+++ /dev/null
@@ -1,335 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * 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 .
- */
-#ifndef _FSYS_HXX
-#define _FSYS_HXX
-
-#include <tools/solar.h>
-#include <tools/datetime.hxx>
-#include <tools/string.hxx>
-#include <tools/link.hxx>
-#include <tools/wldcrd.hxx>
-#include <tools/errcode.hxx>
-#include "tools/toolsdllapi.h"
-
-#include <cstdarg>
-#include <vector>
-
-// FSys-Types
-class DirEntry;
-class FileStat;
-class SvFileStream;
-class BigInt;
-
-typedef ::std::vector< DirEntry* > DirEntryList;
-typedef ::std::vector< FileStat* > FileStatList;
-
-// DirEntryKind
-typedef int DirEntryKind;
-#define FSYS_KIND_NONE ((DirEntryKind) 0)
-#define FSYS_KIND_UNKNOWN FSYS_KIND_NONE
-#define FSYS_KIND_FILE ((DirEntryKind) 1)
-#define FSYS_KIND_DIR ((DirEntryKind) 2)
-#define FSYS_KIND_DEV ((DirEntryKind) 4)
-#define FSYS_KIND_BLOCK ((DirEntryKind) 8)
-#define FSYS_KIND_CHAR ((DirEntryKind) 16)
-#define FSYS_KIND_WILD ((DirEntryKind) 32)
-#define FSYS_KIND_BLOCK_REMOTE ((DirEntryKind) 64)
-#define FSYS_KIND_REMOVEABLE ((DirEntryKind) 128)
-#define FSYS_KIND_FIXED ((DirEntryKind) 256)
-#define FSYS_KIND_REMOTE ((DirEntryKind) 512)
-#define FSYS_KIND_RAM ((DirEntryKind) 1024)
-#define FSYS_KIND_CDROM ((DirEntryKind) 2048)
-#define FSYS_KIND_ALL ((DirEntryKind) 4095)
-#define FSYS_KIND_VISIBLE ((DirEntryKind) 4096)
-
-// FSysSort
-typedef int FSysSort;
-#define FSYS_SORT_NONE ((FSysSort) 0)
-#define FSYS_SORT_SIZE ((FSysSort) 1)
-#define FSYS_SORT_CREATED ((FSysSort) 2)
-#define FSYS_SORT_MODIFYED ((FSysSort) 4)
-#define FSYS_SORT_ACCESSED ((FSysSort) 8)
-#define FSYS_SORT_ASCENDING ((FSysSort) 16)
-#define FSYS_SORT_DESCENDING ((FSysSort) 32)
-#define FSYS_SORT_EXT ((FSysSort) 64)
-#define FSYS_SORT_NAME ((FSysSort) 128)
-#define FSYS_SORT_KIND ((FSysSort) 256)
-#define FSYS_SORT_CREATOR ((FSysSort) 512)
-#define FSYS_SORT_END ((FSysSort)1024)
-typedef ::std::vector< FSysSort > FSysSortList;
-
-// DirEntryFlag
-enum DirEntryFlag
-{
- FSYS_FLAG_NORMAL,
- FSYS_FLAG_VOLUME, // Dir( FSYS_FLAG_VOLUME ) and GetDevice()
- FSYS_FLAG_ABSROOT, // e.g. "a:\" or "\"
- FSYS_FLAG_RELROOT, // e.g. "a:", "a:." or "."
- FSYS_FLAG_CURRENT = FSYS_FLAG_RELROOT, // Synonym for FSYS_FLAG_RELROOT
- FSYS_FLAG_PARENT, // e.g. ".."
- FSYS_FLAG_INVALID
-};
-
-// FSysPathStyle
-enum FSysPathStyle
-{
- FSYS_STYLE_HOST,
- FSYS_STYLE_NTFS,
- FSYS_STYLE_BSD,
- FSYS_STYLE_UNX = FSYS_STYLE_BSD,
- FSYS_STYLE_DETECT,
-};
-
-// FSysAccess
-typedef int FSysAccess;
-#define FSYS_ACCESS_CACHED 2
-#define FSYS_ACCESS_FORCED 1
-#define FSYS_ACCESS_FLOPPY FSYS_ACCESS_FORCED
-
-// FSysAction
-typedef int FSysAction;
-#define FSYS_ACTION_RECURSIVE 0x02 // deep through dircetory structure
-#define FSYS_ACTION_USERECYCLEBIN 0x04 // move to recycle bin
-#define FSYS_ACTION_STANDARD 0
-
-// RFS
-#define RFS_IDENTIFIER "-rfs-"
-
-typedef sal_uIntPtr FSysError;
-
-// FileStat
-struct dirent;
-
-class TOOLS_DLLPUBLIC FileStat
-{
- friend class Dir;
- friend struct DirReader_Impl;
- friend void ImpInitFileStat( FileStat&, dirent* );
-
- sal_uIntPtr nError;
- DirEntryKind nKindFlags;
- sal_uIntPtr nSize;
- String aCreator;
- String aType;
- Date aDateCreated;
- Time aTimeCreated;
- Date aDateModified;
- Time aTimeModified;
- Date aDateAccessed;
- Time aTimeAccessed;
-
-private:
- TOOLS_DLLPRIVATE void ImpInit( void* );
-
-protected:
- // Implementation
- FileStat( SAL_UNUSED_PARAMETER const void *pInfo ); // CInfoPBRec
-
-public:
- FileStat( const DirEntry& rDirEntry,
- FSysAccess nAccess = FSYS_ACCESS_FLOPPY );
- sal_Bool Update( const DirEntry& rDirEntry,
- sal_Bool bForceAccess = sal_True );
-
- sal_uIntPtr GetError() const { return ERRCODE_TOERROR(nError); }
- sal_uIntPtr GetErrorCode() const { return nError; }
-
- sal_uIntPtr GetSize() const { return nSize; }
-
- DirEntryKind GetKind() const { return nKindFlags; }
- sal_Bool IsKind( DirEntryKind nKind ) const;
-
- String GetType() const { return aType; }
- String GetCreator() const { return aCreator; }
-
- Date DateCreated() const { return aDateCreated; }
- Time TimeCreated() const { return aTimeCreated; }
- Date DateModified() const { return aDateModified; }
- Time TimeModified() const { return aTimeModified; }
- Date DateAccessed() const { return aDateAccessed; }
- Time TimeAccessed() const { return aTimeAccessed; }
-
- static sal_uIntPtr SetReadOnlyFlag( const DirEntry &rEntry, sal_Bool bRO = sal_True );
- static sal_Bool GetReadOnlyFlag( const DirEntry &rEntry );
-};
-
-// DirEntry
-
-class DirEntryStack;
-
-const char* ImpCheckDirEntry( const void* p );
-
-class TOOLS_DLLPUBLIC DirEntry
-{
-friend struct DirReader_Impl;
-
- FileStat* pStat; // optional
-
- rtl::OString aName;
- DirEntry* pParent;
- sal_uIntPtr nError;
- DirEntryFlag eFlag;
-
-private:
- TOOLS_DLLPRIVATE DirEntry( const rtl::OString& rInitName,
- DirEntryFlag aDirFlag );
-
- friend class Dir;
- friend class FileStat;
- friend const char* ImpCheckDirEntry( const void* p );
-
- TOOLS_DLLPRIVATE FSysError ImpParseName( const rtl::OString& rIntiName );
- TOOLS_DLLPRIVATE const DirEntry* ImpGetTopPtr() const;
- TOOLS_DLLPRIVATE DirEntry* ImpGetTopPtr();
-
-protected:
- void ImpTrim();
- const rtl::OString& ImpTheName() const;
- DirEntryFlag ImpTheFlag() const { return eFlag; };
- DirEntry* ImpChangeParent( DirEntry* pNewParent, sal_Bool bNormalize = sal_True );
- DirEntry* ImpGetParent() { return pParent; }
-
- FileStat* ImpGetStat() const { return pStat; }
- void ImpSetStat( FileStat *p ) { pStat = p; }
-
-protected:
- void SetError( sal_uIntPtr nErr ) { nError = nErr; }
- DirEntry* GetParent() { return pParent; }
-
-public:
- DirEntry( DirEntryFlag aDirFlag = FSYS_FLAG_CURRENT );
- DirEntry( const DirEntry& rEntry );
- DirEntry( const rtl::OString& rInitName,
- FSysPathStyle eParser = FSYS_STYLE_HOST );
- DirEntry( const String& rInitName,
- FSysPathStyle eParser = FSYS_STYLE_HOST );
- ~DirEntry();
-
- sal_uIntPtr GetError() const { return nError; }
- sal_Bool IsValid() const;
- DirEntryFlag GetFlag() const { return eFlag; };
-
- void SetExtension( const String& rExt, char cSep = '.' );
- String GetExtension( char cSep = '.' ) const;
- void SetName( const String& rName, FSysPathStyle eFormatter = FSYS_STYLE_HOST );
- String GetName( FSysPathStyle eFormatter = FSYS_STYLE_HOST ) const;
- String CutName( FSysPathStyle eFormatter = FSYS_STYLE_HOST );
- String GetBase(char cSep = '.' ) const;
- DirEntry GetPath() const;
- DirEntry GetDevice() const;
- String GetVolume() const;
- String GetFull( FSysPathStyle eFormatter = FSYS_STYLE_HOST,
- sal_Bool bWithDelimiter = sal_False,
- sal_uInt16 nMaxChars = STRING_MAXLEN ) const;
-
- DirEntry TempName( DirEntryKind = FSYS_KIND_NONE ) const;
- sal_Bool MakeShortName( const String& rLongName,
- DirEntryKind eCreateKind = FSYS_KIND_NONE,
- sal_Bool bUseTilde = sal_True,
- FSysPathStyle eStyle = FSYS_STYLE_DETECT );
-
- bool IsAbs() const;
- sal_Bool ToAbs();
- sal_Bool Find( const String& rPfad, char cDelim = 0 );
-
- sal_Bool SetCWD( sal_Bool bSloppy = sal_False ) const;
- sal_Bool MakeDir( sal_Bool bSloppy = sal_False ) const;
- sal_Bool Exists( FSysAccess nAccess = FSYS_ACCESS_FLOPPY ) const;
- sal_Bool First();
-
- sal_uInt16 Level() const;
- const DirEntry& operator []( sal_uInt16 nParentLevel ) const;
- sal_Bool Contains( const DirEntry &rSubEntry ) const;
-
- FSysError Kill( FSysAction nActions = FSYS_ACTION_STANDARD ) const;
-
- DirEntry& operator =( const DirEntry& rOrigDir );
- DirEntry operator +( const DirEntry& rSubDir ) const;
- DirEntry& operator +=( const DirEntry& rSubDir );
- sal_Bool operator ==( const DirEntry& rAnotherDir ) const;
- sal_Bool operator !=( const DirEntry& rAnotherDir ) const
- { return !(DirEntry::operator==( rAnotherDir )); }
-
- inline sal_Int32 NameCompareDirect( const DirEntry &rWith ) const
- {
-#ifdef UNX
- return rWith.aName.compareTo(aName);
-#else
- rtl::OString aThis(rtl::OString(aName).toAsciiLowerCase());
- rtl::OString aWith(rtl::OString(rWith.aName).toAsciiLowerCase());
- return aWith.compareTo(aThis);
-#endif
- }
-
- static String GetAccessDelimiter( FSysPathStyle eFormatter = FSYS_STYLE_HOST );
- static String GetSearchDelimiter( FSysPathStyle eFormatter = FSYS_STYLE_HOST );
-};
-
-// Dir
-
-struct DirReader_Impl;
-class TOOLS_DLLPUBLIC Dir : public DirEntry
-{
- friend struct DirReader_Impl;
-
- DirReader_Impl* pReader; // is system-dependent
- DirEntryList* pLst;
- FSysSortList* pSortLst; // NULL if no sorting requested
- FileStatList* pStatLst; // NULL if no stats requested
- WildCard aNameMask;
- DirEntryKind eAttrMask;
-
-private:
- TOOLS_DLLPRIVATE Dir( const Dir& ); // not allowed
- TOOLS_DLLPRIVATE Dir& operator =( const Dir& ); // not allowed
-
-#ifdef _DIR_CXX
- TOOLS_DLLPRIVATE void Construct( DirEntryKind nKind = FSYS_KIND_DIR|FSYS_KIND_FILE );
-#endif
-
-#ifndef _TOOLS_HXX
-protected:
- sal_Bool ImpInsertPointReached( const DirEntry& rIsSmaller,
- const FileStat& rNewStat,
- size_t nCurPos,
- size_t nSortIndex ) const;
- void ImpSortedInsert( const DirEntry *pNewEntry,
- const FileStat *pNewStat );
-#endif
-
-public:
- Dir( const DirEntry& rDirEntry,
- DirEntryKind nKind = FSYS_KIND_ALL );
- ~Dir();
-
- void Reset();
- sal_uInt16 Scan( sal_uInt16 nCount = 5 );
- size_t Count( sal_Bool bUpdated = sal_True ) const;
-
- Dir& operator +=( const Dir& rDir );
- DirEntry& operator []( size_t nIndex ) const;
-};
-
-#if defined(DBG_UTIL)
-void FSysTest();
-#endif
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/fsys/comdep.cxx b/tools/source/fsys/comdep.cxx
deleted file mode 100644
index 5366feb..0000000
--- a/tools/source/fsys/comdep.cxx
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * 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 .
- */
-
-#include "comdep.hxx"
-#include <tools/debug.hxx>
-#include <tools/fsys.hxx>
-
-DBG_NAMEEX( DirEntry )
-
-#if defined UNX
-#include "unx.cxx"
-#elif defined WNT
-#include "wntmsc.cxx"
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/fsys/comdep.hxx b/tools/source/fsys/comdep.hxx
deleted file mode 100644
index 2b1e135..0000000
--- a/tools/source/fsys/comdep.hxx
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * 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 .
- */
-#ifndef _COMDEP_HXX
-#define _COMDEP_HXX
-
-#include <tools/fsys.hxx>
-
-#define ACCESSDELIM(e) ( ( e == FSYS_STYLE_NTFS ) ? "\\" : "/" )
-#define ACCESSDELIM_C(e)(char)\
- ( ( e == FSYS_STYLE_NTFS ) ? '\\' : '/' )
-#define SEARCHDELIM(e) ( (e == FSYS_STYLE_BSD) ? ":" : ";" )
-#define ACTPARENT(e) ".."
-#define ACTCURRENT(e) "."
-
-#if defined UNX
-#include "unx.hxx"
-#elif defined WNT
-#include "wntmsc.hxx"
-#endif
-
-#ifndef LINUX
-DIR *opendir( const char* pPfad );
-dirent *readdir( DIR *pDir );
-int closedir( DIR *pDir );
-char *volumeid( const char* pPfad );
-#endif
-
-struct DirReader_Impl
-{
- Dir* pDir;
- DIR* pDosDir;
- dirent* pDosEntry;
- DirEntry* pParent;
- String aPath;
- rtl::OString aBypass;
- sal_Bool bReady;
- sal_Bool bInUse;
-
- DirReader_Impl( Dir &rDir )
- : pDir( &rDir ),
- pDosEntry( 0 ),
- pParent( 0 ),
- aPath(rDir.GetFull()),
- bReady ( sal_False ),
- bInUse( sal_False )
- {
-
- // only use the String from Member-Var
-
-#if defined(UNX) // for further explanation see DirReader_Impl::Read() in unx.cxx
- pDosDir = NULL;
-#else
- aBypass = rtl::OUStringToOString(aPath, osl_getThreadTextEncoding());
- pDosDir = opendir( aBypass.getStr() );
-#endif
-
- // Determine parents for new DirEntries
- pParent = pDir->GetFlag() == FSYS_FLAG_NORMAL ||
- pDir->GetFlag() == FSYS_FLAG_ABSROOT
- ? pDir
- : pDir->GetParent();
-
- }
-
- ~DirReader_Impl()
- { if( pDosDir ) closedir( pDosDir ); }
-
- // Init and Read are system-independent
- sal_uInt16 Init(); ///< Initializes (and if necessary) reads devices
- sal_uInt16 Read(); ///< Reads one entry and appends it if ok
-};
-
-
-#if defined WNT
-sal_Bool IsRedirectable_Impl( const rtl::OString &rPath );
-#else
-#define IsRedirectable_Impl( rPath ) sal_True
-#endif
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/fsys/dirent.cxx b/tools/source/fsys/dirent.cxx
deleted file mode 100644
index 4c42f47..0000000
--- a/tools/source/fsys/dirent.cxx
+++ /dev/null
@@ -1,1627 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * 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 .
- */
-
-#if !defined UNX
-#ifdef WNT
-#include <windows.h>
-#undef GetObject
-#endif
-#include <io.h>
-#include <process.h>
-#endif
-
-#if defined(UNX)
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <tools/debug.hxx>
-#include "comdep.hxx"
-#include <tools/fsys.hxx>
-#include <tools/urlobj.hxx>
-#include <vector>
-
-#include <tools/stream.hxx>
-#include <osl/mutex.hxx>
-#include <osl/file.hxx>
-#include <rtl/instance.hxx>
-#include <comphelper/string.hxx>
-
-using namespace osl;
-using ::rtl::OUString;
-
-static rtl::OUString GetSystemTempDirPath_Impl()
-{
- rtl::OUString aTmpURL, aPath;
- osl::FileBase::getTempDirURL( aTmpURL );
- osl::FileBase::getSystemPathFromFileURL( aTmpURL, aPath );
- return aPath;
-}
-
-int Sys2SolarError_Impl( int nSysErr )
-{
- switch ( nSysErr )
- {
-#ifdef WNT
- case NO_ERROR: return ERRCODE_NONE;
- case ERROR_INVALID_FUNCTION: return ERRCODE_IO_GENERAL;
- case ERROR_FILE_NOT_FOUND: return ERRCODE_IO_NOTEXISTS;
- case ERROR_PATH_NOT_FOUND: return ERRCODE_IO_NOTEXISTSPATH;
- case ERROR_TOO_MANY_OPEN_FILES: return ERRCODE_IO_TOOMANYOPENFILES;
- case ERROR_ACCESS_DENIED: return ERRCODE_IO_ACCESSDENIED;
- case ERROR_INVALID_HANDLE: return ERRCODE_IO_GENERAL;
- case ERROR_NOT_ENOUGH_MEMORY: return ERRCODE_IO_OUTOFMEMORY;
- case ERROR_INVALID_BLOCK: return ERRCODE_IO_GENERAL;
- case ERROR_BAD_FORMAT: return ERRCODE_IO_WRONGFORMAT;
- case ERROR_INVALID_ACCESS: return ERRCODE_IO_ACCESSDENIED;
- case ERROR_INVALID_DRIVE: return ERRCODE_IO_INVALIDDEVICE;
- case ERROR_CURRENT_DIRECTORY: return ERRCODE_IO_CURRENTDIR;
- case ERROR_NOT_SAME_DEVICE: return ERRCODE_IO_NOTSAMEDEVICE;
- case ERROR_WRITE_PROTECT: return ERRCODE_IO_CANTWRITE;
- case ERROR_BAD_UNIT: return ERRCODE_IO_INVALIDDEVICE;
- case ERROR_NOT_READY: return ERRCODE_IO_DEVICENOTREADY;
- case ERROR_BAD_COMMAND: return ERRCODE_IO_GENERAL;
- case ERROR_CRC: return ERRCODE_IO_BADCRC;
- case ERROR_BAD_LENGTH: return ERRCODE_IO_INVALIDLENGTH;
- case ERROR_SEEK: return ERRCODE_IO_CANTSEEK;
- case ERROR_NOT_DOS_DISK: return ERRCODE_IO_WRONGFORMAT;
- case ERROR_SECTOR_NOT_FOUND: return ERRCODE_IO_GENERAL;
- case ERROR_WRITE_FAULT: return ERRCODE_IO_CANTWRITE;
- case ERROR_READ_FAULT: return ERRCODE_IO_CANTREAD;
- case ERROR_GEN_FAILURE: return ERRCODE_IO_GENERAL;
- case ERROR_SHARING_VIOLATION: return ERRCODE_IO_LOCKVIOLATION;
- case ERROR_LOCK_VIOLATION: return ERRCODE_IO_LOCKVIOLATION;
- case ERROR_WRONG_DISK: return ERRCODE_IO_INVALIDDEVICE;
- case ERROR_NOT_SUPPORTED: return ERRCODE_IO_NOTSUPPORTED;
-#else
- case 0: return ERRCODE_NONE;
- case ENOENT: return ERRCODE_IO_NOTEXISTS;
- case EACCES: return ERRCODE_IO_ACCESSDENIED;
- case EEXIST: return ERRCODE_IO_ALREADYEXISTS;
- case EINVAL: return ERRCODE_IO_INVALIDPARAMETER;
- case EMFILE: return ERRCODE_IO_TOOMANYOPENFILES;
- case ENOMEM: return ERRCODE_IO_OUTOFMEMORY;
- case ENOSPC: return ERRCODE_IO_OUTOFSPACE;
-#endif
- }
-
- OSL_TRACE( "FSys: unknown system error %d occurred", nSysErr );
- return FSYS_ERR_UNKNOWN;
-}
-
-class DirEntryStack
-{
-private:
- ::std::vector< DirEntry* > maStack;
-
-public:
- DirEntryStack() {};
- ~DirEntryStack();
-
- inline void Push( DirEntry *pEntry );
- inline DirEntry* Pop();
- inline DirEntry* Top();
- inline DirEntry* Bottom();
- inline bool Empty();
- inline void Clear();
-};
-
-inline void DirEntryStack::Push( DirEntry *pEntry )
-{
- maStack.push_back( pEntry );
-}
-
-inline DirEntry* DirEntryStack::Pop()
-{
- DirEntry* pEntry = NULL;
- if ( !maStack.empty() ) {
- pEntry = maStack.back();
- maStack.pop_back();
- }
- return pEntry;
-}
-
-inline DirEntry* DirEntryStack::Top()
-{
- return maStack.empty() ? NULL : maStack.back();
-}
-
-inline DirEntry* DirEntryStack::Bottom()
-{
- return maStack.empty() ? NULL : maStack.front();
-}
-
-inline bool DirEntryStack::Empty()
-{
- return maStack.empty();
-}
-
-inline void DirEntryStack::Clear()
-{
- maStack.clear();
-}
-
-DBG_NAME( DirEntry );
-
-DirEntryStack::~DirEntryStack()
-{
- maStack.clear();
-}
-
-#ifdef DBG_UTIL
-/** Check DirEntry for DBG_UTIL
-
- @param p Pointer to DirEntry
- @return char* Error-TExtension or NULL
-*/
-const char* ImpCheckDirEntry( const void* p )
-{
- DirEntry* p0 = (DirEntry*)p;
-
- if ( p0->pParent )
- DBG_CHKOBJ( p0->pParent, DirEntry, ImpCheckDirEntry );
-
- return NULL;
-}
-#endif
-
-/** Insert "..." for max length of nMaxChars */
-rtl::OString ImplCutPath( const rtl::OString& rStr, sal_Int32 nMax, char cAccDel )
-{
- sal_Int32 nMaxPathLen = nMax;
- sal_Bool bInsertPrefix = sal_False;
- sal_Int32 nBegin = rStr.indexOf(cAccDel);
- rtl::OStringBuffer aCutPath(rStr);
-
- if( nBegin == -1 )
- nBegin = 0;
- else
- nMaxPathLen += 2; // Prefix <Disk>:
-
- while( aCutPath.getLength() > nMaxPathLen )
- {
- sal_Int32 nEnd = aCutPath.toString().indexOf(cAccDel, nBegin + 1);
- sal_Int32 nCount;
-
- if ( nEnd != -1 )
- {
- nCount = nEnd - nBegin;
- aCutPath.remove(nBegin, nCount);
- bInsertPrefix = sal_True;
- }
- else
- break;
- }
-
- if ( aCutPath.getLength() > nMaxPathLen )
- {
- for ( sal_Int32 n = nMaxPathLen; n > nMaxPathLen/2; --n )
- {
- if (!comphelper::string::isalnumAscii(aCutPath[n]))
- {
- comphelper::string::truncateToLength(aCutPath, n);
- aCutPath.append("...");
- break;
- }
- }
- }
-
- if ( bInsertPrefix )
- {
- rtl::OStringBuffer aIns;
- aIns.append(cAccDel).append("...");
- aCutPath.insert(nBegin, aIns.makeStringAndClear());
- }
-
- return aCutPath.makeStringAndClear();
-}
-
-FSysError DirEntry::ImpParseName( const rtl::OString& rPfad )
-{
-#if defined(WNT)
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- // put single names onto stack
- String aPfad(rtl::OStringToOUString(rPfad, osl_getThreadTextEncoding()));
- DirEntryStack aStack;
-
- do
- {
- // split name before first "\\",
- // if '\\' is at beginning of string, name is set to '\\'.
- // ":" also splits the string and belongs to the name.
-
- // search first occurance of '\\', '/' or ':'
- sal_uInt16 nPos;
- for ( nPos = 0;
- nPos < aPfad.Len() && //?O
- aPfad.GetChar(nPos) != '\\' && aPfad.GetChar(nPos) != '/' && //?O
- aPfad.GetChar(nPos) != ':'; //?O
- nPos++ )
- /* do nothing */;
-
- // is the name a UNC pathname?
- if ( nPos == 0 && aPfad.Len() > 1 &&
- ( ( aPfad.GetChar(0) == '\\' && aPfad.GetChar(1) == '\\' ) ||
- ( aPfad.GetChar(0) == '/' && aPfad.GetChar(1) == '/' ) ) )
- {
- for ( nPos = 2; aPfad.Len() > nPos; ++nPos )
- if ( aPfad.GetChar(nPos) == '\\' || aPfad.GetChar(nPos) == '/' )
- break;
- aName = rtl::OUStringToOString(aPfad.Copy( 2, nPos-2 ), osl_getThreadTextEncoding());
- aStack.Push( new DirEntry( aName, FSYS_FLAG_ABSROOT ) );
- }
- // Is the name the root of the current drive?
- else if ( nPos == 0 && aPfad.Len() > 0 &&
- ( aPfad.GetChar(0) == '\\' || aPfad.GetChar(0) == '/' ) )
- {
- // Push root directory of current drive
- aStack.Push( new DirEntry( FSYS_FLAG_ABSROOT ) );
- }
- else
- {
- // Is the name itself a drive?
- if ( nPos < aPfad.Len() && aPfad.GetChar(nPos) == ':' )
- {
- aName = rtl::OUStringToOString(aPfad.Copy( 0, nPos + 1 ), osl_getThreadTextEncoding());
-
- // Is the name the root of a drive?
- if ( (nPos + 1) < aPfad.Len() &&
- ( aPfad.GetChar(nPos+1) == '\\' || aPfad.GetChar(nPos+1) == '/' ) )
- {
- // unsupported if stack not empty or is a Novell format (URL)
- if ( !aStack.Empty() || aName.getLength() > 2 )
- {
- aName = rPfad;
- return FSYS_ERR_MISPLACEDCHAR;
- }
- // Push as root directory of drive
- aStack.Push( new DirEntry( aName, FSYS_FLAG_ABSROOT ) );
- }
- else
- {
- // clear stack if another drive is currently on it
- if ( !aStack.Empty() )
- {
- rtl::OString aThis(aStack.Bottom()->aName);
- aThis = aThis.toAsciiLowerCase();
- rtl::OString aOther(aName);
- aOther = aOther.toAsciiLowerCase();
- if (aThis.compareTo(aOther) != 0)
- aStack.Clear();
- }
-
- if ( aStack.Empty() )
- aStack.Push( new DirEntry( aName, FSYS_FLAG_RELROOT ) );
- }
- }
- // Name is not a drive
- else
- {
- // split the name without seperator
- aName = rtl::OUStringToOString(aPfad.Copy( 0, nPos ), osl_getThreadTextEncoding());
-
- // Is the name the current directory?
- if ( aName == "." )
- /* do nothing */;
-
- // Is the name the parent directory?
- else if ( aName == ".." )
- {
- // Is the stack empty, or a parent (or relative root) on it?
- if ( ( aStack.Empty() ) ||
- ( aStack.Top()->eFlag == FSYS_FLAG_PARENT ) ||
- ( aStack.Top()->eFlag == FSYS_FLAG_RELROOT ) )
- // add leading parent to stack
- aStack.Push( new DirEntry( FSYS_FLAG_PARENT ) );
-
- // It's an absolute root path
- else if ( aStack.Top()->eFlag == FSYS_FLAG_ABSROOT )
- {
- // Then there is no parent directory
- aName = rPfad;
- return FSYS_ERR_NOTEXISTS;
- }
- else
- // Otherwise removee parent TOS
- delete aStack.Pop();
- }
-
- else
- {
- // add ordinary entries to the stack
- DirEntry *pNew = new DirEntry( aName, FSYS_FLAG_NORMAL );
- if ( !pNew->IsValid() )
- {
- aName = rPfad;
- ErrCode eErr = pNew->GetError();
- delete pNew;
- return eErr;
- }
- aStack.Push( pNew );
- }
- }
- }
-
- // determine remainder of path
- aPfad.Erase( 0, nPos + 1 );
- while ( aPfad.Len() && ( aPfad.GetChar(0) == '\\' || aPfad.GetChar(0) == '/' ) )
- aPfad.Erase( 0, 1 );
- }
- while ( aPfad.Len() );
-
- sal_uIntPtr nErr = ERRCODE_NONE;
- // Set the main entry itself
- if ( aStack.Empty() )
- {
- eFlag = FSYS_FLAG_CURRENT;
- aName = rtl::OString();
- }
- else
- {
- eFlag = aStack.Top()->eFlag;
- aName = aStack.Top()->aName;
- nErr = aStack.Top()->nError;
- delete aStack.Pop();
- }
-
- // pop parent entry from stack
- DirEntry** pTemp = &pParent;
- while ( !aStack.Empty() )
- {
- *pTemp = aStack.Pop();
-
- // set member pointer to the pParent of the member's own parent
- pTemp = &( (*pTemp)->pParent );
- }
-
- // Does this describe a volume?
- if ( !pParent && eFlag == FSYS_FLAG_RELROOT && !aName.isEmpty() )
- eFlag = FSYS_FLAG_VOLUME;
-
- // use full aName if error code was set
- if ( nErr )
- aName = rPfad;
- return nErr;
-#else
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- // Add single names to the stack
- DirEntryStack aStack;
- rtl::OString aPfad(rPfad);
- do
- {
- // split names on the first occurance of "/",
- // if '/' starts the string, it itself becomes the name
-
- // search first occurance of "/"
- sal_uInt16 nPos;
- for ( nPos = 0;
- nPos < aPfad.getLength() && aPfad[nPos] != '/';
- nPos++ )
- /* do nothing */;
-
- // is the name the root of the current drive?
- if ( nPos == 0 && !aPfad.isEmpty() && ( aPfad[0] == '/' ) )
- {
- // push root directory of current drive to stack
- aStack.Push( new DirEntry( FSYS_FLAG_ABSROOT ) );
- }
- else
- {
- // split name without seperator
- aName = aPfad.copy(0, nPos);
-
- // Is the name the current directory?
- if ( aName == "." )
- /* do nothing */;
-
-#ifdef UNX
- // Is the name the user's home directory?
- else if ( aName == "~" )
- {
- DirEntry aHome( String( (const char *) getenv( "HOME" ), osl_getThreadTextEncoding()) );
- for ( sal_uInt16 n = aHome.Level(); n; --n )
- aStack.Push( new DirEntry( aHome[ (sal_uInt16) n-1 ] ) );
- }
-#endif
- // Is the name the current parent directory?
- else if ( aName == ".." )
- {
- // Is the stack empty, or a parent (or relative root) is on top?
- if ( ( aStack.Empty() ) || ( aStack.Top()->eFlag == FSYS_FLAG_PARENT ) )
- {
- // push leading parents to stack
- aStack.Push( new DirEntry(rtl::OString(), FSYS_FLAG_PARENT) );
- }
- // Is the name an absolute root?
- else if ( aStack.Top()->eFlag == FSYS_FLAG_ABSROOT )
- {
- // they do not have parent directories
- return FSYS_ERR_NOTEXISTS;
- }
- else
- // otherwise remove parent TOS from stack
- delete aStack.Pop();
- }
- else
- {
- DirEntry *pNew = NULL;
- // push ordinary entries on the stack
- pNew = new DirEntry( aName, FSYS_FLAG_NORMAL );
- if ( !pNew->IsValid() )
- {
- aName = rPfad;
- ErrCode eErr = pNew->GetError();
- delete pNew;
- return eErr;
- }
- aStack.Push( pNew );
- }
- }
-
- // get remainder of path
- aPfad = nPos < aPfad.getLength()
- ? aPfad.copy(nPos + 1) : rtl::OString();
- while ( !aPfad.isEmpty() && ( aPfad[0] == '/' ) )
- aPfad = aPfad.copy(1);
- }
- while (!aPfad.isEmpty());
-
- // insert main entry itself
- if ( aStack.Empty() )
- {
- eFlag = FSYS_FLAG_CURRENT;
- aName = rtl::OString();
- }
- else
- {
- eFlag = aStack.Top()->eFlag;
- aName = aStack.Top()->aName;
- delete aStack.Pop();
- }
-
- // Get parent entries from stack
- DirEntry** pTemp = &pParent;
- while ( !aStack.Empty() )
- {
- *pTemp = aStack.Pop();
- pTemp = &( (*pTemp)->pParent );
- }
-
- return FSYS_ERR_OK;
-#endif
-}
-
-static FSysPathStyle GetStyle( FSysPathStyle eStyle )
-{
- if ( eStyle == FSYS_STYLE_HOST || eStyle == FSYS_STYLE_DETECT )
- return DEFSTYLE;
- else
- return eStyle;
-}
-
-/** Convert name to match OS norm. */
-void DirEntry::ImpTrim()
-{
- // Do not trim wildcard characters
- if ( ( aName.indexOf( '*' ) != -1 ) ||
- ( aName.indexOf( '?' ) != -1 ) ||
- ( aName.indexOf( ';' ) != -1 ) )
- return;
-
-#if defined(WNT)
- if ( aName.getLength() > 254 )
- {
- nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
- aName = aName.copy(254);
- }
-#else
- if ( aName.getLength() > 250 )
- {
- nError = ERRCODE_IO_MISPLACEDCHAR|ERRCODE_WARNING_MASK;
- aName = aName.copy(250);
- }
-#endif
-}
-
-DirEntry::DirEntry( const rtl::OString& rName, DirEntryFlag eDirFlag ) :
- pStat( 0 ),
- aName( rName )
-{
- DBG_CTOR( DirEntry, ImpCheckDirEntry );
-
- pParent = NULL;
- eFlag = eDirFlag;
- nError = FSYS_ERR_OK;
-
- ImpTrim();
-}
-
-DirEntry::DirEntry( const DirEntry& rOrig ) :
- pStat( rOrig.pStat ? new FileStat(*rOrig.pStat) : 0 ),
- aName( rOrig.aName )
-{
- DBG_CTOR( DirEntry, ImpCheckDirEntry );
-
- eFlag = rOrig.eFlag;
- nError = rOrig.nError;
-
- if ( rOrig.pParent )
- {
- pParent = new DirEntry( *rOrig.pParent );
- }
- else
- {
- pParent = NULL;
- }
-}
-
-DirEntry::DirEntry( const String& rInitName, FSysPathStyle eStyle ) :
- pStat( 0 )
-{
- DBG_CTOR( DirEntry, ImpCheckDirEntry );
-
- (void) eStyle; // only used for DBG_UTIL
-
- pParent = NULL;
-
- // faster check for empty string
- if ( !rInitName.Len())
- {
- eFlag = FSYS_FLAG_CURRENT;
- nError = FSYS_ERR_OK;
- return;
- }
-
- rtl::OString aTmpName(rtl::OUStringToOString(rInitName, osl_getThreadTextEncoding()));
- if (aTmpName.matchIgnoreAsciiCase(rtl::OString("file:")))
- {
- DBG_WARNING( "File URLs are not permitted but accepted" );
- aTmpName = rtl::OUStringToOString(INetURLObject( rInitName ).PathToFileName(), osl_getThreadTextEncoding());
-#ifdef DBG_UTIL
- eStyle = FSYS_STYLE_HOST;
-#endif
- }
- else
- {
- ::rtl::OUString aTmp;
- ::rtl::OUString aOInitName;
- if ( FileBase::getFileURLFromSystemPath( OUString( rInitName ), aTmp ) == FileBase::E_None )
- {
- aOInitName = OUString( rInitName );
- aTmpName = rtl::OUStringToOString(aOInitName, osl_getThreadTextEncoding());
- }
-
-#ifdef DBG_UTIL
- if (eStyle == FSYS_STYLE_HOST && aTmpName.indexOf( "://" ) != -1)
- {
- rtl::OStringBuffer aErr("DirEntries akzeptieren nur File URLS: ");
- aErr.append(aTmpName);
- DBG_WARNING(aErr.getStr());
- }
-#endif
- }
-
- nError = ImpParseName( aTmpName );
-
- if ( nError != FSYS_ERR_OK )
- eFlag = FSYS_FLAG_INVALID;
-}
-
-DirEntry::DirEntry( const rtl::OString& rInitName, FSysPathStyle eStyle ) :
- pStat( 0 )
-{
- DBG_CTOR( DirEntry, ImpCheckDirEntry );
-
- (void) eStyle; // only used for DBG_UTIL
-
- pParent = NULL;
-
- // faster check for empty string
- if ( rInitName.isEmpty() )
- {
- eFlag = FSYS_FLAG_CURRENT;
- nError = FSYS_ERR_OK;
- return;
- }
-
- rtl::OString aTmpName( rInitName );
- if (aTmpName.matchIgnoreAsciiCase(rtl::OString("file:")))
- {
- DBG_WARNING( "File URLs are not permitted but accepted" );
- aTmpName = rtl::OUStringToOString(INetURLObject( rInitName ).PathToFileName(), osl_getThreadTextEncoding());
-#ifdef DBG_UTIL
- eStyle = FSYS_STYLE_HOST;
-#endif
- }
-#ifdef DBG_UTIL
- else
- {
- if( eStyle == FSYS_STYLE_HOST && rInitName.indexOf("://") != -1 )
- {
- rtl::OStringBuffer aErr("DirEntries akzeptieren nur File URLS: ");
- aErr.append(rInitName);
- DBG_WARNING(aErr.getStr());
- }
- }
-#endif
-
- nError = ImpParseName( aTmpName );
-
- if ( nError != FSYS_ERR_OK )
- eFlag = FSYS_FLAG_INVALID;
-}
-
-DirEntry::DirEntry( DirEntryFlag eDirFlag ) :
- pStat( 0 )
-{
- DBG_CTOR( DirEntry, ImpCheckDirEntry );
-
- eFlag = eDirFlag;
- nError = ( eFlag == FSYS_FLAG_INVALID ) ? FSYS_ERR_UNKNOWN : FSYS_ERR_OK;
- pParent = NULL;
-}
-
-DirEntry::~DirEntry()
-{
- DBG_DTOR( DirEntry, ImpCheckDirEntry );
-
- delete pParent;
-
- delete pStat;
-}
-
-const DirEntry* DirEntry::ImpGetTopPtr() const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- const DirEntry *pTemp = this;
- while ( pTemp->pParent )
- pTemp = pTemp->pParent;
-
- return pTemp;
-}
-
-DirEntry* DirEntry::ImpGetTopPtr()
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- DirEntry *pTemp = this;
- while ( pTemp->pParent )
- pTemp = pTemp->pParent;
-
- return pTemp;
-}
-
-DirEntry* DirEntry::ImpChangeParent( DirEntry* pNewParent, sal_Bool bNormalize )
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- DirEntry *pTemp = pParent;
- if ( bNormalize && pNewParent &&
- pNewParent->eFlag == FSYS_FLAG_RELROOT && pNewParent->aName.isEmpty() )
- {
- pParent = 0;
- delete pNewParent;
- }
- else
- pParent = pNewParent;
-
- return pTemp;
-}
-
-sal_Bool DirEntry::Exists( FSysAccess nAccess ) const
-{
- static osl::Mutex aLocalMutex;
- osl::MutexGuard aGuard( aLocalMutex );
- if ( !IsValid() )
- return sal_False;
-
-#if defined WNT
- // get special file names from system
- if ( aName.equalsIgnoreAsciiCase("CLOCK$") ||
- aName.equalsIgnoreAsciiCase("CON") ||
- aName.equalsIgnoreAsciiCase("AUX") ||
- aName.equalsIgnoreAsciiCase("COM1") ||
- aName.equalsIgnoreAsciiCase("COM2") ||
- aName.equalsIgnoreAsciiCase("COM3") ||
- aName.equalsIgnoreAsciiCase("COM4") ||
- aName.equalsIgnoreAsciiCase("LPT1") ||
- aName.equalsIgnoreAsciiCase("LPT2") ||
- aName.equalsIgnoreAsciiCase("LPT3") ||
- aName.equalsIgnoreAsciiCase("NUL") ||
- aName.equalsIgnoreAsciiCase("PRN") )
- return sal_True;
-#endif
-
- DirEntryKind eKind = FileStat( *this, nAccess ).GetKind();
- if ( eKind & ( FSYS_KIND_FILE | FSYS_KIND_DIR ) )
- {
- return sal_True;
- }
-
-#if defined WNT
- if ( 0 != ( eKind & FSYS_KIND_DEV ) )
- {
- return DRIVE_EXISTS( ImpGetTopPtr()->aName[0] );
- }
-#endif
-
- return 0 != ( eKind & ( FSYS_KIND_FILE | FSYS_KIND_DIR ) );
-}
-
-sal_Bool DirEntry::First()
-{
- String aUniPathName( GetPath().GetFull() );
- rtl::OString aPathName(rtl::OUStringToOString(aUniPathName, osl_getThreadTextEncoding()));
-
- DIR *pDir = opendir(aPathName.getStr());
- if ( pDir )
- {
- WildCard aWildeKarte(rtl::OStringToOUString(CMP_LOWER(aName), osl_getThreadTextEncoding()));
- for ( dirent* pEntry = readdir( pDir );
- pEntry;
- pEntry = readdir( pDir ) )
- {
- rtl::OString aFound(pEntry->d_name);
- if (aWildeKarte.Matches(rtl::OStringToOUString(CMP_LOWER(aFound), osl_getThreadTextEncoding())))
- {
- aName = aFound;
- closedir( pDir );
- return sal_True;
- }
- }
- closedir( pDir );
- }
- return sal_False;
-}
-
-String DirEntry::GetFull( FSysPathStyle eStyle, sal_Bool bWithDelimiter,
- sal_uInt16 nMaxChars ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- rtl::OStringBuffer aBuf;
- eStyle = GetStyle( eStyle );
- if ( pParent )
- {
- if ( ( pParent->eFlag == FSYS_FLAG_ABSROOT ||
- pParent->eFlag == FSYS_FLAG_RELROOT ||
- pParent->eFlag == FSYS_FLAG_VOLUME ) )
- {
- aBuf.append(rtl::OUStringToOString(pParent->GetName( eStyle ), osl_getThreadTextEncoding()));
- aBuf.append(rtl::OUStringToOString(GetName( eStyle ), osl_getThreadTextEncoding()));
- }
- else
- {
- aBuf.append(rtl::OUStringToOString(pParent->GetFull( eStyle ), osl_getThreadTextEncoding()));
- aBuf.append(ACCESSDELIM_C(eStyle));
- aBuf.append(rtl::OUStringToOString(GetName( eStyle ), osl_getThreadTextEncoding()));
- }
- }
- else
- {
- aBuf.append(rtl::OUStringToOString(GetName(eStyle), osl_getThreadTextEncoding()));
- }
-
- //! Hack
- if ( bWithDelimiter )
- if ( aBuf[aBuf.getLength()-1] != ACCESSDELIM_C(eStyle) )
- aBuf.append(ACCESSDELIM_C(eStyle));
-
- rtl::OString aRet = aBuf.makeStringAndClear();
-
- // HACK
- if ( nMaxChars < STRING_MAXLEN )
- aRet = ImplCutPath( aRet, nMaxChars, ACCESSDELIM_C(eStyle) );
-
- return rtl::OStringToOUString(aRet, osl_getThreadTextEncoding());
-}
-
-DirEntry DirEntry::GetPath() const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- if ( pParent )
- return DirEntry( *pParent );
-
- return DirEntry();
-}
-
-String DirEntry::GetExtension( char cSep ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- const char *p0 = aName.getStr();
- const char *p1 = p0 + aName.getLength() - 1;
- while ( p1 >= p0 && *p1 != cSep )
- p1--;
-
- if ( p1 >= p0 )
- {
- // found a cSep at position p1
- return rtl::OStringToOUString(aName.copy(p1 - p0 + 1),
- osl_getThreadTextEncoding());
- }
-
- return String();
-}
-
-String DirEntry::GetBase( char cSep ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- const char *p0 = aName.getStr();
- const char *p1 = p0 + aName.getLength() - 1;
- while ( p1 >= p0 && *p1 != cSep )
- p1--;
-
- if ( p1 >= p0 )
- {
- // found a cSep at position p1
- return rtl::OStringToOUString(aName.copy(0, p1 - p0),
- osl_getThreadTextEncoding());
-
- }
- // did not find a cSep
- return rtl::OStringToOUString(aName, osl_getThreadTextEncoding());
-}
-
-String DirEntry::GetName( FSysPathStyle eStyle ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- rtl::OStringBuffer aRet;
- eStyle = GetStyle( eStyle );
-
- switch( eFlag )
- {
- case FSYS_FLAG_PARENT:
- aRet.append(ACTPARENT(eStyle));
- break;
-
- case FSYS_FLAG_ABSROOT:
- {
- aRet.append(aName);
- aRet.append(ACCESSDELIM_C(eStyle));
- break;
- }
-
- case FSYS_FLAG_INVALID:
- case FSYS_FLAG_VOLUME:
- {
- aRet.append(aName);
- break;
- }
-
- case FSYS_FLAG_RELROOT:
- if ( aName.isEmpty() )
- {
- aRet.append(ACTCURRENT(eStyle));
- break;
- }
-
- default:
- aRet.append(aName);
- break;
- }
-
- return rtl::OStringToOUString(aRet.makeStringAndClear(),
- osl_getThreadTextEncoding());
-}
-
-bool DirEntry::IsAbs() const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
-#ifdef UNX
- return ( pParent ? pParent->IsAbs() : eFlag == FSYS_FLAG_ABSROOT );
-#else
- return ( pParent ? pParent->IsAbs() : eFlag == FSYS_FLAG_ABSROOT && !aName.isEmpty() );
-#endif
-}
-
-String DirEntry::CutName( FSysPathStyle eStyle )
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- eStyle = GetStyle( eStyle );
-
- String aOldName( GetName( eStyle ) );
-
- if ( pParent )
- {
- DirEntry *pOldParent = pParent;
- if ( pOldParent )
- {
- pParent = pOldParent->pParent;
- eFlag = pOldParent->eFlag;
- aName = pOldParent->aName;
- pOldParent->pParent = NULL;
- delete pOldParent;
- }
- else
- {
- eFlag = FSYS_FLAG_CURRENT;
- aName = rtl::OString();
- }
- }
- else
- {
- eFlag = FSYS_FLAG_CURRENT;
- aName = rtl::OString();
- delete pParent;
- pParent = NULL;
- }
-
- return aOldName;
-}
-
-sal_Bool DirEntry::operator==( const DirEntry& rEntry ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- // test whether the contents are textual the same
-
- if ( nError && ( nError == rEntry.nError ) )
- return sal_True;
- if ( nError || rEntry.nError ||
- ( eFlag == FSYS_FLAG_INVALID ) ||
- ( rEntry.eFlag == FSYS_FLAG_INVALID ) )
- return sal_False;
-
- const DirEntry *pThis = (DirEntry *)this;
- const DirEntry *pWith = (DirEntry *)&rEntry;
- while( pThis && pWith && (pThis->eFlag == pWith->eFlag) )
- {
- if ( CMP_LOWER(pThis->aName) != CMP_LOWER(pWith->aName) )
- break;
- pThis = pThis->pParent;
- pWith = pWith->pParent;
- }
-
- return ( !pThis && !pWith );
-}
-
-DirEntry& DirEntry::operator=( const DirEntry& rEntry )
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- if ( this == &rEntry )
- return *this;
- if ( rEntry.nError != FSYS_ERR_OK ) {
- OSL_FAIL("Zuweisung mit invalidem DirEntry");
- nError = rEntry.nError;
- return *this;
- }
-
- // set name and type, but keep refs
- aName = rEntry.aName;
- eFlag = rEntry.eFlag;
- nError = FSYS_ERR_OK;
-
- DirEntry *pOldParent = pParent;
- if ( rEntry.pParent )
- pParent = new DirEntry( *rEntry.pParent );
- else
- pParent = NULL;
-
- if ( pOldParent )
- delete pOldParent;
- return *this;
-}
-
-DirEntry DirEntry::operator+( const DirEntry& rEntry ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-#ifdef DBG_UTIL
- static sal_Bool bTested = sal_False;
- if ( !bTested )
- {
- bTested = sal_True;
- FSysTest();
- }
-#endif
-
- const DirEntry *pEntryTop = rEntry.ImpGetTopPtr();
- const DirEntry *pThisTop = ImpGetTopPtr();
-
- if (
- (eFlag == FSYS_FLAG_RELROOT && aName.isEmpty()) ||
- (
- (!pEntryTop->aName.isEmpty() ||
- ((rEntry.Level()>1)?(rEntry[rEntry.Level()-2].aName.equalsIgnoreAsciiCase(RFS_IDENTIFIER)):sal_False))
- &&
- (pEntryTop->eFlag == FSYS_FLAG_ABSROOT ||
- pEntryTop->eFlag == FSYS_FLAG_RELROOT ||
- pEntryTop->eFlag == FSYS_FLAG_VOLUME)
- )
- )
- {
- return rEntry;
- }
-
- // something + "." (=> pEntryTop == &rEntry)
- if (pEntryTop->eFlag == FSYS_FLAG_RELROOT && pEntryTop->aName.isEmpty())
- {
- DBG_ASSERT( pEntryTop == &rEntry, "DirEntry::op+ buggy" );
- return *this;
- }
-
- // root += ".." (=> impossible)
- if ( pEntryTop->eFlag == FSYS_FLAG_PARENT && pThisTop == this &&
- ( eFlag == FSYS_FLAG_ABSROOT ) )
- return DirEntry( FSYS_FLAG_INVALID );
-
- // something += abs (=> only append device if existant)
- if ( pEntryTop->eFlag == FSYS_FLAG_ABSROOT )
- {
- rtl::OString aDevice;
- if ( pThisTop->eFlag == FSYS_FLAG_ABSROOT )
- aDevice = pThisTop->aName;
- DirEntry aRet = rEntry;
- if ( !aDevice.isEmpty() )
- aRet.ImpGetTopPtr()->aName = aDevice;
- return aRet;
- }
-
- // something += ".." (=> break apart)
- if ( eFlag == FSYS_FLAG_NORMAL && pEntryTop->eFlag == FSYS_FLAG_PARENT )
- {
- String aConcated( GetFull() );
- aConcated += ACCESSDELIM_C(FSYS_STYLE_HOST);
- aConcated += rEntry.GetFull();
- return DirEntry( aConcated );
- }
-
- // otherwise append consecutively
- DirEntry aRet( rEntry );
- DirEntry *pTop = aRet.ImpGetTopPtr();
- pTop->pParent = new DirEntry( *this );
-
- return aRet;
-}
-
-DirEntry &DirEntry::operator+=( const DirEntry& rEntry )
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- return *this = *this + rEntry;
-}
-
-String DirEntry::GetAccessDelimiter( FSysPathStyle eFormatter )
-{
- return rtl::OUString( ACCESSDELIM_C( GetStyle( eFormatter ) ) );
-}
-
-void DirEntry::SetExtension( const String& rExtension, char cSep )
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- // do not set extensions for drives
- if(eFlag == FSYS_FLAG_ABSROOT)
- {
- nError = FSYS_ERR_NOTSUPPORTED;
- return;
- }
-
- rtl::OStringBuffer aBuf(aName);
-
- // search cSep within aName
- const sal_Char *p0 = aBuf.getStr();
- const sal_Char *p1 = p0 + aBuf.getLength() - 1;
- while ( p1 >= p0 && *p1 != cSep )
- p1--;
- if ( p1 >= p0 )
- {
- // found a cSep on position p1
-
- sal_Int32 n = static_cast<sal_Int32>(
- p1 - p0 + 1 - ( rExtension.Len() ? 0 : 1 ));
-
- aBuf.remove(n, aBuf.getLength()-n);
- }
- else if ( rExtension.Len() )
- {
- // no cSep was found
- aBuf.append(cSep);
- }
-
- aBuf.append(rtl::OUStringToOString(rExtension,
- osl_getThreadTextEncoding()));
-
- aName = aBuf.makeStringAndClear();
-}
-
-void DirEntry::SetName( const String& rName, FSysPathStyle eFormatter )
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- if ( eFormatter == FSYS_STYLE_HOST || eFormatter == FSYS_STYLE_DETECT )
- eFormatter = DEFSTYLE;
- sal_Char cAccDelim(ACCESSDELIM_C(eFormatter));
-
- if ( (eFlag != FSYS_FLAG_NORMAL) ||
- (aName.indexOf(':') != -1) ||
- (aName.indexOf(cAccDelim) != -1) )
- {
- eFlag = FSYS_FLAG_INVALID;
- }
- else
- {
- aName = rtl::OUStringToOString(rName, osl_getThreadTextEncoding());
- }
-}
-
-sal_Bool DirEntry::Find( const String& rPfad, char cDelim )
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- if ( ImpGetTopPtr()->eFlag == FSYS_FLAG_ABSROOT )
- return sal_True;
-
- sal_Bool bWild = aName.indexOf( '*' ) != -1 ||
- aName.indexOf( '?' ) != -1;
-
- if ( !cDelim )
- cDelim = SEARCHDELIM(DEFSTYLE)[0];
-
- rtl::OString aThis = rtl::OStringBuffer()
- .append(ACCESSDELIM_C(DEFSTYLE))
- .append(rtl::OUStringToOString(GetFull(),
- osl_getThreadTextEncoding()))
- .makeStringAndClear();
- sal_Int32 nIndex = 0;
- do
- {
- rtl::OStringBuffer aPath(rtl::OUStringToOString(rPfad,
- osl_getThreadTextEncoding()).getToken( 0, cDelim, nIndex ));
-
- if ( aPath.getLength() )
- {
- if (aPath[aPath.getLength()-1] == ACCESSDELIM_C(DEFSTYLE))
- aPath.remove(aPath.getLength()-1, 1);
- aPath.append(aThis);
- DirEntry aEntry(rtl::OStringToOUString(
- aPath.makeStringAndClear(), osl_getThreadTextEncoding()));
- if ( aEntry.ToAbs() &&
- ( ( !bWild && aEntry.Exists() ) || ( bWild && aEntry.First() ) ) )
- {
- (*this) = aEntry;
- return sal_True;
- }
- }
- }
- while ( nIndex >= 0 );
- return sal_False;
-}
-
-#ifndef UNX
-DirEntry DirEntry::GetDevice() const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- const DirEntry *pTop = ImpGetTopPtr();
-
- if ( ( pTop->eFlag == FSYS_FLAG_ABSROOT || pTop->eFlag == FSYS_FLAG_RELROOT ) &&
- !pTop->aName.isEmpty() )
- return DirEntry( pTop->aName, FSYS_FLAG_VOLUME );
- else
- return DirEntry( rtl::OString(), FSYS_FLAG_INVALID );
-}
-#endif
-
-String DirEntry::GetSearchDelimiter( FSysPathStyle eFormatter )
-{
- return rtl::OStringToOUString(rtl::OString(SEARCHDELIM(GetStyle(eFormatter))), osl_getThreadTextEncoding());
-}
-
-namespace
-{
- struct TempNameBase_Impl : public rtl::Static< DirEntry, TempNameBase_Impl > {};
-}
-
-DirEntry DirEntry::TempName( DirEntryKind eKind ) const
-{
- // use base-temp-dir if necessary
- const DirEntry &rEntry = TempNameBase_Impl::get();
- if ( !pParent && FSYS_FLAG_CURRENT != rEntry.eFlag && FSYS_FLAG_ABSROOT != eFlag )
- {
- DirEntry aFactory( rEntry );
- aFactory += GetName();
- return aFactory.TempName();
- }
-
- rtl::OString aDirName;
- char *ret_val;
- size_t i;
-
- // determine Directory, Prefix and Extension
- char pfx[6];
- char ext[5];
- const char *dir;
- const char *pWild = strchr( aName.getStr(), '*' );
- if ( !pWild )
- pWild = strchr( aName.getStr(), '?' );
-
- if ( pWild )
- {
- if ( pParent )
- aDirName = rtl::OUStringToOString(pParent->GetFull(), osl_getThreadTextEncoding());
- strncpy( pfx, aName.getStr(), Min( (int)5, (int)(pWild-aName.getStr()) ) );
- pfx[ pWild-aName.getStr() ] = 0;
- const char *pExt = strchr( pWild, '.' );
- if ( pExt )
- {
- strncpy( ext, pExt, 4 );
- ext[4] = 0;
- }
- else
- strcpy( ext, ".tmp" );
- }
- else
- {
- aDirName = rtl::OUStringToOString(GetFull(), osl_getThreadTextEncoding());
- strcpy( pfx, "lo" );
- strcpy( ext, ".tmp" );
- }
- dir = aDirName.getStr();
-
- OString sTempRoot;
- if ( eFlag == FSYS_FLAG_CURRENT || ( !pParent && pWild ) )
- {
- rtl::OUString aPath = GetSystemTempDirPath_Impl();
- sTempRoot = OUStringToOString( aPath, osl_getThreadTextEncoding() );
- dir = sTempRoot.getStr();
- }
-
- DirEntry aRet(FSYS_FLAG_INVALID);
- i = strlen(dir);
- // need to add ?\\? + prefix + number + pid + .ext + '\0'
-# define TMPNAME_SIZE ( 1 + 5 + 5 + 10 + 4 + 1 )
- ret_val = new char[i + TMPNAME_SIZE ];
- if (ret_val)
- {
- strcpy(ret_val,dir);
-
- /* Make sure directory ends with a separator */
-#if defined(WNT)
- if ( i>0 && ret_val[i-1] != '\\' && ret_val[i-1] != '/' &&
- ret_val[i-1] != ':')
- ret_val[i++] = '\\';
-#elif defined UNX
- if (i>0 && ret_val[i-1] != '/')
- ret_val[i++] = '/';
-#else
-#error unknown operating system
-#endif
-
- strncpy(ret_val + i, pfx, 5);
- ret_val[i + 5] = '\0'; /* strncpy doesn't put a 0 if more */
- i = strlen(ret_val); /* than 'n' chars. */
-
- /* Prefix can have 5 chars, leaving 3 for numbers. 26 ** 3 == 17576
- * Welcome to the 21st century, we can have longer filenames now ;)
- * New format: pfx + "5 char milli/micro second res" + "current pid" + ".tmp"
- */
-#ifdef _WIN32
- /* Milliseconds !! */
- static unsigned long u = GetTickCount();
- unsigned long mypid = static_cast<unsigned long>(_getpid());
-#else
- /* Microseconds !! */
- static unsigned long u = clock();
- unsigned long mypid = static_cast<unsigned long>(getpid());
-#endif
- for ( unsigned long nOld = u; ++u != nOld; ) /* Hae??? */
- {
- u %= 100000; /* on *NIX repeats every 100ms, maybe less if CLOCKS_PER_SEC > 10^6 */
- snprintf(ret_val+i, TMPNAME_SIZE, "%05lu%lu", u, mypid);
-
- strcat(ret_val,ext);
-
- if ( FSYS_KIND_FILE == eKind )
- {
- SvFileStream aStream( String( ret_val, osl_getThreadTextEncoding()),
- STREAM_WRITE|STREAM_SHARE_DENYALL );
- if ( aStream.IsOpen() )
- {
- aStream.Seek( STREAM_SEEK_TO_END );
- if ( 0 == aStream.Tell() )
- {
- aRet = DirEntry( String( ret_val, osl_getThreadTextEncoding()));
- break;
- }
- aStream.Close();
- }
- }
- else
- {
- // Redirect
- String aRetVal(ret_val, osl_getThreadTextEncoding());
- String aRedirected (aRetVal);
- if ( FSYS_KIND_DIR == eKind )
- {
- if (0 == _mkdir(rtl::OUStringToOString(aRedirected, osl_getThreadTextEncoding()).getStr()))
- {
- aRet = DirEntry( aRetVal );
- break;
- }
- }
- else
- {
-#if defined(UNX)
- if (access(rtl::OUStringToOString(aRedirected, osl_getThreadTextEncoding()).getStr(), F_OK))
- {
- aRet = DirEntry( aRetVal );
- break;
- }
-#else
- struct stat aStat;
- if (stat(rtl::OUStringToOString(aRedirected, osl_getThreadTextEncoding()).getStr(), &aStat))
- {
- aRet = DirEntry( aRetVal );
- break;
- }
-#endif
- }
- }
- }
-
- delete[] ret_val;
- ret_val = 0;
- }
-
- return aRet;
-}
-
-const DirEntry &DirEntry::operator[]( sal_uInt16 nParentLevel ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- //TPF: maybe to be implemented (FastFSys)
-
- const DirEntry *pRes = this;
- while ( pRes && nParentLevel-- )
- pRes = pRes->pParent;
-
- return *pRes;
-}
-
-sal_Bool DirEntry::MakeDir( sal_Bool bSloppy ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- // fast check if exists
- if ( FileStat( *this ).IsKind( FSYS_KIND_DIR ) )
- return sal_True;
- if ( bSloppy && pParent )
- if ( FileStat( *pParent ).IsKind( FSYS_KIND_DIR ) )
- return sal_True;
-
- const DirEntry *pNewDir = bSloppy ? pParent : this;
- if ( pNewDir )
- {
- // Create path to dir
- if ( pNewDir->pParent && !pNewDir->pParent->MakeDir(sal_False) )
- return sal_False;
-
- // create dir ourselves
- if ( pNewDir->eFlag == FSYS_FLAG_ABSROOT ||
- pNewDir->eFlag == FSYS_FLAG_VOLUME )
- return sal_True;
- else
- {
- //? nError = ???
- if ( FileStat( *pNewDir ).IsKind( FSYS_KIND_DIR ) )
- return sal_True;
- else
- {
- String aDirName(pNewDir->GetFull());
- rtl::OString bDirName(rtl::OUStringToOString(aDirName, osl_getThreadTextEncoding()));
-
-#ifdef WIN32
- SetLastError(0);
-#endif
- sal_Bool bResult = (0 == _mkdir(bDirName.getStr()));
- if ( !bResult )
- {
-#ifdef WIN32
- ((DirEntry *)this)->SetError( Sys2SolarError_Impl( GetLastError() ) );
-#else
- ((DirEntry *)this)->SetError( Sys2SolarError_Impl( errno ) );
-#endif
- }
-
- return bResult;
- }
- }
- }
- return sal_True;
-}
-
-FSysError DirEntry::Kill( FSysAction nActions ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- FSysError eError = FSYS_ERR_OK;
-
- // Terminate name string with two '0'
- String aTmpName( GetFull() );
- rtl::OString bTmpName(rtl::OUStringToOString(aTmpName, osl_getThreadTextEncoding()));
-
- char *pName = new char[bTmpName.getLength()+2];
- strcpy( pName, bTmpName.getStr() );
- pName[bTmpName.getLength()+1] = (char) 0;
-
- // delete read-only files as well
- sal_Bool isReadOnly = FileStat::GetReadOnlyFlag(*this);
- if (isReadOnly)
- {
- FileStat::SetReadOnlyFlag(*this, sal_False);
- }
-
- // directory?
- if ( FileStat( *this ).IsKind(FSYS_KIND_DIR) )
- {
- // Delete recursively?
- if ( FSYS_ACTION_RECURSIVE == (nActions & FSYS_ACTION_RECURSIVE) )
- {
- Dir aDir( *this, FSYS_KIND_DIR|FSYS_KIND_FILE );
- for ( sal_uInt16 n = 0; eError == FSYS_ERR_OK && n < aDir.Count(); ++n )
- {
- const DirEntry &rSubDir = aDir[n];
- DirEntryFlag flag = rSubDir.GetFlag();
- if ( flag != FSYS_FLAG_CURRENT && flag != FSYS_FLAG_PARENT )
- eError = rSubDir.Kill(nActions);
- }
- }
-
- // remove Dir myself
-#ifdef WIN32
- SetLastError(0);
-#endif
- if ( eError == FSYS_ERR_OK && 0 != _rmdir( (char*) pName ) )
- {
- // Change CWD if deletion failed
-#ifdef WIN32
- eError = Sys2SolarError_Impl( GetLastError() );
-#else
- eError = Sys2SolarError_Impl( errno );
-#endif
- if ( eError )
- {
- GetPath().SetCWD();
-#ifdef WIN32
- SetLastError(0);
-#endif
- if (_rmdir( (char*) pName) != 0)
- {
-#ifdef WIN32
- eError = Sys2SolarError_Impl( GetLastError() );
-#else
- eError = Sys2SolarError_Impl( errno );
-#endif
- }
- else
- {
- eError = FSYS_ERR_OK;
- }
- }
- }
- }
- else
- {
- if ( FSYS_ACTION_USERECYCLEBIN == (nActions & FSYS_ACTION_USERECYCLEBIN) )
- {
-#if defined(WNT)
- SHFILEOPSTRUCT aOp;
- aOp.hwnd = 0;
- aOp.wFunc = FO_DELETE;
- aOp.pFrom = pName;
- aOp.pTo = 0;
- aOp.fFlags = FOF_ALLOWUNDO|FOF_SILENT|FOF_NOCONFIRMATION;
- aOp.hNameMappings = 0;
- aOp.lpszProgressTitle = 0;
- eError = Sys2SolarError_Impl( SHFileOperation( &aOp ) );
-#else
- eError = ERRCODE_IO_NOTSUPPORTED;
-#endif
- }
- else
- {
-#ifdef WIN32
- SetLastError(0);
-#endif
- if ( 0 != _unlink( (char*) pName ) )
- {
-#ifdef WIN32
- eError = Sys2SolarError_Impl( GetLastError() );
-#else
- eError = Sys2SolarError_Impl( errno );
-#endif
- }
- else
- {
- eError = ERRCODE_NONE;
- }
- }
- }
-
- // restore original read-only flag upon error
- if ( isReadOnly && (eError!=ERRCODE_NONE) )
- {
- FileStat::SetReadOnlyFlag(*this, isReadOnly);
- }
-
- delete[] pName;
- return eError;
-}
-
-/** Check if rSubEntry is (in)directly beneath *this */
-sal_Bool DirEntry::Contains( const DirEntry &rSubEntry ) const
-{
- DBG_ASSERT( IsAbs() && rSubEntry.IsAbs(), "must be absolute entries" );
-
- sal_uInt16 nThisLevel = Level();
- sal_uInt16 nSubLevel = rSubEntry.Level();
- if ( nThisLevel < nSubLevel )
- {
- for ( ; nThisLevel; --nThisLevel, --nSubLevel )
- if ( (*this)[nThisLevel-1] != rSubEntry[nSubLevel-1] )
- return sal_False;
- return sal_True;
- }
- return sal_False;
-}
-
-sal_uInt16 DirEntry::Level() const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- sal_uInt16 nLevel = 0;
- const DirEntry *pRes = this;
- while ( pRes )
- {
- pRes = pRes->pParent;
- nLevel++;
- }
-
- return nLevel;
-}
-
-sal_Bool DirEntry::IsValid() const
-{
- return (nError == FSYS_ERR_OK);
-}
-
-#if defined(DBG_UTIL)
-void FSysTest()
-{
-}
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/fsys/fstat.cxx b/tools/source/fsys/fstat.cxx
deleted file mode 100644
index a0bbae1..0000000
--- a/tools/source/fsys/fstat.cxx
+++ /dev/null
@@ -1,133 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * 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 .
- */
-
-#ifdef UNX
-#include <errno.h>
-#endif
-
-#include <limits.h>
-#include <string.h>
-
-#include "comdep.hxx"
-#include <tools/fsys.hxx>
-
-FileStat::FileStat( const DirEntry& rDirEntry, FSysAccess nAccess )
-: // don't use Default-Ctors!
- aDateCreated( sal_uIntPtr(0) ),
- aTimeCreated( sal_uIntPtr(0) ),
- aDateModified( sal_uIntPtr(0) ),
- aTimeModified( sal_uIntPtr(0) ),
- aDateAccessed( sal_uIntPtr(0) ),
- aTimeAccessed( sal_uIntPtr(0) )
-{
- sal_Bool bCached = FSYS_ACCESS_CACHED == (nAccess & FSYS_ACCESS_CACHED);
- sal_Bool bFloppy = FSYS_ACCESS_FLOPPY == (nAccess & FSYS_ACCESS_FLOPPY);
-
- const FileStat *pStatFromDir = bCached ? rDirEntry.ImpGetStat() : 0;
- if ( pStatFromDir )
- {
- nError = pStatFromDir->nError;
- nKindFlags = pStatFromDir->nKindFlags;
- nSize = pStatFromDir->nSize;
- aCreator = pStatFromDir->aCreator;
- aType = pStatFromDir->aType;
- aDateCreated = pStatFromDir->aDateCreated;
- aTimeCreated = pStatFromDir->aTimeCreated;
- aDateModified = pStatFromDir->aDateModified;
- aTimeModified = pStatFromDir->aTimeModified;
- aDateAccessed = pStatFromDir->aDateAccessed;
- aTimeAccessed = pStatFromDir->aTimeAccessed;
- }
- else
-
- Update( rDirEntry, bFloppy );
-}
-
-sal_Bool FileStat::IsKind( DirEntryKind nKind ) const
-{
- sal_Bool bRet = ( ( nKind == FSYS_KIND_UNKNOWN ) &&
- ( nKindFlags == FSYS_KIND_UNKNOWN ) ) ||
- ( ( nKindFlags & nKind ) == nKind );
- return bRet;
-}
-
-sal_Bool FileStat::GetReadOnlyFlag( const DirEntry &rEntry )
-{
- rtl::OString aFPath(rtl::OUStringToOString(rEntry.GetFull(), osl_getThreadTextEncoding()));
-#if defined WNT
- DWORD nRes = GetFileAttributes( (LPCTSTR) aFPath.getStr() );
- return ULONG_MAX != nRes &&
- ( FILE_ATTRIBUTE_READONLY & nRes ) == FILE_ATTRIBUTE_READONLY;
-#elif defined UNX
- /* could we stat the object? */
- struct stat aBuf;
- if (stat(aFPath.getStr(), &aBuf))
- return sal_False;
- /* jupp, is writable for user? */
- return((aBuf.st_mode & S_IWUSR) != S_IWUSR);
-#else
- return sal_False;
-#endif
-}
-
-sal_uIntPtr FileStat::SetReadOnlyFlag( const DirEntry &rEntry, sal_Bool bRO )
-{
-
- rtl::OString aFPath(rtl::OUStringToOString(rEntry.GetFull(), osl_getThreadTextEncoding()));
-
-#if defined WNT
- DWORD nRes = GetFileAttributes( (LPCTSTR) aFPath.getStr() );
- if ( ULONG_MAX != nRes )
- nRes = SetFileAttributes( (LPCTSTR) aFPath.getStr(),
- ( nRes & ~FILE_ATTRIBUTE_READONLY ) |
- ( bRO ? FILE_ATTRIBUTE_READONLY : 0 ) );
- return ( ULONG_MAX == nRes ) ? ERRCODE_IO_UNKNOWN : 0;
-#elif defined UNX
- /* first, stat the object to get permissions */
- struct stat aBuf;
- if (stat(aFPath.getStr(), &aBuf))
- return ERRCODE_IO_NOTEXISTS;
- /* set or clear write bit for user */
- mode_t nMode;
- if (bRO)
- {
- nMode = aBuf.st_mode & ~(S_IWUSR | S_IWGRP | S_IWOTH);
- }
- else
- nMode = aBuf.st_mode | S_IWUSR;
- /* change it on fs */
- if (chmod(aFPath.getStr(), nMode))
- {
- switch (errno)
- {
- case EPERM :
- case EROFS :
- return ERRCODE_IO_ACCESSDENIED;
- default :
- return ERRCODE_IO_NOTEXISTS;
- }
- }
- else
- return ERRCODE_NONE;
-#else
- return ERRCODE_IO_NOTSUPPORTED;
-#endif
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/fsys/tdir.cxx b/tools/source/fsys/tdir.cxx
deleted file mode 100644
index 5e6ed05..0000000
--- a/tools/source/fsys/tdir.cxx
+++ /dev/null
@@ -1,416 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * 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 .
- */
-#define _DIR_CXX
-
-#include <stdlib.h>
-#include <cstdarg>
-#include <limits.h>
-#include <tools/debug.hxx>
-
-#include "comdep.hxx"
-#include <tools/fsys.hxx>
-
-DBG_NAME( Dir )
-
-/// determines whether insertion is required
-sal_Bool Dir::ImpInsertPointReached( const DirEntry& rNewEntry,
- const FileStat& rNewStat,
- size_t nCurPos, size_t nSortIndex ) const
-{
-#define VALUE( nKindFlags ) \
- ( ( FSYS_KIND_FILE | FSYS_KIND_DIR | FSYS_KIND_DEV | \
- FSYS_KIND_CHAR | FSYS_KIND_BLOCK ) & nKindFlags )
-
- if ( pLst->empty() )
- return sal_True;
-
- FSysSort nSort = (*pSortLst)[ nSortIndex ];
- FileStat *pOldStat = NULL;
- DirEntry *pCurLstObj = (*pLst)[ nCurPos ];
- if ( pStatLst )
- pOldStat = (*pStatLst)[ nCurPos ];
-
- switch( nSort )
- {
- case FSYS_SORT_NAME:
- case (FSYS_SORT_NAME | FSYS_SORT_ASCENDING):
- if ( pCurLstObj->aName > rNewEntry.aName )
- return sal_True;
- if ( !(pCurLstObj->aName == rNewEntry.aName) )
- return sal_False;
- break;
- case (FSYS_SORT_NAME | FSYS_SORT_DESCENDING):
- if ( pCurLstObj->aName < rNewEntry.aName )
- return sal_True;
- if ( !(pCurLstObj->aName == rNewEntry.aName) )
- return sal_False;
- break;
-
- case FSYS_SORT_EXT:
- case (FSYS_SORT_EXT | FSYS_SORT_ASCENDING):
- {
- if ( pCurLstObj->GetExtension() > rNewEntry.GetExtension() )
- return sal_True;
- if ( !(pCurLstObj->GetExtension() == rNewEntry.GetExtension()) )
- return sal_False;
- break;
- }
- case (FSYS_SORT_EXT | FSYS_SORT_DESCENDING):
- {
- if ( pCurLstObj->GetExtension() < rNewEntry.GetExtension() )
- return sal_True;
- if ( !(pCurLstObj->GetExtension() == rNewEntry.GetExtension()) )
- return sal_False;
- break;
- }
-
- case FSYS_SORT_KIND:
- case (FSYS_SORT_KIND | FSYS_SORT_ASCENDING ):
- if ( VALUE(pOldStat->nKindFlags) > VALUE(rNewStat.nKindFlags) )
- return sal_True;
- if ( !(VALUE(pOldStat->nKindFlags) == VALUE(rNewStat.nKindFlags)) )
- return sal_False;
- break;
- case (FSYS_SORT_KIND | FSYS_SORT_DESCENDING):
- if ( VALUE(pOldStat->nKindFlags) < VALUE(rNewStat.nKindFlags) )
- return sal_True;
- if ( !(VALUE(pOldStat->nKindFlags) == VALUE(rNewStat.nKindFlags)) )
- return sal_False;
- break;
-
- case FSYS_SORT_SIZE:
- case (FSYS_SORT_SIZE | FSYS_SORT_ASCENDING):
- if ( pOldStat->nSize > rNewStat.nSize )
- return sal_True;
- if ( !(pOldStat->nSize == rNewStat.nSize) )
- return sal_False;
- break;
- case (FSYS_SORT_SIZE | FSYS_SORT_DESCENDING):
- if ( pOldStat->nSize < rNewStat.nSize )
- return sal_True;
- if ( !(pOldStat->nSize == rNewStat.nSize) )
- return sal_False;
- break;
-
- case FSYS_SORT_MODIFYED:
- case (FSYS_SORT_MODIFYED | FSYS_SORT_ASCENDING):
- if ( (pOldStat->aDateModified >= rNewStat.aDateModified) &&
- (pOldStat->aTimeModified > rNewStat.aTimeModified) )
- return sal_True;
- if ( !((pOldStat->aDateModified == rNewStat.aDateModified) &&
- (pOldStat->aTimeModified == rNewStat.aTimeModified)) )
- return sal_False;
- break;
- case (FSYS_SORT_MODIFYED | FSYS_SORT_DESCENDING):
- if ( (pOldStat->aDateModified <= rNewStat.aDateModified) &&
- (pOldStat->aTimeModified < rNewStat.aTimeModified) )
- return sal_True;
- if ( !((pOldStat->aDateModified == rNewStat.aDateModified) &&
- (pOldStat->aTimeModified == rNewStat.aTimeModified)) )
- return sal_False;
- break;
-
- case FSYS_SORT_CREATED:
- case (FSYS_SORT_CREATED | FSYS_SORT_ASCENDING):
- if ( (pOldStat->aDateCreated >= rNewStat.aDateCreated) &&
- (pOldStat->aTimeCreated > rNewStat.aTimeCreated) )
- return sal_True;
- if ( !((pOldStat->aDateCreated == rNewStat.aDateCreated) &&
- (pOldStat->aTimeCreated == rNewStat.aTimeCreated)) )
- return sal_False;
- break;
- case (FSYS_SORT_CREATED | FSYS_SORT_DESCENDING):
- if ( (pOldStat->aDateCreated <= rNewStat.aDateCreated) &&
- (pOldStat->aTimeCreated < rNewStat.aTimeCreated) )
- return sal_True;
- if ( !((pOldStat->aDateCreated == rNewStat.aDateCreated) &&
- (pOldStat->aTimeCreated == rNewStat.aTimeCreated)) )
- return sal_False;
- break;
-
- case FSYS_SORT_ACCESSED:
- case (FSYS_SORT_ACCESSED | FSYS_SORT_ASCENDING):
- if ( (pOldStat->aDateAccessed >= rNewStat.aDateAccessed) &&
- (pOldStat->aTimeAccessed > rNewStat.aTimeAccessed) )
- return sal_True;
- if ( !((pOldStat->aDateAccessed == rNewStat.aDateAccessed) &&
- (pOldStat->aTimeAccessed == rNewStat.aTimeAccessed)) )
- return sal_False;
- break;
- case (FSYS_SORT_ACCESSED | FSYS_SORT_DESCENDING):
- if ( (pOldStat->aDateAccessed <= rNewStat.aDateAccessed) &&
- (pOldStat->aTimeAccessed < rNewStat.aTimeAccessed) )
- return sal_True;
- if ( !((pOldStat->aDateAccessed == rNewStat.aDateAccessed) &&
- (pOldStat->aTimeAccessed == rNewStat.aTimeAccessed)) )
- return sal_False;
- break;
- default: /* Kann nicht sein */;
- }
-
- if ( nSortIndex == ( pSortLst->size() - 1 ) )
- return sal_True;
- else
- return ImpInsertPointReached( rNewEntry, rNewStat,
- nCurPos, nSortIndex + 1 );
-#undef VALUE
-}
-
-/// Insert as sorted
-void Dir::ImpSortedInsert( const DirEntry *pNewEntry, const FileStat *pNewStat )
-{
- // special case: no sorting required
- if ( !pSortLst ) {
- pLst->push_back( (DirEntry*)pNewEntry );
- return;
- }
-
- for ( size_t i = 0, n = pLst->size(); i < n; ++i )
- {
- if ( ImpInsertPointReached( *pNewEntry, *pNewStat, i, 0 ) )
- {
- if ( pStatLst ) {
- FileStatList::iterator it = pStatLst->begin();
- ::std::advance( it, i );
- pStatLst->insert( it, (FileStat*)pNewStat );
- }
- DirEntryList::iterator it = pLst->begin();
- ::std::advance( it, i );
- pLst->insert( it, (DirEntry*)pNewEntry );
- return;
- }
- }
-
- if ( pStatLst )
- pStatLst->push_back( (FileStat*)pNewStat );
- pLst->push_back( (DirEntry*)pNewEntry );
-}
-
-/// shared implementation of CTORs
-void Dir::Construct( DirEntryKind nKindFlags )
-{
- pLst = NULL;
- pSortLst = NULL;
- pStatLst = NULL;
- eAttrMask = nKindFlags;
- rtl::OString aTempName(rtl::OUStringToOString(GetName(), osl_getThreadTextEncoding()));
- if (aTempName.indexOf('*') != -1 || aTempName.indexOf('?') != -1)
- {
-#if defined( WNT )
- rtl::OString aTStr(rtl::OUStringToOString(CutName(), osl_getThreadTextEncoding()));
- char* pBuffer = new char[aTStr.getLength()+1];
- strcpy( pBuffer, aTStr.getStr() );
- CharLowerBuff( pBuffer, aTStr.getLength() );
- aNameMask = WildCard( String(pBuffer, osl_getThreadTextEncoding()), ';' );
- delete [] pBuffer;
-#else
- aNameMask = WildCard( CutName(), ';' );
-#endif
- }
- else
- aNameMask.setGlob(rtl::OUString(static_cast<sal_Unicode>('*')));
-}
-
-void Dir::Reset()
-{
- // remove old Reader if necessary
- if ( pReader && pReader->bInUse )
- DELETEZ(pReader);
-
- // Remove all DirEntries from List and free memory
- if ( pLst )
- {
- for ( size_t i = 0, n = pLst->size(); i < n; ++i ) {
- delete (*pLst)[ i ];
- }
- pLst->clear();
- }
- else
- pLst = new DirEntryList();
-
- // Remove old File-Stats
- if ( pStatLst )
- {
- for ( size_t i = 0, n = pStatLst->size(); i < n; ++i ) {
- delete (*pStatLst)[ i ];
- }
- pStatLst->clear();
- delete pStatLst;
- pStatLst = NULL;
- }
-
- // Does sorting require FileStats?
- if ( pSortLst )
- {
- for ( size_t i = 0, n = pSortLst->size(); i < n; ++i ) {
- if ( (*pSortLst)[ i ]
- & ( FSYS_SORT_KIND | FSYS_SORT_SIZE | FSYS_SORT_CREATED
- | FSYS_SORT_MODIFYED | FSYS_SORT_ACCESSED
- )
- ) {
- pStatLst = new FileStatList();
- break;
- }
- }
- }
-
- // Create new reader if necessary
- if ( !pReader )
- pReader = new DirReader_Impl( *this );
-
- // Does the directory exist at all?
-#if !defined(UNX) //explanation: see DirReader_Impl::Read() in unx.cxx
- if( !pReader->pDosDir )
- {
- nError = FSYS_ERR_NOTADIRECTORY;
- DELETEZ( pReader );
- return;
- }
-#endif
-}
-
-sal_uInt16 Dir::Scan( sal_uInt16 nCount )
-{
-
- sal_uInt16 nRead = 0; // Number of read entries in this round
-
- // did not complete
- if ( pReader )
- {
- // is this a new reader?
- if ( pLst->empty() )
- {
- // Scan directories
- pReader->bInUse = sal_True;
- nRead = pReader->Init();
- }
-
- // continue reading
- while ( nRead <= nCount && !pReader->bReady )
- nRead = nRead + pReader->Read();
-
- // done?
- if ( pReader && pReader->bReady )
- DELETEZ( pReader );
- }
-
- // Return read entry count
- return nRead;
-}
-
-Dir::Dir( const DirEntry& rDirEntry, DirEntryKind nKindFlags ):
- DirEntry( rDirEntry ),
- pReader( 0 )
-{
- DBG_CTOR( Dir, NULL );
-
- Construct( nKindFlags );
- Reset();
-}
-
-Dir::~Dir()
-{
- DBG_DTOR( Dir, NULL );
-
- // Remove all DirEntries and free memory
- if ( pLst )
- {
- for ( size_t i = 0, n = pLst->size(); i < n; ++i ) {
- delete (*pLst)[ i ];
- }
- pLst->clear();
- delete pLst;
- }
-
- // Remove all Sorts from list and free memory
- if ( pSortLst )
- {
- pSortLst->clear();
- delete pSortLst;
- }
-
- // Remove all FileStats from list and free memory
- if ( pStatLst )
- {
- for ( size_t i = 0, n = pStatLst->size(); i < n; ++i ) {
- delete (*pStatLst)[ i ];
- }
- pStatLst->clear();
- delete pStatLst;
- }
-
- delete pReader;
-}
-
-DirEntry& Dir::operator[] ( size_t nIndex ) const
-{
- DBG_ASSERT( nIndex < Count(), "Dir::operator[] : nIndex > Count()" );
-
- DirEntry *pEntry = (*pLst)[ nIndex ];
- return *pEntry;
-}
-
-Dir& Dir::operator+=( const Dir& rDir )
-{
- // Read the rest of the directory
- if ( pReader )
- Scan( USHRT_MAX );
- DBG_ASSERT( !rDir.pReader, "Dir::+= with incomplete Dir" );
-
- if ( !pLst )
- pLst = new DirEntryList();
-
- // FileStats required by sorting criteria?
- sal_Bool bStat = sal_False;
- if ( pSortLst ) {
- for ( size_t i = 0, n = pSortLst->size(); i < n && !bStat; ++i ) {
- if ( (*pSortLst)[ i ]
- & ( FSYS_SORT_CREATED | FSYS_SORT_MODIFYED | FSYS_SORT_SIZE
- | FSYS_SORT_ACCESSED | FSYS_SORT_KIND
- )
- ) {
- bStat = sal_True;
- }
- }
- }
- FileStat* stat = NULL;
- for ( size_t nNr = 0; nNr < rDir.Count(); nNr++ )
- {
- if ( bStat )
- {
- if ( rDir.pStatLst )
- stat = new FileStat( *(*rDir.pStatLst)[ nNr ] );
- else
- stat = new FileStat( rDir[nNr] );
- }
- ImpSortedInsert( new DirEntry( rDir[nNr] ), stat );
- }
- return *this;
-}
-
-size_t Dir::Count( sal_Bool bUpdated ) const
-{
- // Read the rest of the directory
- if ( bUpdated && pReader )
- ((Dir*)this)->Scan( USHRT_MAX );
-
- return pLst == NULL ? 0 : pLst->size();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/tools/source/fsys/tempfile.cxx b/tools/source/fsys/tempfile.cxx
index 24557f5..46f1bed 100644
--- a/tools/source/fsys/tempfile.cxx
+++ b/tools/source/fsys/tempfile.cxx
@@ -18,7 +18,6 @@
*/
#include <tools/tempfile.hxx>
-#include "comdep.hxx"
#include <rtl/ustring.hxx>
#include <rtl/ustrbuf.hxx>
diff --git a/tools/source/fsys/unx.cxx b/tools/source/fsys/unx.cxx
deleted file mode 100644
index f26882c..0000000
--- a/tools/source/fsys/unx.cxx
+++ /dev/null
@@ -1,366 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * 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 .
- */
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <utime.h>
-
-#if defined LINUX || defined ANDROID
-#include <mntent.h>
-#define mnttab mntent
-#elif defined AIX
-#include <sys/mntctl.h>
-#include <sys/vmount.h>
-extern "C" int mntctl( int cmd, size_t size, char* buf );
-#elif defined(NETBSD)
-#include <sys/mount.h>
-#elif defined(FREEBSD) || defined(MACOSX) || defined(OPENBSD) || \
- defined(DRAGONFLY) || defined(IOS)
-struct mnttab
-{
- char *mnt_dir;
- char *mnt_fsname;
-};
-#else
-#include <sys/mnttab.h>
-#endif
-
-#ifndef MAXPATHLEN
-#define MAXPATHLEN 1024
-#endif
-
-#include <tools/debug.hxx>
-#include <tools/fsys.hxx>
-#include "comdep.hxx"
-#include <rtl/instance.hxx>
-
-#if defined SOLARIS
-#define MOUNTSPECIAL mnt_special
-#define MOUNTPOINT mnt_mountp
-#define MOUNTOPTS mnt_mntopts
-#define MOUNTFS mnt_fstype
-#else
-#define MOUNTSPECIAL mnt_fsname
-#define MOUNTPOINT mnt_dir
-#define MOUNTFS mnt_type
-#endif
-
-struct mymnttab
-{
- dev_t mountdevice;
- rtl::OString mountspecial;
- rtl::OString mountpoint;
- rtl::OString mymnttab_filesystem;
- mymnttab() { mountdevice = (dev_t) -1; }
-};
-
-#if defined(NETBSD) || defined(FREEBSD) || defined(MACOSX) || \
- defined(OPENBSD) || defined(DRAGONFLY) || defined(IOS)
-sal_Bool GetMountEntry(dev_t /* dev */, struct mymnttab * /* mytab */ )
-{
- DBG_WARNING( "Sorry, not implemented: GetMountEntry" );
- return sal_False;
-}
-#elif defined AIX
-sal_Bool GetMountEntry(dev_t dev, struct mymnttab *mytab)
-{
- int bufsize;
- if (mntctl (MCTL_QUERY, sizeof bufsize, (char*) &bufsize))
- return sal_False;
-
- char* buffer = (char *)malloc( bufsize * sizeof(char) );
- if (mntctl (MCTL_QUERY, bufsize, buffer) != -1)
- for ( char* vmt = buffer;
- vmt < buffer + bufsize;
- vmt += ((struct vmount*)vmt)->vmt_length)
- {
- struct stat buf;
- char *mountp = vmt2dataptr((struct vmount*)vmt, VMT_STUB);
- if ((stat (mountp, &buf) != -1) && (buf.st_dev == dev))
- {
- mytab->mountpoint = mountp;
- mytab->mountspecial
- = vmt2dataptr((struct vmount*)vmt, VMT_HOSTNAME);
- if (mytab->mountspecial.Len())
- mytab->mountspecial += ':';
- mytab->mountspecial
- += vmt2dataptr((struct vmount*)vmt, VMT_OBJECT);
- mytab->mountdevice = dev;
- free( buffer );
- return sal_True;
- }
- }
- free( buffer );
- return sal_False;
-}
-#else
-static sal_Bool GetMountEntry(dev_t dev, struct mymnttab *mytab)
-{
-#if defined SOLARIS
- FILE *fp = fopen (MNTTAB, "r");
- if (! fp)
- return sal_False;
- struct mnttab mnt[1];
- while (getmntent (fp, mnt) != -1)
-#elif defined AIX || defined ANDROID
- FILE *fp = NULL;
- if (! fp)
- return sal_False;
- struct mnttab mnt[1];
- while ( 0 )
-#else
- FILE *fp = setmntent (MOUNTED, "r");
- if (! fp)
- return sal_False;
- struct mnttab *mnt;
- while ((mnt = getmntent (fp)) != NULL)
-#endif
- {
-#ifdef SOLARIS
- char *devopt = NULL;
- if ( mnt->MOUNTOPTS != NULL )
- devopt = strstr (mnt->MOUNTOPTS, "dev=");
- if (devopt)
- {
- if (dev != (dev_t) strtoul (devopt+4, NULL, 16))
- continue;
- }
- else
-#endif
- {
- struct stat buf;
- if ((stat (mnt->MOUNTPOINT, &buf) == -1) || (buf.st_dev != dev))
- continue;
- }
-# ifdef LINUX
- // #61624# Opening file with setmntent and closing with fclose fails for glibc-2.1
- endmntent( fp );
-# else
- fclose (fp);
-# endif
- mytab->mountspecial = mnt->MOUNTSPECIAL;
- mytab->mountpoint = mnt->MOUNTPOINT;
- mytab->mountdevice = dev;
- mytab->mymnttab_filesystem = mnt->MOUNTFS;
-
- return sal_True;
- }
-# ifdef LINUX
- /* #61624# see above */
- endmntent( fp );
-# else
- fclose (fp);
-# endif
- return sal_False;
-}
-#endif
-
-sal_Bool DirEntry::ToAbs()
-{
- if ( FSYS_FLAG_VOLUME == eFlag )
- {
- eFlag = FSYS_FLAG_ABSROOT;
- return sal_True;
- }
-
- if ( IsAbs() )
- return sal_True;
-
- char sBuf[MAXPATHLEN + 1];
- *this = DirEntry( String( getcwd( sBuf, MAXPATHLEN ), osl_getThreadTextEncoding() ) ) + *this;
- return IsAbs();
-}
-
-namespace { struct mymnt : public rtl::Static< mymnttab, mymnt > {}; }
-
-String DirEntry::GetVolume() const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- DirEntry aPath( *this );
- aPath.ToAbs();
-
- struct stat buf;
- while (stat(rtl::OUStringToOString(aPath.GetFull(), osl_getThreadTextEncoding()).getStr(), &buf))
- {
- if (aPath.Level() <= 1)
- return String();
- aPath = aPath [1];
- }
- mymnttab &rMnt = mymnt::get();
- return ((buf.st_dev == rMnt.mountdevice || GetMountEntry(buf.st_dev, &rMnt)) ?
- rtl::OStringToOUString(rMnt.mountspecial, osl_getThreadTextEncoding()) :
- rtl::OUString());
-}
-
-sal_Bool DirEntry::SetCWD( sal_Bool bSloppy ) const
-{
- DBG_CHKTHIS( DirEntry, ImpCheckDirEntry );
-
- rtl::OString aPath(rtl::OUStringToOString(GetFull(), osl_getThreadTextEncoding()));
- if (!chdir(aPath.getStr()))
- {
- return sal_True;
- }
- else
- {
- if (bSloppy && !chdir(aPath.getStr()))
- {
- return sal_True;
- }
- else
- {
- return sal_False;
- }
- }
-}
-
-sal_uInt16 DirReader_Impl::Init()
-{
- return 0;
-}
-
-sal_uInt16 DirReader_Impl::Read()
-{
- if (!pDosDir)
- {
- pDosDir = opendir(rtl::OUStringToOString(aPath, osl_getThreadTextEncoding()).getStr());
- }
-
- if (!pDosDir)
- {
- bReady = sal_True;
- return 0;
- }
-
- // List directories and dirs
- if ( ( pDir->eAttrMask & FSYS_KIND_DIR || pDir->eAttrMask & FSYS_KIND_FILE ) &&
- ( ( pDosEntry = readdir( pDosDir ) ) != NULL ) )
- {
- String aD_Name(pDosEntry->d_name, osl_getThreadTextEncoding());
- if ( pDir->aNameMask.Matches( aD_Name ) )
- {
- DirEntryFlag eFlag =
- 0 == strcmp( pDosEntry->d_name, "." ) ? FSYS_FLAG_CURRENT
- : 0 == strcmp( pDosEntry->d_name, ".." ) ? FSYS_FLAG_PARENT
- : FSYS_FLAG_NORMAL;
- DirEntry *pTemp = new DirEntry(rtl::OString(pDosEntry->d_name), eFlag);
- if ( pParent )
- pTemp->ImpChangeParent( new DirEntry( *pParent ), sal_False);
- FileStat aStat( *pTemp );
- if ( ( ( ( pDir->eAttrMask & FSYS_KIND_DIR ) &&
- ( aStat.IsKind( FSYS_KIND_DIR ) ) ) ||
- ( ( pDir->eAttrMask & FSYS_KIND_FILE ) &&
- !( aStat.IsKind( FSYS_KIND_DIR ) ) ) ) &&
- !( pDir->eAttrMask & FSYS_KIND_VISIBLE &&
- pDosEntry->d_name[0] == '.' ) )
- {
- if ( pDir->pStatLst ) // Does sorting criteria require status?
- pDir->ImpSortedInsert( pTemp, new FileStat( aStat ) );
- else
- pDir->ImpSortedInsert( pTemp, NULL );
- return 1;
- }
- else
- delete pTemp;
- }
- }
- else
- bReady = sal_True;
- return 0;
-}
-
-sal_Bool FileStat::Update( const DirEntry& rDirEntry, SAL_UNUSED_PARAMETER sal_Bool )
-{
-
- nSize = 0;
- nKindFlags = 0;
- aCreator.Erase();
- aType.Erase();
- aDateCreated = Date(0);
- aTimeCreated = Time(0);
- aDateModified = Date(0);
- aTimeModified = Time(0);
- aDateAccessed = Date(0);
- aTimeAccessed = Time(0);
-
- if ( !rDirEntry.IsValid() )
- {
- nError = FSYS_ERR_NOTEXISTS;
- return sal_False;
- }
-
- // Special case if DirEntry is root
- if ( rDirEntry.eFlag == FSYS_FLAG_ABSROOT )
- {
- nKindFlags = FSYS_KIND_DIR;
- nError = FSYS_ERR_OK;
- return sal_True;
- }
-
- struct stat aStat;
- rtl::OString aPath(rtl::OUStringToOString(rDirEntry.GetFull(), osl_getThreadTextEncoding()));
- if (stat(aPath.getStr(), &aStat))
- {
- // pl: #67851#
- // do this here, because an existing filename containing "wildcards"
- // should be handled as a file, not a wildcard
- // note that this is not a solution, since filenames containing special characters
- // are handled badly across the whole Office
-
- // special treatment if name contains wildcards
- rtl::OString aTempName(rtl::OUStringToOString(rDirEntry.GetName(), osl_getThreadTextEncoding()));
- if ( aTempName.indexOf('?') != -1 ||
- aTempName.indexOf('*') != -1 ||
- aTempName.indexOf(';') != -1 )
- {
- nKindFlags = FSYS_KIND_WILD;
- nError = FSYS_ERR_OK;
- return sal_True;
- }
-
- nError = FSYS_ERR_NOTEXISTS;
- return sal_False;
- }
-
- nError = FSYS_ERR_OK;
- nSize = aStat.st_size;
-
- nKindFlags = FSYS_KIND_UNKNOWN;
- if ( ( aStat.st_mode & S_IFDIR ) == S_IFDIR )
- nKindFlags = nKindFlags | FSYS_KIND_DIR;
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list