/* AMX Mod X * * by the AMX Mod X Development Team * originally developed by OLO * * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, the author gives permission to * link the code of this program with the Half-Life Game Engine ("HL * Engine") and Modified Game Libraries ("MODs") developed by Valve, * L.L.C ("Valve"). You must obey the GNU General Public License in all * respects for all of the code used other than the HL Engine and MODs * from Valve. If you modify this file, you may extend this exception * to your version of the file, but you are not obligated to do so. If * you do not wish to do so, delete this exception statement from your * version. */ #ifndef COMMANDS_H #define COMMANDS_H // ***************************************************** // class CmdMngr // ***************************************************** enum { CMD_ConsoleCommand, CMD_ClientCommand, CMD_ServerCommand }; class CmdMngr { public: class Command; friend class Command; class Command { friend class CmdMngr; CPluginMngr::CPlugin* plugin; CmdMngr* parent; String command; String argument; String commandline; String info; bool listable; int function; int flags; int id; int cmdtype; int prefix; static int uniqueid; Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char* pinfo, int pflags, int pfunc, bool pviewable, CmdMngr* pparent); ~Command(); public: inline const char* getCommand() { return command.c_str(); } inline const char* getArgument() { return argument.c_str(); } inline const char* getCmdInfo() { return info.c_str(); } inline const char* getCmdLine() { return commandline.c_str(); } inline bool matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.c_str() + prefix, cmd + prefix) && (argument.empty() || !stricmp(argument.c_str(), arg))); } inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd)); } inline int getFunction() const { return function; } inline bool gotAccess(int f) const { return (!flags || ((flags & f) == flags)); } inline CPluginMngr::CPlugin* getPlugin() { return plugin; } inline bool isViewable() const { return listable; } inline int getFlags() const { return flags; } inline long int getId() const { return (long int)id; } const char* getCmdType() const; void setCmdType(int a); }; private: struct CmdPrefix; friend struct CmdPrefix; struct CmdLink { Command* cmd; CmdLink* next; CmdLink(Command* c): cmd(c), next(0) {} }; CmdLink* sortedlists[3]; CmdLink* srvcmdlist; CmdLink* clcmdlist; struct CmdPrefix { String name; CmdMngr* parent; CmdLink* list; CmdPrefix* next; CmdPrefix(const char* nn, CmdMngr* pp): name(nn), parent(pp), list(0), next(0) {} ~CmdPrefix() { parent->clearCmdLink(&list); } } *prefixHead; bool registerCmdPrefix(Command* cc); CmdPrefix** findPrefix(const char* nn); void clearPrefix(); void setCmdLink(CmdLink** a, Command* c, bool sorted = true); void clearCmdLink(CmdLink** phead, bool pclear = false); public: CmdMngr(); ~CmdMngr() { clear(); } // Interface void registerPrefix(const char* nn); Command* registerCommand(CPluginMngr::CPlugin* plugin, int func, char* cmd, char* info, int level, bool listable); Command* getCmd(long int id, int type, int access); int getCmdNum(int type, int access); void clearBufforedInfo(); void clear(); class iterator { CmdLink *a; public: iterator(CmdLink*aa = 0) : a(aa) {} iterator& operator++() { a = a->next; return *this; } bool operator==(const iterator& b) const { return a == b.a; } bool operator!=(const iterator& b) const { return !operator==(b); } operator bool () const { return a ? true : false; } Command& operator*() { return *a->cmd; } }; inline iterator clcmdprefixbegin(const char* nn) { CmdPrefix* a = *findPrefix(nn); return iterator(a ? a->list : 0); } inline iterator clcmdbegin() const { return iterator(clcmdlist); } inline iterator srvcmdbegin() const { return iterator(srvcmdlist); } inline iterator begin(int type) const { return iterator(sortedlists[type]); } inline iterator end() const { return iterator(0); } private: int buf_cmdid; int buf_cmdtype; int buf_cmdaccess; iterator buf_cmdptr; int buf_id; int buf_type; int buf_access; int buf_num; }; #endif //COMMANDS_H