1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "ArchiveLoader.h"
#include "Archives/ArchiveFactory.h"
#include "Archives/IArchive.h"
#include "Archives/PoolArchive.h"
#include "Archives/DirArchive.h"
#include "Archives/ZipArchive.h"
#include "Archives/SevenZipArchive.h"
#include "Archives/VirtualArchive.h"
#include "FileSystem.h"
#include "DataDirsAccess.h"
#include "System/Util.h"
CArchiveLoader::CArchiveLoader()
{
// TODO maybe move ArchiveFactory registration to some external place
AddFactory(new CPoolArchiveFactory());
AddFactory(new CDirArchiveFactory());
AddFactory(new CZipArchiveFactory());
AddFactory(new CSevenZipArchiveFactory());
AddFactory(new CVirtualArchiveFactory());
}
CArchiveLoader::~CArchiveLoader()
{
std::map<std::string, IArchiveFactory*>::iterator afi;
for (afi = archiveFactories.begin(); afi != archiveFactories.end(); ++afi) {
SafeDelete(afi->second);
}
}
CArchiveLoader& CArchiveLoader::GetInstance()
{
static CArchiveLoader singleton;
return singleton;
}
bool CArchiveLoader::IsArchiveFile(const std::string& fileName) const
{
const std::string ext = FileSystem::GetExtension(fileName);
return (archiveFactories.find(ext) != archiveFactories.end());
}
IArchive* CArchiveLoader::OpenArchive(const std::string& fileName, const std::string& type) const
{
IArchive* ret = NULL;
const std::string ext = type.empty() ? FileSystem::GetExtension(fileName) : type;
const std::string filePath = dataDirsAccess.LocateFile(fileName);
const std::map<std::string, IArchiveFactory*>::const_iterator afi
= archiveFactories.find(ext);
if (afi != archiveFactories.end()) {
ret = afi->second->CreateArchive(filePath);
}
if (ret && ret->IsOpen()) {
return ret;
}
delete ret;
return NULL;
}
void CArchiveLoader::AddFactory(IArchiveFactory* archiveFactory)
{
assert(archiveFactory != NULL);
// ensure unique extensions
assert(archiveFactories.find(archiveFactory->GetDefaultExtension()) == archiveFactories.end());
archiveFactories[archiveFactory->GetDefaultExtension()] = archiveFactory;
}
|