summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2015-11-26 15:10:00 +0100
committerAttila Molnar <attilamolnar@hush.com>2015-11-26 15:10:00 +0100
commitd3eb1a77d7ee2f924ab0fd6e5642fb328e4209d8 (patch)
treeba280d33a0f00da513e71890ec43082f045c1d9d /include
parent1833fdd31ece4f229e87fcf05ca2b3fd49a8e4ab (diff)
core_reloadmodule Allow modules to save and restore their own data when reloading another mod
Diffstat (limited to 'include')
-rw-r--r--include/modules/reload.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/include/modules/reload.h b/include/modules/reload.h
new file mode 100644
index 000000000..6ee30c45e
--- /dev/null
+++ b/include/modules/reload.h
@@ -0,0 +1,80 @@
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
+ *
+ * Copyright (C) 2015 Attila Molnar <attilamolnar@hush.com>
+ *
+ * This file is part of InspIRCd. InspIRCd 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, version 2.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#pragma once
+
+#include "event.h"
+
+namespace ReloadModule
+{
+ class EventListener;
+ class DataKeeper;
+
+ /** Container for data saved by modules before another module is reloaded.
+ */
+ class CustomData
+ {
+ struct Data
+ {
+ EventListener* handler;
+ void* data;
+ Data(EventListener* Handler, void* moddata) : handler(Handler), data(moddata) { }
+ };
+ typedef std::vector<Data> List;
+ List list;
+
+ public:
+ /** Add data to the saved state of a module.
+ * The provided handler's OnReloadModuleRestore() method will be called when the reload is done with the pointer
+ * provided.
+ * @param handler Handler for restoring the data
+ * @param data Pointer to the data, will be passed back to the provided handler's OnReloadModuleRestore() after the
+ * reload finishes
+ */
+ void add(EventListener* handler, void* data)
+ {
+ list.push_back(Data(handler, data));
+ }
+
+ friend class DataKeeper;
+ };
+
+ class EventListener : public Events::ModuleEventListener
+ {
+ public:
+ EventListener(Module* mod)
+ : ModuleEventListener(mod, "event/reloadmodule")
+ {
+ }
+
+ /** Called whenever a module is about to be reloaded. Use this event to save data related to the module that you want
+ * to be restored after the reload.
+ * @param mod Module to be reloaded
+ * @param cd CustomData instance that can store your data once.
+ */
+ virtual void OnReloadModuleSave(Module* mod, CustomData& cd) = 0;
+
+ /** Restore data after a reload. Only called if data was added in OnReloadModuleSave().
+ * @param mod Reloaded module
+ * @param data Pointer that was passed to CustomData::add() in OnReloadModuleSave() at the time when the module's state
+ * was saved
+ */
+ virtual void OnReloadModuleRestore(Module* mod, void* data) = 0;
+ };
+}