mckenziemc@8: mckenziemc@0: mckenziemc@0: mckenziemc@0: local addonName, addonTable = ... mckenziemc@0: mckenziemc@0: mckenziemc@14: -- NOTE: current contents of this file are no longer used mckenziemc@10: if true then mckenziemc@10: return mckenziemc@10: end mckenziemc@10: mckenziemc@0: local Core, core = addonTable:NewClass("Core") mckenziemc@0: mckenziemc@0: mckenziemc@0: function Core:New() mckenziemc@0: local instance = {} mckenziemc@0: setmetatable(instance, self.instanceMetatable) mckenziemc@0: mckenziemc@0: instance.addons = {} mckenziemc@0: instance.nameToIndex = {} mckenziemc@0: mckenziemc@0: for i=1,GetNumAddOns() do mckenziemc@0: local newAddon = Addon:New(i) mckenziemc@0: mckenziemc@0: instance.addons[i] = newAddon mckenziemc@0: instance.nameToIndex[newAddon:GetName()] = i mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- TODO: enable dependencies for any addons that have already loaded mckenziemc@0: mckenziemc@0: return instance mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: -- @param addon Name or index of the addon to retrieve. mckenziemc@0: -- @return The addon object, or nil if not found mckenziemc@0: function core:GetAddon(addon) mckenziemc@0: if not Addon:Exists(addon) then mckenziemc@0: return nil mckenziemc@0: end mckenziemc@0: mckenziemc@0: local index mckenziemc@0: mckenziemc@0: if type(addon) == "string" then mckenziemc@0: index = self.nameToIndex[addon] mckenziemc@0: elseif type(addon) == "number" then mckenziemc@0: index = addon mckenziemc@0: end mckenziemc@0: mckenziemc@0: return self.addons[index] mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: -- Checks if the tree rooted at the specified addon can be force-loaded. mckenziemc@0: -- @param root The name or index of the root addon. mckenziemc@0: function core:CanForceLoadTree(root) mckenziemc@0: -- convert root to an Addon object mckenziemc@0: root = self:GetAddon(root) mckenziemc@0: assert(root) mckenziemc@0: mckenziemc@0: if root:IsLoaded() then mckenziemc@0: return true mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- check if the root itself can be force-loaded mckenziemc@0: if not root:CanForceLoad() then mckenziemc@0: return false mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- now check dependencies recursively mckenziemc@0: -- FIXME: prevent infinite recursion mckenziemc@0: mckenziemc@0: local dependencies = {root:GetDependencies()} mckenziemc@0: for i, depName in pairs(dependencies) do mckenziemc@0: local dep = self:GetAddon(depName) mckenziemc@0: mckenziemc@0: if dep == nil then mckenziemc@0: return false -- missing dependency mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- if it's already loaded then skip to next one mckenziemc@0: if not dep:IsLoaded() then mckenziemc@0: if not self:CanForceLoadTree(depName) then mckenziemc@0: return false mckenziemc@0: end mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: return true mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- NOTE: any tree that can be loaded on demand is also eligible for force-loading mckenziemc@0: -- Checks if the tree rooted at the specified addon can be loaded on demand. mckenziemc@0: -- @param root The name or index of the root addon. mckenziemc@0: function core:CanLoDTree(root) mckenziemc@0: root = self:GetAddon(root) mckenziemc@0: assert(root) mckenziemc@0: mckenziemc@0: -- since this will be used recursively, return true if mckenziemc@0: -- this is already loaded. mckenziemc@0: if root:IsLoaded() then mckenziemc@0: return true mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- true if all dependencies are loaded or LoD mckenziemc@0: mckenziemc@0: if not root:CanLoD() then mckenziemc@0: return false mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- now check dependencies recursively mckenziemc@0: local dependencies = {root:GetDependencies()} mckenziemc@0: for i, depName in pairs(dependencies) do mckenziemc@0: local dep = self:GetAddon(depName) mckenziemc@0: mckenziemc@0: if not dep then mckenziemc@0: return false -- missing mckenziemc@0: end mckenziemc@0: mckenziemc@0: if not dep:IsLoaded() then mckenziemc@0: if not self:CanLoDTree(depName) then mckenziemc@0: return false mckenziemc@0: end mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: return true mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: -- Checks if the tree rooted at the specified addon mckenziemc@0: -- can be loaded if all dependencies are enabled mckenziemc@0: -- the UI is reloaded. mckenziemc@0: -- Basically makes sure all dependencies are installed. mckenziemc@0: function core:CanReloadTree(root) mckenziemc@0: -- convert root to an Addon object mckenziemc@0: root = self:GetAddon(root) mckenziemc@0: assert(root) mckenziemc@0: mckenziemc@0: if root:IsLoaded() then mckenziemc@0: return true mckenziemc@0: -- FIXME: deps may have been disabled mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- TODO: make sure the root isn't incompatible mckenziemc@0: mckenziemc@0: -- now check dependencies recursively mckenziemc@0: -- FIXME: prevent infinite recursion mckenziemc@0: mckenziemc@0: local dependencies = {root:GetDependencies()} mckenziemc@0: for i, depName in pairs(dependencies) do mckenziemc@0: local dep = self:GetAddon(depName) mckenziemc@0: mckenziemc@0: if dep == nil then mckenziemc@0: return false -- missing dependency mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- TODO: make sure it's compatible mckenziemc@0: end mckenziemc@0: mckenziemc@0: return true mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- Loads the tree rooted at the specified addon. mckenziemc@0: -- FIXME: load the root too or not? mckenziemc@0: -- Supports both LoD addons and those that require force-loading. mckenziemc@0: function core:LoadTree(addon) mckenziemc@0: -- don't check if the tree can actually be loaded. mckenziemc@0: -- external code should do that itself to check if it mckenziemc@0: -- should even call this at all. mckenziemc@0: mckenziemc@0: if self:ForceLoadAvailable() then mckenziemc@0: -- LoD trees can also be force-loaded mckenziemc@0: self:ForceLoadTree(addon) mckenziemc@0: else mckenziemc@0: self:LoadLoDTree(addon) mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: -- load the root too, since it may actually be a leaf mckenziemc@0: function core:ForceLoadTree(root) mckenziemc@0: root = self:GetAddon(root) mckenziemc@0: assert(root) mckenziemc@0: mckenziemc@0: -- load dependencies mckenziemc@0: local dependencies = {root:GetDependencies(addon)} mckenziemc@0: for i, depName in pairs(dependencies) do mckenziemc@0: self:ForceLoadTree(depName) mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- load embeds, if they are available separately mckenziemc@0: local embeds = {root:GetEmbeds(addon)} mckenziemc@0: for i, embedName in pairs(embeds) do mckenziemc@0: if Addon:Exists(embedName) then mckenziemc@0: self:ForceLoadTree(embedName) mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: root:ForceLoad() mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: function core:LoadLoDTree(root) mckenziemc@0: root = self:GetAddon(root) mckenziemc@0: assert(root) mckenziemc@0: mckenziemc@0: -- load dependencies mckenziemc@0: local dependencies = {root:GetDependencies(addon)} mckenziemc@0: for i, depName in pairs(dependencies) do mckenziemc@0: self:LoadLoDTree(depName) mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- load embeds, if they are available separately mckenziemc@0: local embeds = {root:GetEmbeds(addon)} mckenziemc@0: for i, embedName in pairs(embeds) do mckenziemc@0: if Addon:Exists(embedName) then mckenziemc@0: self:LoadLoDTree(embedName) mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: root:LoD() mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: -- I think the problem this solves is a major issue with mckenziemc@0: -- migrating to separate libs. think about it more and document mckenziemc@0: -- here and in project description mckenziemc@0: function core:PrepareLoDTree(root) mckenziemc@0: root = self:GetAddon(root) mckenziemc@0: assert(root) mckenziemc@0: mckenziemc@0: -- assume root is LoD mckenziemc@0: mckenziemc@0: -- check dependencies mckenziemc@0: local dependencies = {root:GetDependencies(addon)} mckenziemc@0: for i, depName in pairs(dependencies) do mckenziemc@0: local dep = self:GetAddon(depName) mckenziemc@0: mckenziemc@0: -- assume external code made sure it exists mckenziemc@0: mckenziemc@0: if dep:CanLoD() then mckenziemc@0: -- don't load it now but make sure its dependencies are prepared mckenziemc@0: self:PrepareLoDTree(depName) mckenziemc@0: else mckenziemc@0: -- FIXME: if it's already loaded mckenziemc@0: -- force-load it now so we can load the parent on demand mckenziemc@0: self:ForceLoadTree(depName) mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- prepare embeds, if they are available separately mckenziemc@0: local embeds = {root:GetEmbeds(addon)} -- FIXME: addon? mckenziemc@0: for i, embedName in pairs(embeds) do mckenziemc@0: local embed = self:GetAddon(embedName) mckenziemc@0: mckenziemc@0: if embed then mckenziemc@0: if embed:CanLoD() then mckenziemc@0: -- don't load it now but make sure its dependencies are prepared mckenziemc@0: self:PrepareLoDTree(embedName) mckenziemc@0: else mckenziemc@0: -- FIXME: if it's already loaded mckenziemc@0: -- force-load it now so we can load the parent on demand mckenziemc@0: self:ForceLoadTree(depName) mckenziemc@0: end mckenziemc@0: end mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: function Core:PrepareReloadTree(addon) mckenziemc@0: root = self:GetAddon(root) mckenziemc@0: assert(root) mckenziemc@0: mckenziemc@0: root:Enable() mckenziemc@0: mckenziemc@0: -- check dependencies mckenziemc@0: local dependencies = {root:GetDependencies()} mckenziemc@0: for i, depName in pairs(dependencies) do mckenziemc@0: self:PrepareReloadTree(depName) mckenziemc@0: end mckenziemc@0: mckenziemc@0: -- prepare embeds, if they are available separately mckenziemc@0: local embeds = {root:GetEmbeds(addon)} mckenziemc@0: for i, embedName in pairs(embeds) do mckenziemc@0: local embed = self:GetAddon(embedName) mckenziemc@0: mckenziemc@0: if embed then mckenziemc@0: self:PrepareReloadTree(embedName) mckenziemc@0: end mckenziemc@0: end mckenziemc@0: end mckenziemc@0: mckenziemc@0: mckenziemc@0: function Core:ForceLoadAvailable() mckenziemc@0: return true mckenziemc@0: -- FIXME: use field and a frame registered for PLAYER_LOGIN mckenziemc@0: end