annotate DependencyLoader/Core.lua @ 17:f825ccf94a89

fixed an indexing issue in Addon.lua moved most of the code in DependencyLoader.lua to Core.lua, and renamed the former to frontend.lua updated load.xml rearranged stuff in start.lua
author mckenziemc
date Sat, 11 Dec 2010 03:32:04 -0800
parents 1d8898cd1c82
children e7995d599184
rev   line source
mckenziemc@16 1 -- Core
mckenziemc@17 2 -- Provides core functionality of Core
mckenziemc@17 3
mckenziemc@17 4
mckenziemc@17 5 -- TODO: disable bootstrap if we load successfully?
mckenziemc@17 6 -- TODO: implement a feature to disable unneeded libraries when a parent
mckenziemc@17 7 -- is disabled?
mckenziemc@0 8
mckenziemc@0 9
mckenziemc@0 10 local addonName, addonTable = ...
mckenziemc@0 11
mckenziemc@0 12
mckenziemc@17 13 -- locals
mckenziemc@17 14 local print = addonTable.print
mckenziemc@17 15 local debug = addonTable.debug
mckenziemc@17 16 local classes = addonTable.classes
mckenziemc@17 17
mckenziemc@17 18 local AceHook = LibStub("AceHook-3.0")
mckenziemc@17 19 local LibScriptLink = LibStub("LibScriptLink-1.0")
mckenziemc@17 20
mckenziemc@17 21
mckenziemc@17 22 local Core = addonTable:NewClass("Core")
mckenziemc@17 23
mckenziemc@17 24
mckenziemc@17 25 AceHook:Embed(Core)
mckenziemc@17 26
mckenziemc@17 27 Core.queuedEnables = {} -- addons queued to be enabled after PLAYER_LOGIN
mckenziemc@17 28
mckenziemc@17 29
mckenziemc@17 30 -- Does not consider user settings or addon errata.
mckenziemc@17 31 function Core:IsForceLoadAvailable()
mckenziemc@17 32 if IsLoggedIn() then
mckenziemc@17 33 return false
mckenziemc@17 34 else
mckenziemc@17 35 return true
mckenziemc@17 36 end
mckenziemc@17 37 end
mckenziemc@17 38
mckenziemc@17 39
mckenziemc@17 40 function Core:IsForceLoadAllowed()
mckenziemc@17 41 -- TODO: check user settings
mckenziemc@17 42 return true
mckenziemc@17 43 end
mckenziemc@17 44
mckenziemc@17 45
mckenziemc@17 46 function Core:CanForceLoad()
mckenziemc@17 47 return self:IsForceLoadAvailable() and self:IsForceLoadAllowed()
mckenziemc@17 48 end
mckenziemc@17 49
mckenziemc@17 50
mckenziemc@17 51 -- Enables any dependencies needed by the addons
mckenziemc@17 52 -- that have already been enabled
mckenziemc@17 53 function Core:PrepareAllAddons()
mckenziemc@17 54 for i=1, GetNumAddOns() do
mckenziemc@17 55 local addon = classes.Addon:Get(i)
mckenziemc@17 56
mckenziemc@17 57 -- TODO: what if an addon was loaded but its deps were then disabled?
mckenziemc@17 58 if addon:IsEnabled() and not addon:IsLoaded() then
mckenziemc@17 59 self:EnableAddOn(i)
mckenziemc@17 60 end
mckenziemc@17 61 end
mckenziemc@17 62 end
mckenziemc@17 63
mckenziemc@17 64
mckenziemc@17 65 function Core:SetHooks()
mckenziemc@17 66 self:RawHook("EnableAddOn", true)
mckenziemc@17 67 self:RawHook("LoadAddOn", true)
mckenziemc@17 68 end
mckenziemc@17 69
mckenziemc@17 70
mckenziemc@17 71 -- FIXME: use pcall in EnableAddOn and LoadAddOn, so that if my part errors,
mckenziemc@17 72 -- it can still use the unhooked version
mckenziemc@17 73
mckenziemc@17 74 function Core:EnableAddOn(...)
mckenziemc@17 75 local id = ...
mckenziemc@17 76
mckenziemc@17 77 debug("EnableAddOn", ...)
mckenziemc@17 78
mckenziemc@17 79 -- even though we know EnableAddOn can cause force-loading before PLAYER_LOGIN,
mckenziemc@17 80 -- DO NOT attempt to "fix" it: another addon that -does- know about
mckenziemc@17 81 -- the different behavior might call our hook.
mckenziemc@17 82
mckenziemc@17 83 if classes.Addon:Exists(id) then
mckenziemc@17 84 local addon = classes.Addon:Get(id)
mckenziemc@17 85 local tree = classes.Tree:Get(addon)
mckenziemc@17 86
mckenziemc@17 87 local requestReload = false
mckenziemc@17 88
mckenziemc@17 89 if self:CanForceLoad() then
mckenziemc@17 90 -- NOTE: if we can force-load, then will enabling LoD addons cause them to load too?
mckenziemc@17 91 -- A: no, they will still wait for LoadAddOn
mckenziemc@17 92
mckenziemc@17 93 -- Can the addon be loaded on demand if force-loading is
mckenziemc@17 94 -- allowed for its dependencies
mckenziemc@17 95 -- if so, enable all deps and force-load if nec.
mckenziemc@17 96 -- deps will get enabled if all parents are lod, force-loaded
mckenziemc@17 97 -- if any parent can't be loaded on demand
mckenziemc@17 98 -- else
mckenziemc@17 99 -- if the addon is not loadable on demand but the tree can be
mckenziemc@17 100 -- force-loaded, then force-load it all
mckenziemc@17 101 -- deps will all get loaded since req. for root to load
mckenziemc@17 102 -- else
mckenziemc@17 103 -- if it can be loaded with a reloadui then prepare after login
mckenziemc@17 104 -- else
mckenziemc@17 105 -- it can't be loaded, maybe tell the user
mckenziemc@17 106
mckenziemc@17 107 if tree:CanForceLoad() then
mckenziemc@17 108 if addon:CanLoD() then
mckenziemc@17 109 tree:PrepareForLoD()
mckenziemc@17 110 else
mckenziemc@17 111 tree:ForceLoad()
mckenziemc@17 112 end
mckenziemc@17 113 elseif tree:CanLoad() then
mckenziemc@17 114 tree:PrepareForLoad()
mckenziemc@17 115 requestReload = true
mckenziemc@17 116 else
mckenziemc@17 117 -- TODO: tell user
mckenziemc@17 118 end
mckenziemc@17 119
mckenziemc@17 120
mckenziemc@17 121 --[[
mckenziemc@17 122 if tree:CanLoDWithForce() then
mckenziemc@17 123 tree:PrepareForLoD()
mckenziemc@17 124 elseif tree:CanForceLoad() then
mckenziemc@17 125 tree:ForceLoad()
mckenziemc@17 126 elseif tree:CanLoad() then
mckenziemc@17 127 tree:PrepareForLoad()
mckenziemc@17 128 requestReload = true
mckenziemc@17 129 else
mckenziemc@17 130 -- TODO: tell user
mckenziemc@17 131 end
mckenziemc@17 132 ]]
mckenziemc@17 133 else
mckenziemc@17 134 -- if it can be loaded on demand (deps are loaded or LoD) then
mckenziemc@17 135 -- prepare it (enable all deps)
mckenziemc@17 136 -- else
mckenziemc@17 137 -- if it can be loaded (and isn't already) then
mckenziemc@17 138 -- if force loading is available, we have to wait, then enable everything
mckenziemc@17 139 -- else
mckenziemc@17 140 -- prepare for reload (TODO: move this check and similar to PLAYER_LOGOUT)
mckenziemc@17 141 -- else
mckenziemc@17 142 -- can't be loaded, maybe tell the user
mckenziemc@17 143
mckenziemc@17 144 if tree:CanLoD() then
mckenziemc@17 145 tree:PrepareForLoad()
mckenziemc@17 146 -- don't actually intend to reload, just enable everything
mckenziemc@17 147 elseif tree:CanLoad() then
mckenziemc@17 148 tree:PrepareForLoad()
mckenziemc@17 149 requestReload = true
mckenziemc@17 150 else
mckenziemc@17 151 -- TODO: tell user
mckenziemc@17 152 end
mckenziemc@17 153 end
mckenziemc@17 154
mckenziemc@17 155 if requestReload then
mckenziemc@17 156 self:RequestReload()
mckenziemc@17 157 end
mckenziemc@17 158 end
mckenziemc@17 159
mckenziemc@17 160 -- propogate the call even if it doesn't exist or deps are unavailable
mckenziemc@17 161 return self:RawEnableAddOn(...)
mckenziemc@17 162 end
mckenziemc@17 163
mckenziemc@17 164
mckenziemc@17 165
mckenziemc@17 166 --- Prepares the addon tree rooted at the specified addon
mckenziemc@17 167 function Core:LoadAddOn(...)
mckenziemc@17 168 local id = ...
mckenziemc@17 169
mckenziemc@17 170 debug("LoadAddOn", ...)
mckenziemc@17 171
mckenziemc@17 172 if classes.Addon:Exists(id) then
mckenziemc@17 173 local addon = classes.Addon:Get(id)
mckenziemc@17 174 local tree = classes.Tree:Get(addon)
mckenziemc@17 175
mckenziemc@17 176 if tree:CanLoD() then
mckenziemc@17 177 tree:PrepareForLoD()
mckenziemc@17 178 elseif tree:CanLoad() then
mckenziemc@17 179 tree:PrepareForLoad()
mckenziemc@17 180 -- TODO: request reload
mckenziemc@17 181 end
mckenziemc@17 182 end
mckenziemc@17 183
mckenziemc@17 184 -- call even if it can't be loaded so regular returns appear
mckenziemc@17 185 return self:RawLoadAddOn(...)
mckenziemc@17 186 end
mckenziemc@17 187
mckenziemc@17 188
mckenziemc@17 189 function Core:RequestReload()
mckenziemc@17 190 -- TODO: this should be throtled so that it can
mckenziemc@17 191 -- occur more than once but not within a short time
mckenziemc@17 192
mckenziemc@17 193 debug("reload requested (NYI)")
mckenziemc@17 194 end
mckenziemc@17 195
mckenziemc@17 196
mckenziemc@17 197 -- name or index
mckenziemc@17 198 function Core:QueueEnable(addon)
mckenziemc@17 199 self.queuedEnables[addon] = true
mckenziemc@17 200 end
mckenziemc@17 201
mckenziemc@17 202
mckenziemc@17 203 function Core:RawEnableAddOn(...)
mckenziemc@17 204 return self.hooks.EnableAddOn(...)
mckenziemc@17 205 end
mckenziemc@17 206
mckenziemc@17 207
mckenziemc@17 208 function Core:RawLoadAddOn(...)
mckenziemc@17 209 return self.hooks.LoadAddOn(...)
mckenziemc@17 210 end
mckenziemc@17 211
mckenziemc@17 212
mckenziemc@17 213 function Core:ProcessEnableQueue()
mckenziemc@17 214 for addon in pairs(self.queuedEnables) do
mckenziemc@17 215 self:RawEnableAddOn(addon)
mckenziemc@17 216 self.queuedEnables[addon] = nil
mckenziemc@17 217 end
mckenziemc@17 218 end