173 lines
6.5 KiB
C++
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
|