mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@4447 3b4a5df2-a311-0410-b5c6-a8a6f20db521
212 lines
4.6 KiB
C++
212 lines
4.6 KiB
C++
#include <init_vfs.h>
|
|
|
|
#include <vfs/Core/vfs_os_functions.h>
|
|
#include <vfs/Core/vfs_init.h>
|
|
#include <vfs/Tools/vfs_property_container.h>
|
|
|
|
#include <stack>
|
|
#include <iostream>
|
|
|
|
ja2xp::InitVFS::InitVFS()
|
|
{
|
|
}
|
|
|
|
ja2xp::InitVFS& ja2xp::InitVFS::instance()
|
|
{
|
|
static ja2xp::InitVFS singleton;
|
|
return singleton;
|
|
}
|
|
|
|
void ja2xp::InitVFS::checkParameters(ja2xp::IExporterBase::param_list_t const& params)
|
|
{
|
|
ja2xp::IExporterBase::param_list_t::const_iterator cit = params.begin();
|
|
for(; cit != params.end(); ++cit)
|
|
{
|
|
if( vfs::StrCmp::Equal(*cit, L"-lib") )
|
|
{
|
|
this->src_lib = true;
|
|
cit++;
|
|
if(cit != params.end())
|
|
{
|
|
// get library path
|
|
this->src_path = vfs::Path(*cit);
|
|
this->has_src = true;
|
|
|
|
cit++;
|
|
if(cit != params.end())
|
|
{
|
|
this->src_pattern = vfs::Path(*cit);
|
|
continue;
|
|
}
|
|
}
|
|
std::wcout << L"error " << std::endl;
|
|
}
|
|
else if( vfs::StrCmp::Equal(*cit, L"-create_dst") )
|
|
{
|
|
this->dst_create = true;
|
|
continue;
|
|
}
|
|
else if(!cit->empty() && cit->at(0) == L'-')
|
|
{
|
|
//ignore unknown options
|
|
continue;
|
|
}
|
|
|
|
if(!this->has_src)
|
|
{
|
|
this->src_path = vfs::Path(*cit);
|
|
this->has_src = true;
|
|
}
|
|
else if(this->has_src && !this->has_dst)
|
|
{
|
|
this->dst_path = vfs::Path(*cit);
|
|
this->has_dst = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void SplitPath(vfs::Path const& path, vfs::Path& root, vfs::Path& pattern)
|
|
{
|
|
vfs::String::str_t sSrc = path();
|
|
if(sSrc.empty())
|
|
{
|
|
return;
|
|
}
|
|
// remove enclosing ""
|
|
if(sSrc.at(0) == L'\"' && sSrc.at(sSrc.length()-1) == L'\"')
|
|
{
|
|
sSrc = sSrc.substr(1,sSrc.length()-2);
|
|
}
|
|
// has * in path
|
|
size_t pos = sSrc.find_first_of(L"*");
|
|
if(pos != std::wstring::npos)
|
|
{
|
|
vfs::Path temp_root, temp_pattern;
|
|
// get directory
|
|
vfs::Path temp(sSrc.substr(0,pos+1));
|
|
temp.splitLast(temp_root, temp_pattern);
|
|
// correct pattern
|
|
temp_pattern = vfs::Path(temp_pattern.c_wcs() + sSrc.substr(pos+1,sSrc.length()-pos-1));
|
|
|
|
root = vfs::Path(temp_root);
|
|
pattern = vfs::Path(temp_pattern);
|
|
}
|
|
else
|
|
{
|
|
path.splitLast(root,pattern);
|
|
}
|
|
}
|
|
|
|
|
|
//bool InitVFS(vfs::Path const& sSrcPath, vfs::Path const& sDstPath,
|
|
// vfs::Path& src_pattern, vfs::Path& dst_pattern,
|
|
// bool bSourceAsLib, bool bCreateDstDirectory)
|
|
bool ja2xp::InitVFS::init()
|
|
{
|
|
if( !this->has_src || !this->has_dst )
|
|
{
|
|
return false;
|
|
}
|
|
vfs::Path src_root, dst_root;
|
|
|
|
if( this->src_pattern.empty() && !this->src_lib )
|
|
{
|
|
SplitPath(this->src_path, src_root, this->src_pattern);
|
|
if(src_root.empty()) src_root = L".";
|
|
}
|
|
else
|
|
{
|
|
src_root = this->src_path;
|
|
}
|
|
|
|
SplitPath(this->dst_path, dst_root, this->dst_pattern);
|
|
if(dst_root.empty()) dst_root = L".";
|
|
|
|
vfs::String ext_test;
|
|
if(!this->dst_pattern.extension(ext_test))
|
|
{
|
|
// output pattern has no extension and is probably not a directory name
|
|
dst_root += this->dst_pattern;
|
|
this->dst_pattern = L".";
|
|
}
|
|
|
|
if(!this->src_lib && !vfs::OS::checkRealDirectory(src_root))
|
|
{
|
|
std::wcout << L"Source directory \"" << src_root() << L"\" does not exist" << std::endl;
|
|
return false;
|
|
}
|
|
if(!vfs::OS::checkRealDirectory(dst_root))
|
|
{
|
|
if(!this->dst_create)
|
|
{
|
|
std::wcout << L"Destination directory \"" << dst_root() << L"\" does not exist" << std::endl;
|
|
return false;
|
|
}
|
|
std::stack<vfs::Path> dirs;
|
|
vfs::Path left = dst_root, right, temp;
|
|
while(!left.empty() && !vfs::OS::checkRealDirectory(left))
|
|
{
|
|
dirs.push(left);
|
|
left.splitLast(temp,right);
|
|
left = temp;
|
|
}
|
|
while(!dirs.empty())
|
|
{
|
|
if(!vfs::OS::createRealDirectory(dirs.top()))
|
|
{
|
|
std::wcout << L"Could not create directory \"" << dirs.top().c_wcs() << std::endl;
|
|
return false;
|
|
}
|
|
dirs.pop();
|
|
}
|
|
}
|
|
|
|
vfs_init::Location src_loc;
|
|
if(this->src_lib)
|
|
{
|
|
src_loc.m_type = L"library";
|
|
}
|
|
else
|
|
{
|
|
src_loc.m_type = L"directory";
|
|
}
|
|
src_loc.m_path = src_root;
|
|
|
|
vfs_init::Profile src_prof;
|
|
src_prof.m_name = L"Source";
|
|
src_prof.addLocation(&src_loc);
|
|
|
|
vfs_init::Location dst_loc;
|
|
dst_loc.m_type = L"directory";
|
|
dst_loc.m_path = dst_root;
|
|
|
|
vfs_init::Profile dst_prof;
|
|
dst_prof.m_name = L"Destination";
|
|
dst_prof.addLocation(&dst_loc);
|
|
dst_prof.m_writable = true;
|
|
|
|
vfs_init::VfsConfig conf;
|
|
conf.addProfile(&src_prof);
|
|
conf.addProfile(&dst_prof);
|
|
|
|
try
|
|
{
|
|
vfs_init::initVirtualFileSystem(conf);
|
|
}
|
|
catch(vfs::Exception& ex)
|
|
{
|
|
std::wcout << ex.m_CallStack.front().message.c_wcs() << std::endl;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
vfs::Path const& ja2xp::InitVFS::srcPattern()
|
|
{
|
|
return this->src_pattern;
|
|
}
|
|
vfs::Path const& ja2xp::InitVFS::dstPattern()
|
|
{
|
|
return this->dst_pattern;
|
|
}
|