mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
* Fixing upper/lower case for includes types.h, zconf.h and zlib.h were renamed so that global includes like Types.h are not used.
127 lines
3.2 KiB
C++
127 lines
3.2 KiB
C++
#include "transfer_rules.h"
|
|
#include "DEBUG.H"
|
|
#include <vfs/Core/vfs.h>
|
|
#include <vfs/Core/vfs_file_raii.h>
|
|
#include <vfs/Core/File/vfs_file.h>
|
|
#include <vfs/Tools/vfs_parser_tools.h>
|
|
#include <vfs/Tools/vfs_tools.h>
|
|
|
|
CTransferRules::CTransferRules()
|
|
: m_eDefaultAction(ACCEPT)
|
|
{};
|
|
|
|
|
|
bool CTransferRules::initFromTxtFile(vfs::Path const& sPath)
|
|
{
|
|
// try to open via VirtualFileSystem
|
|
if(getVFS()->fileExists(sPath))
|
|
{
|
|
return initFromTxtFile(getVFS()->getReadFile(sPath));
|
|
}
|
|
else
|
|
{
|
|
// file doesn't exist or VFS not initialized yet
|
|
vfs::IBaseFile* pFile = new vfs::CFile(sPath);
|
|
if(pFile)
|
|
{
|
|
bool success = initFromTxtFile(vfs::tReadableFile::cast(pFile));
|
|
delete pFile;
|
|
return success;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CTransferRules::initFromTxtFile(vfs::tReadableFile* pFile)
|
|
{
|
|
if(pFile && pFile->openRead())
|
|
{
|
|
vfs::COpenReadFile rfile(pFile);
|
|
std::string sBuffer;
|
|
vfs::UInt32 line_counter = 0;
|
|
vfs::CReadLine rl(*pFile);
|
|
while(rl.getLine(sBuffer))
|
|
{
|
|
line_counter++;
|
|
// very simple parsing : key = value
|
|
if(!sBuffer.empty())
|
|
{
|
|
// remove leading white spaces
|
|
::size_t iStart = sBuffer.find_first_not_of(" \t",0);
|
|
char first = sBuffer.at(iStart);
|
|
switch(first)
|
|
{
|
|
case '!':
|
|
case ';':
|
|
case '#':
|
|
// comment -> do nothing
|
|
break;
|
|
default:
|
|
::size_t iEnd = sBuffer.find_first_of(" \t", iStart);
|
|
if(iEnd != std::string::npos)
|
|
{
|
|
SRule rule;
|
|
std::string action = sBuffer.substr(iStart, iEnd - iStart);
|
|
if( vfs::StrCmp::Equal(action, "deny") )
|
|
{
|
|
rule.action = CTransferRules::DENY;
|
|
}
|
|
else if( vfs::StrCmp::Equal(action, "accept") )
|
|
{
|
|
rule.action = CTransferRules::ACCEPT;
|
|
}
|
|
else
|
|
{
|
|
std::wstring trybuffer = L"Invalid UTF-8 character in string";
|
|
VFS_IGNOREEXCEPTION( trybuffer = vfs::String(sBuffer).c_wcs(), "" ); /* just make sure we don't break off when string conversion fails */
|
|
std::wstringstream wss;
|
|
wss << L"Unknown action in file \"" << pFile->getPath().c_wcs()
|
|
<< L", line " << line_counter << " : " << vfs::String(sBuffer).c_wcs();
|
|
SGP_THROW(wss.str().c_str());
|
|
}
|
|
try
|
|
{
|
|
rule.pattern = vfs::Path(vfs::trimString(sBuffer, iEnd, sBuffer.length()));
|
|
}
|
|
catch(vfs::Exception& ex)
|
|
{
|
|
std::wstringstream wss;
|
|
wss << L"Could not convert string, invalid utf8 encoding in file \"" << pFile->getPath().c_wcs()
|
|
<< L"\", line " << line_counter;
|
|
SGP_RETHROW(wss.str().c_str(), ex);
|
|
}
|
|
m_listRules.push_back(rule);
|
|
}
|
|
break;
|
|
}; // end switch
|
|
} // end if (empty)
|
|
} // end while(!eof)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void CTransferRules::setDefaultAction(CTransferRules::EAction act)
|
|
{
|
|
m_eDefaultAction = act;
|
|
}
|
|
|
|
CTransferRules::EAction CTransferRules::getDefaultAction()
|
|
{
|
|
return m_eDefaultAction;
|
|
}
|
|
|
|
CTransferRules::EAction CTransferRules::applyRule(vfs::String const& sStr)
|
|
{
|
|
tPatternList::iterator sit = m_listRules.begin();
|
|
for(; sit != m_listRules.end(); ++sit)
|
|
{
|
|
if(matchPattern(sit->pattern(), sStr))
|
|
{
|
|
return sit->action;
|
|
}
|
|
}
|
|
return m_eDefaultAction;
|
|
}
|
|
|