Files
SingularityViewer/indra/newview/shcommandhandler.h
unknown 4929460c66 COA stuff rolled into gSavedSettings.
Added common script<->client command junk.
2010-10-19 18:50:47 -05:00

106 lines
3.9 KiB
C++

#if SHY_MOD //Command handler
#include "llviewerobject.h"
#include "llagentdata.h"
#include "llcontrol.h"
class SHCommandHandler
{
public:
typedef void(*command_fn_t)(const SHCommandHandler *pCmd, const LLSD &args, const std::string &full_str, const LLUUID &callerid, LLViewerObject *pCaller);
private:
//Dispatch handled through a function pointer because doing it via class deriviation requires constructors each time
// which makes macroing ugly.
command_fn_t mDispatchFn;
//Static initialization fiasco avoidance
static std::list<SHCommandHandler*> &getScriptCommandList();
static std::list<SHCommandHandler*> &getChatCommandList();
public:
//ctor/dtors
SHCommandHandler(bool from_chat, command_fn_t callback);
//Virtuals:
//Virtual destructors in abstract classes are a good thing.
virtual ~SHCommandHandler() {}
//Must override in derived classes.
virtual const std::string &getName() const = 0;
//Call the function pointed to if set.
virtual void Dispatch(const LLSD &args, const std::string &full_str, const LLUUID &callerid, LLViewerObject *pCaller) //Overrideable
{
if(mDispatchFn)
(mDispatchFn)(this,args,full_str,callerid,pCaller);
}
//Statics:
//Iterate through commands and run Dispatch on any matches.
static bool handleCommand(bool from_chat, const std::string &full_str, const LLUUID &callerid, LLViewerObject *pCaller);
//Self-explanatory
static void send_chat_to_object(const std::string &message, int channel, const LLUUID &target_id = gAgentID);
static void send_chat_to_object(const std::string &message, int channel, LLViewerObject *pTargetObject);
};
class SHDynamicCommand : public SHCommandHandler
{
private:
LLCachedControl<std::string> *pControl;
public:
//ctor/dtors
SHDynamicCommand(bool from_chat, const std::string &str, command_fn_t callback, LLControlGroup *pGroup)
: SHCommandHandler(from_chat,callback), pControl(new LLCachedControl<std::string>(str,""))
{}
SHDynamicCommand(bool from_chat, const std::string &str, command_fn_t callback, LLControlGroup &pGroup = gSavedSettings)
: SHCommandHandler(from_chat,callback), pControl(new LLCachedControl<std::string>(str,""))
{}
//Virtuals:
virtual ~SHDynamicCommand()
{
if(pControl)
delete pControl;
}
virtual const std::string &getName() const
{
static const std::string empty_str;
return pControl ? pControl->get() : empty_str;
}
};
class SHCommand : public SHCommandHandler
{
private:
const std::string mCommandName;
public:
SHCommand(bool from_chat, const std::string &str, command_fn_t callback)
: SHCommandHandler(from_chat,callback), mCommandName(str)
{}
virtual const std::string &getName() const
{
return mCommandName;
}
};
#define SETUP_SETTING_CMD(type, varname, group, chat) \
void cmd_dispatch_##type##_##varname(const SHCommandHandler *pCmd, const LLSD &args, const std::string &full_str, const LLUUID &callerid, LLViewerObject *pCaller); \
SHDynamicCommand cmd_cls_##type##_##varname(chat,#varname,&cmd_dispatch_##type##_##varname,group); \
void cmd_dispatch_##type##_##varname(const SHCommandHandler *pCmd, const LLSD &args, const std::string &full_str, const LLUUID &callerid, LLViewerObject *pCaller)
#define SETUP_STATIC_CMD(type, varname, chat) \
void cmd_dispatch_##type##_##varname(const SHCommandHandler *pCmd, const LLSD &args, const std::string &full_str, const LLUUID &callerid, LLViewerObject *pCaller); \
SHCommand cmd_cls_##type##_##varname(chat,#varname,&cmd_dispatch_##type##_##varname); \
void cmd_dispatch_##type##_##varname(const SHCommandHandler *pCmd, const LLSD &args, const std::string &full_str, const LLUUID &callerid, LLViewerObject *pCaller )
//Specify control group
#define CMD_SCRIPT_SETTING(varname,group) SETUP_SETTING_CMD(script,varname,group,false)
#define CMD_CHAT_SETTING(varname,group) SETUP_SETTING_CMD(chat,varname,group,true)
//command name is static
#define CMD_SCRIPT(varname) SETUP_STATIC_CMD(script,varname,false)
#define CMD_CHAT(varname) SETUP_STATIC_CMD(chat,varname,true)
#endif //shy_mod