// Ryzom - MMORPG Framework // 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 . #ifndef NL_ACTION_HANDLER_H #define NL_ACTION_HANDLER_H #include "nel/misc/types_nl.h" #include #include "nel/misc/types_nl.h" #include "nel/misc/debug.h" #include "nel/misc/xml_auto_ptr.h" #include /** * interface for action handlers * \author Nicolas Brigand * \author Nevrax France * \date 2002 */ class CCtrlBase; class IActionHandler { public: // Execute the answer to the action // Params has the following form : paramName=theParam|paramName2=theParam2|... virtual void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) { } virtual ~IActionHandler() {} static std::string getParam (const std::string &Params, const std::string &ParamName); static void getAllParams (const std::string &Params, std::vector< std::pair > &AllParams); }; /** interface for action handlers factory no release in this factory : a handler must be destroyed by the control that created it */ class CAHManager { public: typedef std::map< std::string, IActionHandler* > TFactoryMap; typedef std::map< IActionHandler*, std::string > TNameMap; static CAHManager* getInstance() { if (_GlobalInstance == NULL) _GlobalInstance = new CAHManager; return _GlobalInstance; } /// return pointer to action handler or null if it doesn't exist IActionHandler *getActionHandler(const std::string &name) const { TFactoryMap::const_iterator it = FactoryMap.find(name); return it != FactoryMap.end() ? it->second : NULL; } /// Return the name of the action handler given its pointer const std::string &getActionHandlerName(IActionHandler *pAH) const { TNameMap::const_iterator it = NameMap.find(pAH); return it != NameMap.end() ? it->second : EmptyName; } /// map of action handler factories TFactoryMap FactoryMap; TNameMap NameMap; std::string EmptyName; /// return the Action Handler 'name'. if name is of form 'ah:params', then params are filled (NB: else not changed) IActionHandler *getAH(const std::string &name, std::string ¶ms); IActionHandler *getAH(const std::string &name, class CStringShared ¶ms); /** common method to parse Action Handler from a xml node * \param ahId eg: "onclick_l" * \param paramId eg: "params_l". * \param params returned parameters. * NB: if paramId is NULL, empty or does not exist in the xmlNode, then the optional param in ahId (eg: "show:phrase_book") * is taken * NB: if none of the optional param in ahId, or the specified param are filled/found, then params is not changed */ void parseAH(xmlNodePtr cur, const char *ahId, const char *paramId, IActionHandler *&ahRet, std::string ¶ms); void parseAH(xmlNodePtr cur, const char *ahId, const char *paramId, IActionHandler *&ahRet, class CStringShared ¶ms); /// Get the AH name from ptr const std::string &getAHName(IActionHandler *pAH) { return getActionHandlerName(pAH); } private: CAHManager(){} static CAHManager *_GlobalInstance; }; /// Ah name must all be lower case #define REGISTER_ACTION_HANDLER(handler ,name) \ class handler##Factory : public handler \ { \ public: \ handler##Factory () \ { \ nlassert(name!=NULL); \ const char *c= name; \ while(*c!='\0') \ { \ nlassert(islower(*c) || !isalpha(*c)); \ c++; \ } \ CAHManager *pAHFM = CAHManager::getInstance(); \ pAHFM->FactoryMap.insert(CAHManager::TFactoryMap::value_type(name,this)); \ pAHFM->NameMap.insert(CAHManager::TNameMap::value_type(this,name)); \ }; \ }; \ handler##Factory handler##FactoryInstance ; \ \ #endif //NL_ACTION_HANDLER_H