mirror of
https://github.com/minetest/irrlicht.git
synced 2024-12-27 11:10:31 +01:00
176 lines
4.3 KiB
C++
176 lines
4.3 KiB
C++
|
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
||
|
// This file is part of the "Irrlicht Engine".
|
||
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||
|
|
||
|
#include "CMountPointReader.h"
|
||
|
|
||
|
#ifdef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
|
||
|
|
||
|
#include "CReadFile.h"
|
||
|
#include "os.h"
|
||
|
|
||
|
namespace irr
|
||
|
{
|
||
|
namespace io
|
||
|
{
|
||
|
|
||
|
//! Constructor
|
||
|
CArchiveLoaderMount::CArchiveLoaderMount( io::IFileSystem* fs)
|
||
|
: FileSystem(fs)
|
||
|
{
|
||
|
#ifdef _DEBUG
|
||
|
setDebugName("CArchiveLoaderMount");
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
//! returns true if the file maybe is able to be loaded by this class
|
||
|
bool CArchiveLoaderMount::isALoadableFileFormat(const io::path& filename) const
|
||
|
{
|
||
|
io::path fname(filename);
|
||
|
deletePathFromFilename(fname);
|
||
|
|
||
|
if (!fname.size())
|
||
|
return true;
|
||
|
IFileList* list = FileSystem->createFileList();
|
||
|
bool ret = false;
|
||
|
if (list)
|
||
|
{
|
||
|
// check if name is found as directory
|
||
|
if (list->findFile(filename, true))
|
||
|
ret=true;
|
||
|
list->drop();
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
//! Check to see if the loader can create archives of this type.
|
||
|
bool CArchiveLoaderMount::isALoadableFileFormat(E_FILE_ARCHIVE_TYPE fileType) const
|
||
|
{
|
||
|
return fileType == EFAT_FOLDER;
|
||
|
}
|
||
|
|
||
|
//! Check if the file might be loaded by this class
|
||
|
bool CArchiveLoaderMount::isALoadableFileFormat(io::IReadFile* file) const
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//! Creates an archive from the filename
|
||
|
IFileArchive* CArchiveLoaderMount::createArchive(const io::path& filename, bool ignoreCase, bool ignorePaths) const
|
||
|
{
|
||
|
IFileArchive *archive = 0;
|
||
|
|
||
|
EFileSystemType current = FileSystem->setFileListSystem(FILESYSTEM_NATIVE);
|
||
|
|
||
|
const io::path save = FileSystem->getWorkingDirectory();
|
||
|
io::path fullPath = FileSystem->getAbsolutePath(filename);
|
||
|
FileSystem->flattenFilename(fullPath);
|
||
|
|
||
|
if (FileSystem->changeWorkingDirectoryTo(fullPath))
|
||
|
{
|
||
|
archive = new CMountPointReader(FileSystem, fullPath, ignoreCase, ignorePaths);
|
||
|
}
|
||
|
|
||
|
FileSystem->changeWorkingDirectoryTo(save);
|
||
|
FileSystem->setFileListSystem(current);
|
||
|
|
||
|
return archive;
|
||
|
}
|
||
|
|
||
|
//! creates/loads an archive from the file.
|
||
|
//! \return Pointer to the created archive. Returns 0 if loading failed.
|
||
|
IFileArchive* CArchiveLoaderMount::createArchive(io::IReadFile* file, bool ignoreCase, bool ignorePaths) const
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//! compatible Folder Architecture
|
||
|
CMountPointReader::CMountPointReader(IFileSystem * parent, const io::path& basename, bool ignoreCase, bool ignorePaths)
|
||
|
: CFileList(basename, ignoreCase, ignorePaths), Parent(parent)
|
||
|
{
|
||
|
//! ensure CFileList path ends in a slash
|
||
|
if (Path.lastChar() != '/' )
|
||
|
Path.append('/');
|
||
|
|
||
|
const io::path& work = Parent->getWorkingDirectory();
|
||
|
|
||
|
Parent->changeWorkingDirectoryTo(basename);
|
||
|
buildDirectory();
|
||
|
Parent->changeWorkingDirectoryTo(work);
|
||
|
|
||
|
sort();
|
||
|
}
|
||
|
|
||
|
|
||
|
//! returns the list of files
|
||
|
const IFileList* CMountPointReader::getFileList() const
|
||
|
{
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
void CMountPointReader::buildDirectory()
|
||
|
{
|
||
|
IFileList * list = Parent->createFileList();
|
||
|
if (!list)
|
||
|
return;
|
||
|
|
||
|
const u32 size = list->getFileCount();
|
||
|
for (u32 i=0; i < size; ++i)
|
||
|
{
|
||
|
io::path full = list->getFullFileName(i);
|
||
|
full = full.subString(Path.size(), full.size() - Path.size());
|
||
|
|
||
|
if (!list->isDirectory(i))
|
||
|
{
|
||
|
addItem(full, list->getFileOffset(i), list->getFileSize(i), false, RealFileNames.size());
|
||
|
RealFileNames.push_back(list->getFullFileName(i));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
const io::path rel = list->getFileName(i);
|
||
|
RealFileNames.push_back(list->getFullFileName(i));
|
||
|
|
||
|
io::path pwd = Parent->getWorkingDirectory();
|
||
|
if (pwd.lastChar() != '/')
|
||
|
pwd.append('/');
|
||
|
pwd.append(rel);
|
||
|
|
||
|
if ( rel != "." && rel != ".." )
|
||
|
{
|
||
|
addItem(full, 0, 0, true, 0);
|
||
|
Parent->changeWorkingDirectoryTo(pwd);
|
||
|
buildDirectory();
|
||
|
Parent->changeWorkingDirectoryTo("..");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
list->drop();
|
||
|
}
|
||
|
|
||
|
//! opens a file by index
|
||
|
IReadFile* CMountPointReader::createAndOpenFile(u32 index)
|
||
|
{
|
||
|
if (index >= Files.size())
|
||
|
return 0;
|
||
|
|
||
|
return CReadFile::createReadFile(RealFileNames[Files[index].ID]);
|
||
|
}
|
||
|
|
||
|
//! opens a file by file name
|
||
|
IReadFile* CMountPointReader::createAndOpenFile(const io::path& filename)
|
||
|
{
|
||
|
s32 index = findFile(filename, false);
|
||
|
if (index != -1)
|
||
|
return createAndOpenFile(index);
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
} // io
|
||
|
} // irr
|
||
|
|
||
|
#endif // __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
|