[Ryzom_service]配置文件中StartCommands运行
2010-09-21 11:23:42| 分类: Ryzom瑞泽姆传奇|举报|字号 订阅
1) 配置信息于函数IService::main中得到调用:ICommand::execute (var->asString(i), CommandLog);
注意: 脚本命令不是通用的。具有一定的专用性。格式:类实例.类中函数 + 参数。
2) 第一行脚本内格格式:"moduleManager.createModule StandardGateway gw",意思是调用CModuleManager(单例模式)实例中的函数NLMISC_CLASS_COMMAND_DECL(createModule),生成一CStandardGateway实例,起别名为:glob_gw。说明如下:
a) "moduleManager"是个对象名称(objectName-相当于类实例)-都来自父类ICommandsHandler。在CCommandRegistry类的_CommandsHandlers容器中进行查找。要想拥有此对象,需先调用ICommandsHandler::registerCommandsHandler-->CCommandRegistry::registerNamedCommandHandler(ICommandsHandler *handler, const std::string &className)进行注册:1)注册类对象于容器_CommandsHandlers.add(name, handler)及2)注册获取此类对象中的命令操作handler->fillCommandsHandlerList(commands);于容器_CommandsHandlersClass。
b) "createModule"是列表中命令名称(commandName-相当于类中函数)-函数形式是一样的,都如:typedef bool (T::*TCommand)(const std::string &rawCommandString, const std::vector<std::string> &args, NLMISC::CLog &log, bool quiet, bool human);。如上面所说2)的容器_CommandsHandlersClass中。生成的实例在进行initModule时,同时也被存储于CModuleManager容器_ModuleSocketsRegistry中。
c)参数:StandardGateway gw,其中 “StandardGateway” 是个类名字(_ModuleClassName-相当于类)-都来自父类CModuleBase(IModule)。通过NLNET_REGISTER_MODULE_FACTORY注册一个类(CModuleFactory(IModuleFactory),CFactoryIndirectRegister,CFactoryIndirect),同时类CStandardGateway来自基类CModuleBase:class CModuleBase : public IModule, public NLMISC::ICommandsHandler。所以此类也同时也被注册于objectName容器中,就是上面的a)。注意基类CModuleBase中的命令列表(dump,plug,unplug,sendPing)
注:a),b)两点可参考下面三个重要的宏定义:NLMISC_COMMAND_HANDLER_TABLE_BEGIN,NLMISC_COMMAND_HANDLER_ADD,NLMISC_COMMAND_HANDLER_TABLE_END。
3) 第二行脚本内格格式:"gw.transportAdd L5Transport l5". 调用已生成的CStandardGateway实例名gw中的一函数NLMISC_CLASS_COMMAND_DECL(transportAdd),生成一CGatewayL5Transport实例,起别名为:l5。参数说明:其中 “L5Transport” 是个类标志(_keyValue-相当于类)。要查找到“L5Transport” 类,必需通过NLMISC_REGISTER_OBJECT注册一个类(CFactoryRegister(IFactoryRegister),CFactory)。
4) 第三行脚本内格格式:"gw.transportCmd l5(open)"。调用已生成的CStandardGateway实例名gw中的一函数NLMISC_CLASS_COMMAND_DECL(transportCmd),同时调用上面已生成的CGatewayL5Transport实例名l5。参数说明:
l5(open),其中open是个commandName,表示发送"GW_L5_ADDTP"信息给其它服务。
5) 当moduleManager.createModule产生实例后,此实例将在主进程update时update.