X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_reloadmodule.cpp;h=6fcec8ac20cbb0a0f55c13c73d5913320ade5639;hb=754f0130893bacb2b69a32c3de9ed1b3da9659cd;hp=fd99a5f7e78515881b5ac680ac34c2d15ddd811c;hpb=1833fdd31ece4f229e87fcf05ca2b3fd49a8e4ab;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_reloadmodule.cpp b/src/coremods/core_reloadmodule.cpp index fd99a5f7e..6fcec8ac2 100644 --- a/src/coremods/core_reloadmodule.cpp +++ b/src/coremods/core_reloadmodule.cpp @@ -21,13 +21,25 @@ #include "inspircd.h" #include "listmode.h" +#include "modules/reload.h" + +static Events::ModuleEventProvider* reloadevprov; class CommandReloadmodule : public Command { + Events::ModuleEventProvider evprov; public: /** Constructor for reloadmodule. */ - CommandReloadmodule ( Module* parent) : Command( parent, "RELOADMODULE",1) { flags_needed = 'o'; syntax = ""; } + CommandReloadmodule(Module* parent) + : Command(parent, "RELOADMODULE", 1) + , evprov(parent, "event/reloadmodule") + { + reloadevprov = &evprov; + flags_needed = 'o'; + syntax = ""; + } + /** Handle command. * @param parameters The parameters to the command * @param user The user issuing the command @@ -153,6 +165,10 @@ class DataKeeper */ std::vector chandatalist; + /** Data attached by modules + */ + ReloadModule::CustomData moddata; + void SaveExtensions(Extensible* extensible, std::vector& extdatalist); void SaveMemberData(Channel* chan, std::vector& memberdatalist); static void SaveListModes(Channel* chan, ListModeBase* lm, size_t index, ModesExts& currdata); @@ -172,6 +188,7 @@ class DataKeeper void DoRestoreUsers(); void DoRestoreChans(); + void DoRestoreModules(); /** Restore previously saved modes and extensions on an Extensible. * The extensions are set directly on the extensible, the modes are added into the provided mode change list. @@ -219,6 +236,10 @@ class DataKeeper * @param newmod Newly loaded instance of the module which had its data saved */ void Restore(Module* newmod); + + /** Handle reload failure + */ + void Fail(); }; void DataKeeper::DoSaveUsers() @@ -399,7 +420,9 @@ void DataKeeper::Save(Module* currmod) CreateModeList(MODETYPE_CHANNEL); DoSaveChans(); - ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Saved data about %lu users %lu chans", (unsigned long)userdatalist.size(), (unsigned long)chandatalist.size()); + FOREACH_MOD_CUSTOM(*reloadevprov, ReloadModule::EventListener, OnReloadModuleSave, (mod, this->moddata)); + + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Saved data about %lu users %lu chans %lu modules", (unsigned long)userdatalist.size(), (unsigned long)chandatalist.size(), (unsigned long)moddata.list.size()); } void DataKeeper::VerifyServiceProvider(const ProviderInfo& service, const char* type) @@ -444,10 +467,19 @@ void DataKeeper::Restore(Module* newmod) // Restore DoRestoreUsers(); DoRestoreChans(); + DoRestoreModules(); ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Restore finished"); } +void DataKeeper::Fail() +{ + this->mod = NULL; + + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Restore failed, notifying modules"); + DoRestoreModules(); +} + void DataKeeper::RestoreObj(const OwnedModesExts& data, Extensible* extensible, ModeType modetype, Modes::ChangeList& modechange) { RestoreExtensions(data.extlist, extensible); @@ -520,6 +552,16 @@ void DataKeeper::DoRestoreChans() } } +void DataKeeper::DoRestoreModules() +{ + for (ReloadModule::CustomData::List::iterator i = moddata.list.begin(); i != moddata.list.end(); ++i) + { + ReloadModule::CustomData::Data& data = *i; + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Calling module data handler %p", (void*)data.handler); + data.handler->OnReloadModuleRestore(mod, data.data); + } +} + } // namespace ReloadModule class ReloadAction : public HandlerBase0 @@ -553,11 +595,13 @@ class ReloadAction : public HandlerBase0 Module* newmod = ServerInstance->Modules->Find(name); datakeeper.Restore(newmod); } + else + datakeeper.Fail(); ServerInstance->SNO->WriteGlobalSno('a', "RELOAD MODULE: %s %ssuccessfully reloaded", passedname.c_str(), result ? "" : "un"); User* user = ServerInstance->FindUUID(uuid); if (user) - user->WriteNumeric(RPL_LOADEDMODULE, "%s :Module %ssuccessfully reloaded.", passedname.c_str(), result ? "" : "un"); + user->WriteNumeric(RPL_LOADEDMODULE, passedname, InspIRCd::Format("Module %ssuccessfully reloaded.", (result ? "" : "un"))); ServerInstance->GlobalCulls.AddItem(this); } @@ -568,8 +612,7 @@ CmdResult CommandReloadmodule::Handle (const std::vector& parameter Module* m = ServerInstance->Modules->Find(parameters[0]); if (m == creator) { - user->WriteNumeric(RPL_LOADEDMODULE, "%s :You cannot reload core_reloadmodule.so (unload and load it)", - parameters[0].c_str()); + user->WriteNumeric(RPL_LOADEDMODULE, parameters[0], "You cannot reload core_reloadmodule.so (unload and load it)"); return CMD_FAILURE; } @@ -583,7 +626,7 @@ CmdResult CommandReloadmodule::Handle (const std::vector& parameter } else { - user->WriteNumeric(RPL_LOADEDMODULE, "%s :Could not find module by that name", parameters[0].c_str()); + user->WriteNumeric(RPL_LOADEDMODULE, parameters[0], "Could not find module by that name"); return CMD_FAILURE; } }