2008-08-31 13:58:17 +00:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
*
2021-12-26 17:47:58 +00:00
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
2014-02-18 01:34:18 +00:00
*
2008-08-31 13:58:17 +00:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2014-02-18 01:34:18 +00:00
*
2008-08-31 13:58:17 +00:00
* You should have received a copy of the GNU General Public License
2021-12-26 17:47:58 +00:00
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
2008-08-31 13:58:17 +00:00
*
*/
2008-12-27 18:03:27 +00:00
# ifndef COMMON_ARCHIVE_H
# define COMMON_ARCHIVE_H
2008-08-31 13:58:17 +00:00
2023-09-02 14:25:53 +00:00
# include "common/error.h"
# include "common/hashmap.h"
# include "common/hash-str.h"
2008-08-31 13:58:17 +00:00
# include "common/list.h"
2021-08-01 23:33:22 +00:00
# include "common/path.h"
2008-08-31 13:58:17 +00:00
# include "common/ptr.h"
2008-09-11 13:24:01 +00:00
# include "common/singleton.h"
2023-09-02 14:25:53 +00:00
# include "common/str.h"
2008-08-31 13:58:17 +00:00
namespace Common {
2020-07-08 21:30:36 +00:00
/**
* @ defgroup common_arch Archive
* @ ingroup common
*
2020-09-15 23:39:09 +00:00
* @ brief The Archive module allows for managing the members of arbitrary containers in a uniform
2021-05-04 08:45:03 +00:00
* fashion .
2020-09-15 23:39:09 +00:00
* It also supports looking up by names and file names , opening a file , and returning a usable input stream .
2020-07-08 21:30:36 +00:00
* @ {
*/
2023-09-02 23:58:51 +00:00
class ArchiveMember ;
2008-12-27 18:03:27 +00:00
class FSNode ;
class SeekableReadStream ;
2023-08-29 03:01:18 +00:00
enum class AltStreamType {
Invalid ,
MacFinderInfo ,
MacResourceFork ,
} ;
2023-09-02 23:58:51 +00:00
typedef SharedPtr < ArchiveMember > ArchiveMemberPtr ; /*!< Shared pointer to an archive member. */
typedef List < ArchiveMemberPtr > ArchiveMemberList ; /*!< List of archive members. */
2008-12-27 18:03:27 +00:00
2008-10-12 06:06:04 +00:00
/**
2020-09-15 23:39:09 +00:00
* The ArchiveMember class is an abstract interface to represent elements inside
* implementations of an archive .
2008-10-12 06:06:04 +00:00
*
* Archive subclasses must provide their own implementation of ArchiveMember ,
2020-09-15 23:39:09 +00:00
* and use it when serving calls to @ ref Archive : : listMembers and @ ref Archive : : listMatchingMembers .
* Alternatively , you can use the @ ref GenericArchiveMember .
2008-10-12 06:06:04 +00:00
*/
2008-10-03 16:57:40 +00:00
class ArchiveMember {
public :
2023-09-02 23:58:51 +00:00
virtual ~ ArchiveMember ( ) ;
2020-09-30 21:17:38 +00:00
virtual SeekableReadStream * createReadStream ( ) const = 0 ; /*!< Create a read stream. */
2023-08-29 03:01:18 +00:00
virtual SeekableReadStream * createReadStreamForAltStream ( AltStreamType altStreamType ) const = 0 ; /*!< Create a read stream of an alternate stream. */
2023-07-06 04:08:36 +00:00
/**
* @ deprecated Get the name of the archive member . This may be a file name or a full path depending on archive type .
* DEPRECATED : Use getFileName or getPathInArchive instead , which always returns one or the other .
*/
virtual String getName ( ) const = 0 ;
virtual Path getPathInArchive ( ) const = 0 ; /*!< Get the full path of the archive member relative to the containing archive root. */
virtual String getFileName ( ) const = 0 ; /*!< Get the file name of the archive member relative to its containing directory within the archive. */
2023-09-02 23:58:51 +00:00
virtual bool isDirectory ( ) const ; /*!< Checks if the ArchiveMember is a directory. */
virtual void listChildren ( ArchiveMemberList & childList , const char * pattern = nullptr ) const ; /*!< Adds the immediate children of this archive member to childList, optionally matching a pattern. */
virtual U32String getDisplayName ( ) const ; /*!< Get the display name of the archive member. */
2023-12-16 00:02:06 +00:00
virtual bool isInMacArchive ( ) const ; /*!< Checks if the ArchiveMember is in a Mac archive, in which case resource forks and Finder info can only be loaded via alt streams. */
2008-10-03 16:57:40 +00:00
} ;
2023-08-07 14:19:50 +00:00
struct ArchiveMemberDetails {
ArchiveMemberPtr arcMember ;
Common : : String arcName ;
ArchiveMemberDetails ( const ArchiveMemberPtr & arcMember_ , const Common : : String & _arcName ) : arcMember ( arcMember_ ) , arcName ( _arcName ) {
}
} ;
typedef List < ArchiveMemberDetails > ArchiveMemberDetailsList ; /*!< List of archive members with the name of the archive they belong to */
2020-10-16 23:21:42 +00:00
/**
* Compare two archive member operators @ p a and @ p b and return which of them is higher .
*/
2017-09-06 21:18:14 +00:00
struct ArchiveMemberListComparator {
bool operator ( ) ( const ArchiveMemberPtr & a , const ArchiveMemberPtr & b ) {
return a - > getName ( ) < b - > getName ( ) ;
}
} ;
2008-10-03 16:57:40 +00:00
class Archive ;
/**
2008-10-12 06:06:04 +00:00
* Simple ArchiveMember implementation which allows
2008-10-03 16:57:40 +00:00
* creation of ArchiveMember compatible objects via
* a simple Archive and name pair .
*
* Note that GenericArchiveMember objects will not
* be working anymore after the ' parent ' object
* is destroyed .
*/
class GenericArchiveMember : public ArchiveMember {
public :
2023-07-06 04:08:36 +00:00
GenericArchiveMember ( const Common : : String & pathStr , const Archive & parent ) ; /*!< Create a generic archive member that belongs to the @p parent archive. */
GenericArchiveMember ( const Common : : Path & path , const Archive & parent ) ; /*!< Create a generic archive member that belongs to the @p parent archive. */
String getName ( ) const override ; /*!< Get the name of a generic archive member. */
Path getPathInArchive ( ) const override ; /*!< Get the full path of the archive member relative to the containing archive root. */
String getFileName ( ) const override ; /*!< Get the file name of the archive member relative to its containing directory within the archive. */
SeekableReadStream * createReadStream ( ) const override ; /*!< Create a read stream. */
2023-08-29 03:01:18 +00:00
SeekableReadStream * createReadStreamForAltStream ( AltStreamType altStreamType ) const override ; /*!< Create a read stream of an alternate stream. */
2023-09-02 23:58:51 +00:00
bool isDirectory ( ) const override ;
void listChildren ( ArchiveMemberList & childList , const char * pattern ) const override ;
2023-07-06 04:08:36 +00:00
private :
const Archive & _parent ;
const Common : : Path _path ;
2008-10-03 16:57:40 +00:00
} ;
2008-08-31 13:58:17 +00:00
/**
2020-09-15 23:39:09 +00:00
* The Archive class allows for managing the members of arbitrary containers in a uniform
* fashion , allowing lookup by ( file ) names .
* It also supports opening a file and returning a usable input stream .
2008-08-31 13:58:17 +00:00
*/
class Archive {
public :
virtual ~ Archive ( ) { }
/**
2020-10-16 23:21:42 +00:00
* Check if a member with the given @ p name is present in the Archive .
2010-08-16 19:58:20 +00:00
* Patterns are not allowed , as this is meant to be a quick File : : exists ( )
2023-09-02 23:58:51 +00:00
* replacement . This returns " true " for both files and directories .
2008-08-31 13:58:17 +00:00
*/
2021-08-01 23:33:22 +00:00
virtual bool hasFile ( const Path & path ) const = 0 ;
2008-08-31 13:58:17 +00:00
2023-09-02 23:58:51 +00:00
/**
* Check if a member with the given @ p name exists and is a directory .
*/
virtual bool isPathDirectory ( const Path & path ) const ;
2008-08-31 13:58:17 +00:00
/**
2020-09-15 23:39:09 +00:00
* Add all members of the Archive matching the specified pattern to the list .
2010-08-16 19:58:20 +00:00
* Must only append to list , and not remove elements from it .
2008-08-31 13:58:17 +00:00
*
2023-01-07 14:13:13 +00:00
* @ param matchPathComponents if set , then whole string will be matched , otherwise ( default ) ,
* path separator ( ' / ' ) does not match with wildcards
*
2020-09-15 23:39:09 +00:00
* @ return The number of members added to list .
2008-08-31 13:58:17 +00:00
*/
2023-01-07 14:13:13 +00:00
virtual int listMatchingMembers ( ArchiveMemberList & list , const Path & pattern , bool matchPathComponents = false ) const ;
2008-08-31 13:58:17 +00:00
/**
2020-09-15 23:39:09 +00:00
* Add all members of the Archive to the list .
2010-08-16 19:58:20 +00:00
* Must only append to list , and not remove elements from it .
2008-08-31 13:58:17 +00:00
*
2020-09-15 23:39:09 +00:00
* @ return The number of names added to list .
2008-08-31 13:58:17 +00:00
*/
2011-12-13 16:20:25 +00:00
virtual int listMembers ( ArchiveMemberList & list ) const = 0 ;
2008-08-31 13:58:17 +00:00
2008-11-01 12:49:29 +00:00
/**
2020-09-15 23:39:09 +00:00
* Return an ArchiveMember representation of the given file .
2008-11-01 12:49:29 +00:00
*/
2021-08-01 23:33:22 +00:00
virtual const ArchiveMemberPtr getMember ( const Path & path ) const = 0 ;
2008-11-01 12:49:29 +00:00
2008-08-31 13:58:17 +00:00
/**
2010-08-16 19:58:20 +00:00
* Create a stream bound to a member with the specified name in the
* archive . If no member with this name exists , 0 is returned .
2020-09-15 23:39:09 +00:00
*
* @ return The newly created input stream .
2008-08-31 13:58:17 +00:00
*/
2021-08-01 23:33:22 +00:00
virtual SeekableReadStream * createReadStreamForMember ( const Path & path ) const = 0 ;
2023-02-10 21:40:09 +00:00
2023-08-29 03:01:18 +00:00
/**
* Create a stream bound to an alternate stream of a member with the specified
* name in the archive . If no member with this name exists , 0 is returned .
*
* @ return The newly created input stream .
*/
virtual SeekableReadStream * createReadStreamForMemberAltStream ( const Path & path , AltStreamType altStreamType ) const ;
2023-03-11 14:05:16 +00:00
/**
* For most archives : same as previous . For SearchSet see SearchSet
* documentation .
*/
virtual SeekableReadStream * createReadStreamForMemberNext ( const Path & path , const Archive * starting ) const {
return createReadStreamForMember ( path ) ;
}
2023-02-10 21:40:09 +00:00
/**
* Dump all files from the archive to the given directory
*/
2023-09-02 14:25:53 +00:00
Common : : Error dumpArchive ( const Path & destPath ) ;
2023-05-29 20:15:54 +00:00
/**
* Returns the separator used by internal paths in the archive
*/
virtual char getPathSeparator ( ) const ;
2008-08-31 13:58:17 +00:00
} ;
2022-12-05 03:46:33 +00:00
class MemcachingCaseInsensitiveArchive ;
// This is a shareable reference to a file contents stored in memory.
// It can be in 2 states: strong when it holds a strong reference in
// the sense of SharedPtr. Another state is weak when it only helds
// WeakPtr and thus may expire. Also strong reference is held by
// Returned memory stream. Hence once no memory streams and no
// strong referenceas are remaining, the block is freed.
2022-11-30 00:16:17 +00:00
class SharedArchiveContents {
public :
2022-12-05 03:46:33 +00:00
SharedArchiveContents ( byte * contents , uint32 contentSize ) :
_strongRef ( contents , ArrayDeleter < byte > ( ) ) , _weakRef ( _strongRef ) ,
2023-03-11 22:44:48 +00:00
_contentSize ( contentSize ) , _missingFile ( false ) , _bypass ( nullptr ) { }
SharedArchiveContents ( ) : _strongRef ( nullptr ) , _weakRef ( nullptr ) , _contentSize ( 0 ) , _missingFile ( true ) , _bypass ( nullptr ) { }
static SharedArchiveContents bypass ( SeekableReadStream * stream ) {
return SharedArchiveContents ( stream ) ;
}
2022-11-30 00:16:17 +00:00
2022-12-05 03:46:33 +00:00
private :
2023-03-11 22:44:48 +00:00
SharedArchiveContents ( SeekableReadStream * stream ) : _strongRef ( nullptr ) , _weakRef ( nullptr ) , _contentSize ( 0 ) , _missingFile ( false ) , _bypass ( stream ) { }
2022-11-30 00:16:17 +00:00
bool isFileMissing ( ) const { return _missingFile ; }
2022-12-05 03:46:33 +00:00
SharedPtr < byte > getContents ( ) const { return _strongRef ; }
2022-11-30 00:16:17 +00:00
uint32 getSize ( ) const { return _contentSize ; }
2022-12-05 03:46:33 +00:00
bool makeStrong ( ) {
if ( _strongRef | | _contentSize = = 0 | | _missingFile )
return true ;
_strongRef = SharedPtr < byte > ( _weakRef ) ;
if ( _strongRef )
return true ;
return false ;
}
void makeWeak ( ) {
// No need to make weak if we have no contents
if ( _contentSize = = 0 )
return ;
_strongRef = nullptr ;
}
SharedPtr < byte > _strongRef ;
WeakPtr < byte > _weakRef ;
2022-11-30 00:16:17 +00:00
uint32 _contentSize ;
bool _missingFile ;
2023-03-11 22:44:48 +00:00
SeekableReadStream * _bypass ;
2022-12-05 03:46:33 +00:00
friend class MemcachingCaseInsensitiveArchive ;
2022-11-30 00:16:17 +00:00
} ;
/**
* An archive that caches the resulting contents .
*/
class MemcachingCaseInsensitiveArchive : public Archive {
public :
2022-12-05 03:46:33 +00:00
MemcachingCaseInsensitiveArchive ( uint32 maxStronglyCachedSize = 512 ) : _maxStronglyCachedSize ( maxStronglyCachedSize ) { }
2022-11-30 00:16:17 +00:00
SeekableReadStream * createReadStreamForMember ( const Path & path ) const ;
2023-08-29 03:01:18 +00:00
SeekableReadStream * createReadStreamForMemberAltStream ( const Path & path , Common : : AltStreamType altStreamType ) const ;
2022-11-30 00:16:17 +00:00
2023-09-10 08:21:31 +00:00
virtual Path translatePath ( const Path & path ) const {
return path . normalize ( ) ;
2022-11-30 00:16:17 +00:00
}
2023-09-10 08:21:31 +00:00
virtual SharedArchiveContents readContentsForPath ( const Path & translatedPath ) const = 0 ;
virtual SharedArchiveContents readContentsForPathAltStream ( const Path & translatedPath , AltStreamType altStreamType ) const ;
2022-11-30 00:16:17 +00:00
private :
2023-08-29 03:01:18 +00:00
struct CacheKey {
CacheKey ( ) ;
2023-09-10 08:21:31 +00:00
Path path ;
2023-08-29 03:01:18 +00:00
AltStreamType altStreamType ;
} ;
struct CacheKey_EqualTo {
bool operator ( ) ( const CacheKey & x , const CacheKey & y ) const ;
} ;
struct CacheKey_Hash {
uint operator ( ) ( const CacheKey & x ) const ;
} ;
SeekableReadStream * createReadStreamForMemberImpl ( const Path & path , bool isAltStream , Common : : AltStreamType altStreamType ) const ;
mutable HashMap < CacheKey , SharedArchiveContents , CacheKey_Hash , CacheKey_EqualTo > _cache ;
2022-12-05 03:46:33 +00:00
uint32 _maxStronglyCachedSize ;
2022-11-30 00:16:17 +00:00
} ;
2008-08-31 13:58:17 +00:00
/**
2020-09-15 23:39:09 +00:00
* The SearchSet class enables access to a group of Archives through the Archive interface .
*
2008-08-31 13:58:17 +00:00
* Its intended usage is a situation in which there are no name clashes among names in the
* contained Archives , hence the simplistic policy of always looking for the first
2020-09-15 23:39:09 +00:00
* match . SearchSet does guarantee that searches are performed in DESCENDING
2008-08-31 13:58:17 +00:00
* priority order . In case of conflicting priorities , insertion order prevails .
*/
2008-09-03 19:07:38 +00:00
class SearchSet : public Archive {
2008-08-31 13:58:17 +00:00
struct Node {
2008-10-22 17:44:12 +00:00
int _priority ;
String _name ;
Archive * _arc ;
bool _autoFree ;
Node ( int priority , const String & name , Archive * arc , bool autoFree )
: _priority ( priority ) , _name ( name ) , _arc ( arc ) , _autoFree ( autoFree ) {
2008-09-29 19:09:56 +00:00
}
2008-08-31 13:58:17 +00:00
} ;
2008-12-15 12:55:13 +00:00
typedef List < Node > ArchiveNodeList ;
ArchiveNodeList _list ;
2008-08-31 13:58:17 +00:00
2009-03-09 22:26:02 +00:00
ArchiveNodeList : : iterator find ( const String & name ) ;
ArchiveNodeList : : const_iterator find ( const String & name ) const ;
2008-08-31 13:58:17 +00:00
2020-10-16 23:21:42 +00:00
void insert ( const Node & node ) ; //!< Add an archive while keeping the list sorted by descending priority.
2008-08-31 13:58:17 +00:00
2019-10-20 15:37:18 +00:00
bool _ignoreClashes ;
2008-08-31 13:58:17 +00:00
public :
2019-10-20 15:37:18 +00:00
SearchSet ( ) : _ignoreClashes ( false ) { }
2008-10-22 17:44:12 +00:00
virtual ~ SearchSet ( ) { clear ( ) ; }
2008-08-31 13:58:17 +00:00
/**
2008-09-06 22:09:34 +00:00
* Add a new archive to the searchable set .
2008-08-31 13:58:17 +00:00
*/
2008-10-22 17:44:12 +00:00
void add ( const String & name , Archive * arch , int priority = 0 , bool autoFree = true ) ;
2008-08-31 13:58:17 +00:00
2008-12-27 17:16:48 +00:00
/**
2020-10-16 23:21:42 +00:00
* Create and add an FSDirectory by name .
2008-12-27 17:16:48 +00:00
*/
2023-09-02 14:25:53 +00:00
void addDirectory ( const String & name , const Path & directory , int priority = 0 , int depth = 1 , bool flat = false ) ;
2008-12-27 17:16:48 +00:00
/**
2020-10-16 23:21:42 +00:00
* Create and add an FSDirectory by FSNode .
2008-12-27 17:16:48 +00:00
*/
2009-06-01 00:01:32 +00:00
void addDirectory ( const String & name , const FSNode & directory , int priority = 0 , int depth = 1 , bool flat = false ) ;
2008-12-27 17:16:48 +00:00
2023-09-02 14:25:53 +00:00
/**
* Overloads which use directory path as name
*/
void addDirectory ( const Path & directory , int priority = 0 , int depth = 1 , bool flat = false ) ;
void addDirectory ( const FSNode & directory , int priority = 0 , int depth = 1 , bool flat = false ) ;
2009-09-23 00:15:00 +00:00
/**
2020-09-15 23:39:09 +00:00
* Create and add a subdirectory by name ( caseless ) .
2009-09-23 00:15:00 +00:00
*
2020-09-15 23:39:09 +00:00
* It is also possible to add subdirectories of subdirectories ( of any depth ) with this function .
2021-10-31 14:10:19 +00:00
* The path separator for this case is SLASH for all systems .
2009-09-23 00:15:00 +00:00
*
2020-09-15 23:39:09 +00:00
* Example :
2009-09-23 00:15:00 +00:00
*
* " game/itedata "
*
2020-09-15 23:39:09 +00:00
* In this example , the code first tries to search for all directories matching
2009-09-23 00:15:00 +00:00
* " game " ( case insensitive ) in the path " directory " first and search through all
* of the matches for " itedata " ( case insensitive too ) .
*
2020-09-15 23:39:09 +00:00
* Note that it will add all matches found !
2009-09-23 00:15:00 +00:00
*
2020-09-15 23:39:09 +00:00
* Even though this method is currently implemented via addSubDirectoriesMatching , it is not safe
2009-09-23 00:15:00 +00:00
* to assume that this method is using anything other than a simple case insensitive compare .
2020-09-15 23:39:09 +00:00
* Thus , do not use any tokens like ' * ' or ' ? ' in the " caselessName " parameter of this function .
2009-09-23 00:15:00 +00:00
*/
2013-06-06 19:41:14 +00:00
void addSubDirectoryMatching ( const FSNode & directory , const String & caselessName , int priority = 0 , int depth = 1 , bool flat = false ) {
addSubDirectoriesMatching ( directory , caselessName , true , priority , depth , flat ) ;
2009-09-23 00:15:00 +00:00
}
/**
2020-09-15 23:39:09 +00:00
* Create and add subdirectories by pattern .
2009-09-23 00:15:00 +00:00
*
2020-09-15 23:39:09 +00:00
* It is also possible to add subdirectories of subdirectories ( of any depth ) with this function .
2021-10-31 14:10:19 +00:00
* The path separator for this case is SLASH for all systems .
2009-09-23 00:15:00 +00:00
*
2020-09-15 23:39:09 +00:00
* Example :
2009-09-23 00:15:00 +00:00
*
* " game/itedata "
*
2020-09-15 23:39:09 +00:00
* In this example , the code first tries to search for all directories matching
2009-09-23 00:15:00 +00:00
* " game " in the path " directory " first and search through all of the matches for
2020-09-15 23:39:09 +00:00
* " itedata " . If " ingoreCase " is set to true , the code does a case insensitive
2009-09-23 00:15:00 +00:00
* match , otherwise it is doing a case sensitive match .
*
2020-09-15 23:39:09 +00:00
* This method also works with tokens . For a list of available tokens ,
* see @ ref Common : : matchString .
2009-09-23 00:15:00 +00:00
*/
2013-06-06 19:41:14 +00:00
void addSubDirectoriesMatching ( const FSNode & directory , String origPattern , bool ignoreCase , int priority = 0 , int depth = 1 , bool flat = false ) ;
2009-09-23 00:15:00 +00:00
2008-08-31 13:58:17 +00:00
/**
2008-09-06 22:09:34 +00:00
* Remove an archive from the searchable set .
2008-08-31 13:58:17 +00:00
*/
void remove ( const String & name ) ;
2008-09-06 22:09:34 +00:00
/**
* Check if a given archive name is already present .
*/
bool hasArchive ( const String & name ) const ;
2023-02-10 00:19:34 +00:00
/**
* Looks up an archive in the searchable set .
*/
Archive * getArchive ( const String & name ) const ;
2008-08-31 13:58:17 +00:00
/**
2020-09-15 23:39:09 +00:00
* Empty the searchable set .
2008-12-22 11:22:15 +00:00
*/
2008-09-27 18:32:01 +00:00
virtual void clear ( ) ;
2008-08-31 13:58:17 +00:00
/**
2008-12-22 11:22:15 +00:00
* Change the order of searches .
*/
2008-09-27 18:32:01 +00:00
void setPriority ( const String & name , int priority ) ;
2008-08-31 13:58:17 +00:00
2021-11-13 20:30:12 +00:00
bool hasFile ( const Path & path ) const override ;
2023-09-02 23:58:51 +00:00
bool isPathDirectory ( const Path & path ) const override ;
2023-01-07 14:13:13 +00:00
int listMatchingMembers ( ArchiveMemberList & list , const Path & pattern , bool matchPathComponents = false ) const override ;
2023-08-07 14:19:50 +00:00
int listMatchingMembers ( ArchiveMemberDetailsList & list , const Path & pattern , bool matchPathComponents = false ) const ;
2021-11-13 20:30:12 +00:00
int listMembers ( ArchiveMemberList & list ) const override ;
2008-08-31 13:58:17 +00:00
2021-11-13 20:30:12 +00:00
const ArchiveMemberPtr getMember ( const Path & path ) const override ;
2008-11-01 12:49:29 +00:00
2023-07-08 16:13:28 +00:00
const ArchiveMemberPtr getMember ( const Path & path , Archive * * container ) const ;
2008-08-31 13:58:17 +00:00
/**
2020-09-15 23:39:09 +00:00
* Implement createReadStreamForMember from the Archive base class . The current policy is
2008-08-31 13:58:17 +00:00
* opening the first file encountered that matches the name .
*/
2021-11-13 20:30:12 +00:00
SeekableReadStream * createReadStreamForMember ( const Path & path ) const override ;
2019-10-20 15:37:18 +00:00
2023-08-29 03:01:18 +00:00
/**
* Implement createReadStreamForMemberAltStream from the Archive base class . The current policy is
* opening the first file encountered that matches the name .
*/
SeekableReadStream * createReadStreamForMemberAltStream ( const Path & path , AltStreamType altStreamType ) const override ;
2023-03-11 14:05:16 +00:00
/**
* Similar to above but exclude matches from archives before starting and starting itself .
*/
SeekableReadStream * createReadStreamForMemberNext ( const Path & path , const Archive * starting ) const override ;
2019-10-20 15:37:18 +00:00
/**
2020-09-15 23:39:09 +00:00
* Ignore clashes when adding directories . For more details , see the corresponding parameter
2020-10-16 23:21:42 +00:00
* in @ ref FSDirectory documentation .
2019-10-20 15:37:18 +00:00
*/
void setIgnoreClashes ( bool ignoreClashes ) { _ignoreClashes = ignoreClashes ; }
2008-08-31 13:58:17 +00:00
} ;
2008-09-11 13:24:01 +00:00
2008-09-17 18:59:09 +00:00
class SearchManager : public Singleton < SearchManager > , public SearchSet {
2008-09-11 13:24:01 +00:00
public :
2008-09-27 18:32:01 +00:00
/**
2020-09-15 23:39:09 +00:00
* Reset the Search Manager to the default list of search paths ( system
2008-10-22 17:08:17 +00:00
* specific dirs + current dir ) .
2008-09-27 18:32:01 +00:00
*/
virtual void clear ( ) ;
2008-10-22 22:31:09 +00:00
private :
2011-08-06 07:47:19 +00:00
friend class Singleton < SingletonBaseType > ;
2008-10-22 22:31:09 +00:00
SearchManager ( ) ;
2008-09-11 13:24:01 +00:00
} ;
2020-09-15 23:39:09 +00:00
/** Shortcut for accessing the Search Manager. */
2008-09-11 13:24:01 +00:00
# define SearchMan Common::SearchManager::instance()
2020-07-08 21:30:36 +00:00
/** @} */
2008-08-31 13:58:17 +00:00
} // namespace Common
# endif