blob: cd1c147d291e4ab108a66f055a4de8f1cd21152d [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.
*
*************************************************************/
#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>
#ifndef __ERRCODE_HXX
#include <tools/errcode.hxx>
#endif
#include "tools/toolsdllapi.h"
#include <cstdarg>
#define FEAT_FSYS_DOUBLESPEED
// --------------
// - FSys-Types -
// --------------
class DirEntry;
class DirEntryList;
class FSysSortList;
class FileStatList;
struct FileCopier_Impl;
class SvFileStream;
class BigInt;
#define FSYS_BUFSIZE 1024
#define FSYS_SHORTNAME_DELIMITER '@'
// FSysAccess
typedef int FSysAccess;
#define FSYS_ACCESS_FORCED 1
#define FSYS_ACCESS_FLOPPY FSYS_ACCESS_FORCED
#define FSYS_ACCESS_CACHED 2
// 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) //TPF: fuer RFS
#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)
// DirEntryFlag
enum DirEntryFlag
{
FSYS_FLAG_NORMAL,
FSYS_FLAG_VOLUME, // Dir( FSYS_FLAG_VOLUME ) und GetDevice()
FSYS_FLAG_ABSROOT, // z.B. "a:\" oder "\"
FSYS_FLAG_RELROOT, // z.B. "a:", "a:." oder "."
FSYS_FLAG_CURRENT = FSYS_FLAG_RELROOT, // Synonym fuer FSYS_FLAG_RELROOT
FSYS_FLAG_PARENT, // z.B. ".."
FSYS_FLAG_INVALID
};
// FSysPathStyle
enum FSysPathStyle
{
FSYS_STYLE_HOST,
FSYS_STYLE_FAT,
FSYS_STYLE_MSDOS = FSYS_STYLE_FAT,
FSYS_STYLE_VFAT,
FSYS_STYLE_WIN95 = FSYS_STYLE_VFAT,
FSYS_STYLE_HPFS,
FSYS_STYLE_OS2 = FSYS_STYLE_HPFS,
FSYS_STYLE_NTFS,
FSYS_STYLE_NWFS,
FSYS_STYLE_SYSV,
FSYS_STYLE_BSD,
FSYS_STYLE_UNX = FSYS_STYLE_BSD,
FSYS_STYLE_MAC,
FSYS_STYLE_DETECT,
FSYS_STYLE_UNKNOWN,
FSYS_STYLE_URL
};
// FSysAction
typedef int FSysAction;
#define FSYS_ACTION_COPYFILE 0x01 // not only create hardlink
#define FSYS_ACTION_RECURSIVE 0x02 // deep through dircetory structure
#define FSYS_ACTION_USERECYCLEBIN 0x04 // move to recycle bin
#define FSYS_ACTION_MOVE 0x08 // delete after copy (=> move)
#define FSYS_ACTION_CONTINUE 0x10 // continue on error
#define FSYS_ACTION_KEEP_EXISTING 0x20 // do not overwrite objects in
// target folder in case of name
// clashes
#define FSYS_ACTION_STANDARD 0
// Fuer RFS
#define RFS_IDENTIFIER "-rfs-"
#define RFS_LOWER "-rfs-"
#define RFS_UPPER "-RFS-"
typedef sal_uIntPtr FSysError;
// FSysExact
enum FSysExact
{
FSYS_NOTEXACT,
FSYS_EXACT
};
// ------------
// - Char-Set -
// ------------
// Was different for WIN, no longer needed...
#define GUI2FSYS(s) s
#define FSYS2GUI(s) s
// ------------
// - FileStat -
// ------------
struct dirent;
class TOOLS_DLLPUBLIC FileStat
{
friend class CORmFSys;
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( const void *pInfo, // CInfoPBRec
const void *pVolInfo ); // ParamBlockRec
public:
FileStat();
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; }
sal_Bool IsYounger( const FileStat& rIsOlder ) const;
#define TF_FSYS_READONLY_FLAG
static sal_uIntPtr SetReadOnlyFlag( const DirEntry &rEntry, sal_Bool bRO = sal_True );
static sal_Bool GetReadOnlyFlag( const DirEntry &rEntry );
static sal_Bool HasReadOnlyFlag();
static ErrCode QueryDiskSpace( const String &rPath,
BigInt &rFreeBytes, BigInt &rTotalBytes );
static void SetDateTime( const String& rFileName,
const DateTime& rNewDateTime );
};
// ------------
// - DirEntry -
// ------------
class DirEntryStack;
const char* ImpCheckDirEntry( const void* p );
class TOOLS_DLLPUBLIC DirEntry
{
friend struct DirReader_Impl;
friend class FileCopier;
#ifdef FEAT_FSYS_DOUBLESPEED
FileStat* pStat; // optional
#endif
ByteString aName;
DirEntry* pParent;
sal_uIntPtr nError;
DirEntryFlag eFlag;
private:
TOOLS_DLLPRIVATE DirEntry( const ByteString& rInitName,
DirEntryFlag aDirFlag,
FSysPathStyle eStyle );
//#if 0 // _SOLAR__PRIVATE
friend class Dir;
friend class FileStat;
friend const char* ImpCheckDirEntry( const void* p );
TOOLS_DLLPRIVATE FSysError ImpParseName( const ByteString& rIntiName,
FSysPathStyle eParser );
TOOLS_DLLPRIVATE FSysError ImpParseOs2Name( const ByteString& rPfad,
FSysPathStyle eStyle );
TOOLS_DLLPRIVATE FSysError ImpParseUnixName( const ByteString& rPfad,
FSysPathStyle eStyle );
TOOLS_DLLPRIVATE sal_uInt16 ImpTryUrl( DirEntryStack& rStack, const String& rPfad, FSysPathStyle eStyle );
TOOLS_DLLPRIVATE const DirEntry* ImpGetTopPtr() const;
TOOLS_DLLPRIVATE DirEntry* ImpGetTopPtr();
TOOLS_DLLPRIVATE DirEntry* ImpGetPreTopPtr();
TOOLS_DLLPRIVATE sal_Bool ImpToRel( String aStart );
protected:
void ImpTrim( FSysPathStyle eStyle );
const ByteString& ImpTheName() const;
DirEntryFlag ImpTheFlag() const { return eFlag; };
DirEntry* ImpChangeParent( DirEntry* pNewParent, sal_Bool bNormalize = sal_True );
DirEntry* ImpGetParent() { return pParent; }
#ifdef FEAT_FSYS_DOUBLESPEED
FileStat* ImpGetStat() const { return pStat; }
void ImpSetStat( FileStat *p ) { pStat = p; }
#endif
//#endif
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 ByteString& rInitName,
FSysPathStyle eParser = FSYS_STYLE_HOST );
DirEntry( const String& rInitName,
FSysPathStyle eParser = FSYS_STYLE_HOST );
~DirEntry();
sal_Bool IsLongNameOnFAT() const;
sal_Bool IsCaseSensitive (FSysPathStyle eFormatter = FSYS_STYLE_HOST) const;
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;
String CutExtension( char cSep = '.' );
void SetName( const String& rName, FSysPathStyle eFormatter = FSYS_STYLE_HOST );
inline const String GetNameDirect() const { return String(aName, osl_getThreadTextEncoding()); }
String GetName( FSysPathStyle eFormatter = FSYS_STYLE_HOST ) const;
String CutName( FSysPathStyle eFormatter = FSYS_STYLE_HOST );
void SetBase( const String& rBase, char cSep = '.' );
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;
static const DirEntry& SetTempNameBase( const String &rBaseName );
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 ToRel();
sal_Bool ToRel( const DirEntry& rRefDir );
sal_uInt16 CutRelParents();
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 CopyTo( const DirEntry& rDestDir,
FSysAction nActions = FSYS_ACTION_STANDARD ) const;
FSysError MoveTo( const DirEntry& rDestDir ) 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 )); }
StringCompare NameCompare( const DirEntry &rWith ) const;
inline StringCompare NameCompareDirect( const DirEntry &rWith ) const
{
#ifdef UNX
return rWith.aName.CompareTo( aName );
#else
return rWith.aName.CompareIgnoreCaseToAscii( aName );
#endif
}
static String GetAccessDelimiter( FSysPathStyle eFormatter = FSYS_STYLE_HOST );
static String GetSearchDelimiter( FSysPathStyle eFormatter = FSYS_STYLE_HOST );
static sal_uInt16 GetMaxNameLen( FSysPathStyle eFormatter = FSYS_STYLE_HOST );
static FSysPathStyle GetPathStyle( const String &rDevice );
static String ConvertNameToSystem( const String & rName );
static String ConvertSystemToName( const String & rName );
static sal_Bool IsRFSAvailable();
};
// --------------
// - FileCopier -
// --------------
class TOOLS_DLLPUBLIC FileCopier
{
DirEntry aSource;
DirEntry aTarget;
sal_uIntPtr nBytesTotal;
sal_uIntPtr nBytesCopied;
Link aProgressLink;
sal_uInt16 nBlockSize;
FileCopier_Impl* pImp;
private:
TOOLS_DLLPRIVATE FSysError DoCopy_Impl(
const DirEntry &rSource, const DirEntry &rTarget );
protected:
virtual sal_Bool Progress();
virtual ErrCode Error( ErrCode eErr,
const DirEntry *pSource, const DirEntry *pTarget );
public:
FileCopier();
FileCopier( const DirEntry &rSource,
const DirEntry &rTarget );
FileCopier( const FileCopier &rCopier );
virtual ~FileCopier();
FileCopier& operator = ( const FileCopier &rCopier );
void SetBlockSize( sal_uInt16 nBytes ) { nBlockSize = nBytes; }
sal_uInt16 GetBlockSize() const { return nBlockSize; }
sal_uIntPtr GetBytesTotal() const { return nBytesTotal; }
sal_uIntPtr GetBytesCopied() const { return nBytesCopied; }
void SetSource( const DirEntry &rSource ) { aSource = rSource; }
void SetTarget( const DirEntry &rTarget ) { aTarget = rTarget; }
const DirEntry& GetSource() const { return aSource; }
const DirEntry& GetTarget() const { return aTarget; }
FSysError Execute( FSysAction nActions = FSYS_ACTION_STANDARD );
FSysError ExecuteExact( FSysAction nActions = FSYS_ACTION_STANDARD,
FSysExact eExact = FSYS_NOTEXACT);
const DirEntry* GetErrorSource() const;
const DirEntry* GetErrorTarget() const;
ErrCode GetError() const;
void SetProgressHdl( const Link& rLink ) { aProgressLink = rLink; }
const Link& GetProgressHdl() const { return aProgressLink; }
void SetErrorHdl( const Link& rLink );
const Link& GetErrorHdl() const;
};
// -------
// - Dir -
// -------
struct DirReader_Impl;
class TOOLS_DLLPUBLIC Dir : public DirEntry
{
friend struct DirReader_Impl;
friend class CORmFSys;
DirReader_Impl* pReader; // systemabhaengig
DirEntryList* pLst;
FSysSortList* pSortLst; // NULL, wenn kein Sort gefordert
FileStatList* pStatLst; // NULL, wenn keine Stat's benoetigt
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 FSysError ImpSetSort( std::va_list pArgs, FSysSort nSort );
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,
sal_uIntPtr nCurPos,
sal_uIntPtr nSortIndex ) const;
void ImpSortedInsert( const DirEntry *pNewEntry,
const FileStat *pNewStat );
#endif
public:
Dir();
Dir( const DirEntry& rDirEntry,
DirEntryKind nKind = FSYS_KIND_ALL );
Dir( const DirEntry& rDirEntry,
DirEntryKind nKind,
FSysSort nSort, ... );
~Dir();
const WildCard& GetNameMask() const { return aNameMask; }
FSysError SetSort( FSysSort nSort, ... );
void Reset();
sal_uInt16 Scan( sal_uInt16 nCount = 5 );
sal_uInt16 Count( sal_Bool bUpdated = sal_True ) const;
sal_Bool Update();
Dir& operator +=( const Dir& rDir );
DirEntry& operator []( sal_uInt16 nIndex ) const;
};
// we don't need this stuff for bootstraping
#ifndef BOOTSTRAP
//========================================================================
/** FSysRedirector is an abstract base class for a hook to redirect
mirrored directory trees.
<P>One instance of a subclass can be instanciated and registered
using the method FSysRedirector::Register(FSysRedirector*).
*/
class FSysRedirector
{
static FSysRedirector* _pRedirector;
static sal_Bool _bEnabled;
public:
/** This method must called with the one and only instance of the
subclass which implements the redirection.
<P>It must be called with 0 when the instance is destroyed.
*/
static void Register( FSysRedirector *pRedirector );
//-----------------------------------------------------------------------
/** This method returns the currently registererd instance of
a subclass which implements the redirection.
<P>If no redirector is registered, it returns 0.
*/
static FSysRedirector* Redirector();
//-----------------------------------------------------------------------
/** This method is to be used to redirect a file system path.
<P>It will not redirect while redirection is disabled.
<P>It may block while another thread is accessing the redirector
or another thread has disabled redirections.
@param String &rPath<BR>
This inout-argument accepts a file:-URL even as a native
file system path name to redirect in 'rPath'. It returns the
redirected (modified) path too, which can be of both formats
too.
@return sal_Bool<BR>
sal_True, if the path is redirected
sal_False, if the path is not redirected (unchanged)
*/
static void DoRedirect( String &rPath );
};
#endif // BOOTSTRP
//========================================================================
void FSysEnableSysErrorBox( sal_Bool bEnable );
//========================================================================
#if defined(DBG_UTIL)
void FSysTest();
#endif
#endif // #ifndef _FSYS_HXX