1 /** 2 Copyright: Copyright (c) 2015-2018 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 7 module pluginlib.pluginmanager; 8 9 import voxelman.log; 10 import std.string : format; 11 import pluginlib; 12 13 class PluginManager : IPluginManager, IResourceManagerRegistry 14 { 15 IPlugin[TypeInfo] plugins; 16 IPlugin[string] pluginsById; 17 IResourceManager[TypeInfo] resourceManagers; 18 19 void registerPlugin(IPlugin pluginInstance) 20 { 21 assert(pluginInstance); 22 assert( 23 typeid(pluginInstance) !in plugins && 24 pluginInstance.id !in pluginsById, 25 format("Duplicate plugin registered: id=\"%s\" type=\"%s\"", 26 pluginInstance.id, pluginInstance)); 27 plugins[typeid(pluginInstance)] = pluginInstance; 28 pluginsById[pluginInstance.id] = pluginInstance; 29 } 30 31 void registerResourceManager(IResourceManager rmInstance) 32 { 33 assert(rmInstance); 34 assert(typeid(rmInstance) !in resourceManagers, 35 format("Duplicate resource manager registered: id=\"%s\" type=\"%s\"", 36 rmInstance.id, rmInstance)); 37 tracef("registerResourceManager %s", rmInstance.id); 38 resourceManagers[typeid(rmInstance)] = rmInstance; 39 } 40 41 // IPluginManager 42 IPlugin findPlugin(TypeInfo pluginType) 43 { 44 return plugins.get(pluginType, null); 45 } 46 47 IPlugin findPluginById(string pluginId) 48 { 49 return pluginsById.get(pluginId, null); 50 } 51 52 53 // IResourceManagerRegistry 54 IResourceManager findResourceManager(TypeInfo rmType) 55 { 56 tracef("findResourceManager %s", rmType); 57 return resourceManagers.get(rmType, null); 58 } 59 60 void initPlugins() 61 { 62 // Register resources 63 foreach(IPlugin p; plugins) 64 { 65 tracef("registerResourceManagers %s", p.id); 66 p.registerResourceManagers(®isterResourceManager); 67 } 68 69 foreach(IResourceManager rm; resourceManagers) 70 { 71 tracef("preInit %s", rm.id); 72 rm.preInit(); 73 } 74 foreach(IResourceManager rm; resourceManagers) 75 { 76 tracef("init %s", rm.id); 77 rm.init(this); 78 } 79 80 foreach(IPlugin p; plugins) 81 { 82 tracef("registerResources %s", p.id); 83 p.registerResources(this); 84 } 85 86 // Load resources 87 foreach(IResourceManager rm; resourceManagers) 88 { 89 tracef("loadResources %s", rm.id); 90 rm.loadResources(); 91 } 92 foreach(IResourceManager rm; resourceManagers) 93 { 94 tracef("postInit %s", rm.id); 95 rm.postInit(); 96 } 97 98 // Load plugins 99 foreach(IPlugin p; plugins) 100 { 101 tracef("preInit %s", p.id); 102 p.preInit(); 103 } 104 foreach(IPlugin p; plugins) 105 { 106 tracef("init %s", p.id); 107 p.init(this); 108 } 109 110 foreach(IPlugin p; plugins) 111 { 112 tracef("postInit %s", p.id); 113 p.postInit(); 114 } 115 116 size_t i = 1; 117 infof("Loaded %s plugins", plugins.length); 118 foreach(IPlugin p; plugins) 119 { 120 infof("Loaded #%s %s %s", i, p.id, p.semver); 121 ++i; 122 } 123 } 124 }