#include "fs_path.h"
-class DirectoryArchive : public Archive {
- CopiedString m_root;
+class DirectoryArchive : public Archive
+{
+CopiedString m_root;
public:
- DirectoryArchive(const char *root) : m_root(root)
- {
- }
-
- void release()
- {
- delete this;
- }
-
- virtual ArchiveFile *openFile(const char *name)
- {
- UnixPath path(m_root.c_str());
- path.push_filename(name);
- DirectoryArchiveFile *file = new DirectoryArchiveFile(name, path.c_str());
- if (!file->failed()) {
- return file;
- }
- file->release();
- return 0;
- }
-
- virtual ArchiveTextFile *openTextFile(const char *name)
- {
- UnixPath path(m_root.c_str());
- path.push_filename(name);
- DirectoryArchiveTextFile *file = new DirectoryArchiveTextFile(name, path.c_str());
- if (!file->failed()) {
- return file;
- }
- file->release();
- return 0;
- }
-
- virtual bool containsFile(const char *name)
- {
- UnixPath path(m_root.c_str());
- path.push_filename(name);
- return file_readable(path.c_str());
- }
-
- virtual void forEachFile(VisitorFunc visitor, const char *root)
- {
- std::vector<Directory *> dirs;
- UnixPath path(m_root.c_str());
- path.push(root);
- dirs.push_back(directory_open(path.c_str()));
-
- while (!dirs.empty() && directory_good(dirs.back())) {
- const char *name = directory_read_and_increment(dirs.back());
-
- if (name == 0) {
- directory_close(dirs.back());
- dirs.pop_back();
- path.pop();
- } else if (!string_equal(name, ".") && !string_equal(name, "..")) {
- path.push_filename(name);
-
- bool is_directory = file_is_directory(path.c_str());
-
- if (!is_directory) {
- visitor.file(path_make_relative(path.c_str(), m_root.c_str()));
- }
-
- path.pop();
-
- if (is_directory) {
- path.push(name);
-
- if (!visitor.directory(path_make_relative(path.c_str(), m_root.c_str()), dirs.size())) {
- dirs.push_back(directory_open(path.c_str()));
- } else {
- path.pop();
- }
- }
- }
- }
- }
+DirectoryArchive( const char* root ) : m_root( root ){
+}
+
+void release(){
+ delete this;
+}
+virtual ArchiveFile* openFile( const char* name ){
+ UnixPath path( m_root.c_str() );
+ path.push_filename( name );
+ DirectoryArchiveFile* file = new DirectoryArchiveFile( name, path.c_str() );
+ if ( !file->failed() ) {
+ return file;
+ }
+ file->release();
+ return 0;
+}
+virtual ArchiveTextFile* openTextFile( const char* name ){
+ UnixPath path( m_root.c_str() );
+ path.push_filename( name );
+ DirectoryArchiveTextFile* file = new DirectoryArchiveTextFile( name, path.c_str() );
+ if ( !file->failed() ) {
+ return file;
+ }
+ file->release();
+ return 0;
+}
+virtual bool containsFile( const char* name ){
+ UnixPath path( m_root.c_str() );
+ path.push_filename( name );
+ return file_readable( path.c_str() );
+}
+virtual void forEachFile( VisitorFunc visitor, const char* root ){
+ std::vector<Directory*> dirs;
+ UnixPath path( m_root.c_str() );
+ path.push( root );
+ dirs.push_back( directory_open( path.c_str() ) );
+
+ while ( !dirs.empty() && directory_good( dirs.back() ) )
+ {
+ const char* name = directory_read_and_increment( dirs.back() );
+
+ if ( name == 0 ) {
+ directory_close( dirs.back() );
+ dirs.pop_back();
+ path.pop();
+ }
+ else if ( !string_equal( name, "." ) && !string_equal( name, ".." ) ) {
+ path.push_filename( name );
+
+ bool is_directory = file_is_directory( path.c_str() );
+
+ if ( !is_directory ) {
+ visitor.file( path_make_relative( path.c_str(), m_root.c_str() ) );
+ }
+
+ path.pop();
+
+ if ( is_directory ) {
+ path.push( name );
+
+ if ( !visitor.directory( path_make_relative( path.c_str(), m_root.c_str() ), dirs.size() ) ) {
+ dirs.push_back( directory_open( path.c_str() ) );
+ }
+ else{
+ path.pop();
+ }
+ }
+ }
+ }
+}
};
-Archive *OpenArchive(const char *name)
-{
- return new DirectoryArchive(name);
+Archive* OpenArchive( const char* name ){
+ return new DirectoryArchive( name );
}
#if 0
{
public:
virtual void visit( const char* name ){
- int bleh = 0;
+ int bleh = 0;
}
};
public:
void test1(){
- Archive* archive = OpenArchive( "d:/quake/id1/" );
- ArchiveFile* file = archive->openFile( "quake101.wad" );
- if ( file != 0 ) {
- char buffer[1024];
- file->getInputStream().read( buffer, 1024 );
- file->release();
- }
- TestVisitor visitor;
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 0 ), "" );
- archive->release();
+ Archive* archive = OpenArchive( "d:/quake/id1/" );
+ ArchiveFile* file = archive->openFile( "quake101.wad" );
+ if ( file != 0 ) {
+ char buffer[1024];
+ file->getInputStream().read( buffer, 1024 );
+ file->release();
+ }
+ TestVisitor visitor;
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 0 ), "" );
+ archive->release();
}
void test2(){
- Archive* archive = OpenArchive( "d:/gtkradiant_root/baseq3/" );
- TestVisitor visitor;
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 2 ), "" );
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFiles, 1 ), "textures" );
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eDirectories, 1 ), "textures" );
- archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 1 ), "textures" );
- archive->release();
+ Archive* archive = OpenArchive( "d:/gtkradiant_root/baseq3/" );
+ TestVisitor visitor;
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 2 ), "" );
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFiles, 1 ), "textures" );
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eDirectories, 1 ), "textures" );
+ archive->forEachFile( Archive::VisitorFunc( &visitor, Archive::eFilesAndDirectories, 1 ), "textures" );
+ archive->release();
}
TestArchive(){
- test1();
- test2();
+ test1();
+ test2();
}
};