khanat-opennel-code/code/ryzom/tools/stats_scan/char_scan_script.h
2013-09-14 19:02:50 +02:00

173 lines
6.5 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CHAR_SCAN_SCRIPT_H
#define CHAR_SCAN_SCRIPT_H
//-------------------------------------------------------------------------------------------------
// includes
//-------------------------------------------------------------------------------------------------
#include "nel/misc/smart_ptr.h"
#include "character_scan_job.h"
//-------------------------------------------------------------------------------------------------
// forward class declarations
//-------------------------------------------------------------------------------------------------
class CCharScanScript; // an object that represents a script (one or more cumulated files)
class CCharScanScriptFile; // an object that represents a script file
class ICharScanScriptCommand; // virtual base class for objects that represents commands that can be used in script files
class CCharScanScriptCommandRegistry; // singleton registry for ICharScanScriptCommand objects
template <class C> class CCharScanScriptCommandRegisterer; // template class used to register script commands in the registry
//-------------------------------------------------------------------------------------------------
// class CCharScanScript
//-------------------------------------------------------------------------------------------------
class CCharScanScript
{
public:
// public interface
bool addScriptFile(const std::string& fileName);
void applyToJob(CCharacterScanJob& job);
private:
// prohibit implicit copy
CCharScanScript(const CCharScanScript&);
private:
// private data
std::vector<CCharScanScriptFile> _ScriptFiles;
};
//-------------------------------------------------------------------------------------------------
// class CCharScanScriptFile
//-------------------------------------------------------------------------------------------------
class CCharScanScriptFile
{
public:
// public interface
bool parseFile(const std::string& fileName, CCharScanScript* container=NULL);
bool applyToJob(CCharacterScanJob& job);
const std::string& getFileName() const;
const std::string& getDescription() const;
public:
// interface for script commands
bool setDescription(const std::string& description);
bool setOutputPath(const std::string& path);
bool addFilter(const std::string& rawArgs);
bool addInfoExtractor(const std::string& rawArgs);
bool addInputFiles(const std::string& rawArgs);
private:
// private data
std::string _FileName;
std::string _Description;
std::string _OutputPath;
std::vector<std::string> _Filters;
std::vector<std::string> _InfoExtractors;
std::vector<std::string> _InputFiles;
};
//-------------------------------------------------------------------------------------------------
// class ICharScanScriptCommand
//-------------------------------------------------------------------------------------------------
class ICharScanScriptCommand: public NLMISC::CRefCount
{
public:
virtual ~ICharScanScriptCommand() {}
virtual const char* getName()=0;
virtual const char* getSyntax()=0;
virtual const char* getDescription()=0;
virtual bool execute(CCharScanScriptFile& scriptFile,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& rawCmdLine,CCharScanScript* container)=0;
};
//-------------------------------------------------------------------------------------------------
// class CCharScanScriptCommandRegistry
//-------------------------------------------------------------------------------------------------
class CCharScanScriptCommandRegistry
{
public:
// accessor for the singleton instance
static CCharScanScriptCommandRegistry* getInstance();
public:
// register a script command
void registerScriptCommand(NLMISC::CSmartPtr<ICharScanScriptCommand> scriptCommand);
// display the set of script commands
void displayScriptCommands(NLMISC::CLog* log=NLMISC::InfoLog);
// execute a script command for a given script file object
bool execute(CCharScanScriptFile& scriptFile,const NLMISC::CSString& commandLine,CCharScanScript* container);
private:
// this is a singleton so ctor is private
CCharScanScriptCommandRegistry() {}
private:
// singleton data
typedef std::vector<NLMISC::CSmartPtr<ICharScanScriptCommand> > TScriptCommands;
TScriptCommands _ScriptCommands;
};
//-------------------------------------------------------------------------------------------------
// class CCharScanScriptCommandRegisterer
//-------------------------------------------------------------------------------------------------
template <class C>
class CCharScanScriptCommandRegisterer
{
public:
CCharScanScriptCommandRegisterer()
{
CCharScanScriptCommandRegistry::getInstance()->registerScriptCommand(new C);
}
};
//-------------------------------------------------------------------------------------------------
// MACRO CHAR_SCAN_SCRIPT_COMMAND()
//-------------------------------------------------------------------------------------------------
#define CHAR_SCAN_SCRIPT_COMMAND(name,syntax,description)\
class CCharScriptCommand_##name: public ICharScanScriptCommand\
{\
public:\
virtual const char* getName() {return #name;}\
virtual const char* getSyntax() {return syntax;}\
virtual const char* getDescription() {return description;}\
\
virtual bool execute(CCharScanScriptFile& scriptFile,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& rawCmdLine,CCharScanScript* container);\
};\
CCharScanScriptCommandRegisterer<CCharScriptCommand_##name> __Registerer_CCharScriptCommand_##name;\
bool CCharScriptCommand_##name::execute(CCharScanScriptFile& scriptFile,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& rawCmdLine,CCharScanScript* container)
//-------------------------------------------------------------------------------------------------
#endif