annotate DependencyLoader/Addon.lua @ 11:47d15fc9208e

updated the .pkgmeta to reflect the directory changes added LibScriptLink external changed the main module's Dependencies to OptDeps moved embeds.xml and Ace3.xml
author mckenziemc
date Sun, 05 Dec 2010 03:39:26 -0800
parents e0a4a8b5b389
children b230b94d4487
rev   line source
mckenziemc@0 1 -- Addon
mckenziemc@10 2 -- Represents individual addon modules.
mckenziemc@0 3
mckenziemc@0 4
mckenziemc@0 5 local addonName, addonTable = ...
mckenziemc@0 6
mckenziemc@0 7
mckenziemc@10 8 -- TODO: test if the API functions are quicker with indexes than names.
mckenziemc@10 9 -- TODO: modify the dependency stuff to check the Errata module.
mckenziemc@0 10
mckenziemc@0 11 local Addon, addon = addonTable:NewClass("Addon")
mckenziemc@0 12
mckenziemc@8 13
mckenziemc@8 14 Addon.addons = {}
mckenziemc@8 15 Addon.nameToIndex = {}
mckenziemc@8 16
mckenziemc@8 17
mckenziemc@8 18 -- Internal function
mckenziemc@8 19 -- Creates a new Addon object
mckenziemc@8 20 -- @param id Name or index of the addon.
mckenziemc@0 21 function Addon:New(id)
mckenziemc@0 22 local instance = {}
mckenziemc@0 23 setmetatable(instance, self.instanceMetatable)
mckenziemc@0 24
mckenziemc@0 25 if type(id) == "number" then
mckenziemc@0 26 -- TODO: make sure it's in range
mckenziemc@0 27 instance.index = id
mckenziemc@0 28 instance.name = GetAddOnInfo(id)
mckenziemc@0 29 else
mckenziemc@0 30 -- FIXME: allow blizzard addons?
mckenziemc@0 31 local index
mckenziemc@0 32
mckenziemc@0 33 for i=1,GetNumAddOns() do
mckenziemc@0 34 if GetAddOnInfo(i) == id then
mckenziemc@0 35 index = i
mckenziemc@0 36 break
mckenziemc@0 37 end
mckenziemc@0 38 end
mckenziemc@0 39
mckenziemc@0 40 if index then
mckenziemc@0 41 instance.name = GetAddOnInfo(id)
mckenziemc@0 42 instance.index = index
mckenziemc@0 43 else
mckenziemc@0 44 error("Addon not found")
mckenziemc@0 45 end
mckenziemc@0 46 end
mckenziemc@0 47
mckenziemc@0 48 return instance
mckenziemc@0 49 end
mckenziemc@0 50
mckenziemc@0 51
mckenziemc@8 52 --- Retrieves an Addon object.
mckenziemc@8 53 -- @param id Name or index of the addon to retrieve.
mckenziemc@8 54 -- @return The Addon object, or nil if not found.
mckenziemc@8 55 function Addon:Get(id)
mckenziemc@8 56 if not self:Exists(id) then
mckenziemc@8 57 return nil
mckenziemc@8 58 end
mckenziemc@8 59
mckenziemc@8 60 if type(id) == "number" then
mckenziemc@8 61 if self.addons[id] ~= nil then
mckenziemc@8 62 return self.addons[id]
mckenziemc@8 63 end
mckenziemc@8 64
mckenziemc@8 65 local new = self:New(id)
mckenziemc@8 66 self.addons[new:GetIndex()] = new
mckenziemc@8 67 self.nameToIndex[new:GetName()] = id
mckenziemc@8 68
mckenziemc@8 69 return new
mckenziemc@8 70 elseif type(id) == "string" then
mckenziemc@8 71 if self.nameToIndex[id] then
mckenziemc@8 72 return self.addons[self.nameToIndex[id] ]
mckenziemc@8 73 end
mckenziemc@8 74
mckenziemc@8 75 local new = self:New(id)
mckenziemc@8 76 self.addons[new:GetIndex()] = new
mckenziemc@8 77 self.nameToIndex[id] = new:GetIndex()
mckenziemc@8 78
mckenziemc@8 79 return new
mckenziemc@8 80 end
mckenziemc@8 81 end
mckenziemc@8 82
mckenziemc@10 83
mckenziemc@0 84 -- Checks if an addon exists with the specified name.
mckenziemc@0 85 -- @param addon Name of the addon.
mckenziemc@0 86 -- @return True if the addon is present, false otherwise.
mckenziemc@0 87 function Addon:Exists(addon)
mckenziemc@0 88 if type(addon) == "number" then
mckenziemc@0 89 if addon >= 1 and addon <= GetNumAddOns() then
mckenziemc@0 90 return true
mckenziemc@0 91 else
mckenziemc@0 92 return false
mckenziemc@0 93 end
mckenziemc@0 94 elseif type(addon) == "string" then
mckenziemc@0 95 local status = select(6, GetAddOnInfo(addon))
mckenziemc@0 96
mckenziemc@0 97 if status == "MISSING" then
mckenziemc@0 98 return false
mckenziemc@0 99 else
mckenziemc@0 100 return true
mckenziemc@0 101 end
mckenziemc@0 102 else
mckenziemc@0 103 error()
mckenziemc@0 104 end
mckenziemc@0 105 end
mckenziemc@0 106
mckenziemc@0 107
mckenziemc@0 108 function addon:GetName()
mckenziemc@0 109 return self.name
mckenziemc@0 110 end
mckenziemc@0 111
mckenziemc@0 112
mckenziemc@0 113 function addon:GetIndex()
mckenziemc@0 114 return self.index
mckenziemc@0 115 end
mckenziemc@0 116
mckenziemc@0 117
mckenziemc@0 118 function addon:IsEnabled()
mckenziemc@0 119 -- FIXME: written while tired; review later
mckenziemc@0 120 local status = select(6, GetAddOnInfo(self.index))
mckenziemc@0 121
mckenziemc@0 122 if status == "DISABLED" then
mckenziemc@0 123 return false
mckenziemc@0 124 else
mckenziemc@0 125 return true
mckenziemc@0 126 end
mckenziemc@0 127 end
mckenziemc@0 128
mckenziemc@0 129
mckenziemc@8 130 --- Checks if the addon is loadable.
mckenziemc@8 131 -- Considers interface issues, missing, etc. (NYI)
mckenziemc@8 132 -- Does not check dependencies.
mckenziemc@8 133 function addon:CanLoad()
mckenziemc@8 134 -- FIXME: an addon may be present but unloadable if loading out of date addons is disabled.
mckenziemc@8 135 return true
mckenziemc@8 136 end
mckenziemc@8 137
mckenziemc@8 138
mckenziemc@0 139 function addon:CanLoD()
mckenziemc@0 140 -- FIXME: what will the client say about addons using LoadManagers if the LM was force-loaded?
mckenziemc@0 141 if IsAddOnLoadOnDemand(self.name) then
mckenziemc@0 142 return true
mckenziemc@0 143 else
mckenziemc@0 144 return false
mckenziemc@0 145 end
mckenziemc@0 146 end
mckenziemc@0 147
mckenziemc@8 148
mckenziemc@8 149 function addon:CanForceLoadAfter()
mckenziemc@8 150 -- TODO: check Errata module
mckenziemc@8 151 return false
mckenziemc@8 152 end
mckenziemc@8 153
mckenziemc@8 154
mckenziemc@8 155 function addon:CanForceLoadBefore()
mckenziemc@8 156 -- TODO: check Errata module
mckenziemc@8 157 return false -- TODO: check if there's any reason addons can't be forceloaded
mckenziemc@8 158 end
mckenziemc@8 159
mckenziemc@8 160
mckenziemc@10 161 function addon:CanForceLoad()
mckenziemc@10 162 -- FIXME: check if this would've already been loaded
mckenziemc@10 163 return self:CanForceLoadAfter()
mckenziemc@10 164 end
mckenziemc@10 165
mckenziemc@10 166
mckenziemc@8 167 function addon:Enable()
mckenziemc@8 168 -- FIXME: delay this till after PLAYER_LOGIN or it'll get force-loaded
mckenziemc@8 169 EnableAddOn(self.name)
mckenziemc@8 170 end
mckenziemc@8 171
mckenziemc@8 172
mckenziemc@0 173 -- NOTE: only call for LoD, not force-loading
mckenziemc@0 174 function addon:Load()
mckenziemc@0 175 assert(self:CanLoD())
mckenziemc@0 176
mckenziemc@0 177 EnableAddOn(self.name)
mckenziemc@0 178 LoadAddOn(self.name)
mckenziemc@0 179 end
mckenziemc@0 180
mckenziemc@8 181
mckenziemc@0 182 function addon:ForceLoad()
mckenziemc@0 183 assert(self:CanForceLoad())
mckenziemc@0 184 -- TODO: make sure force-loading is available at this time
mckenziemc@0 185
mckenziemc@0 186 EnableAddOn(self.name) -- This should cause the game to also load this addon
mckenziemc@0 187 end
mckenziemc@0 188
mckenziemc@0 189
mckenziemc@0 190 function addon:GetDependencies()
mckenziemc@8 191 -- TODO: consider no-lib embeds as deps?
mckenziemc@0 192 return GetAddOnDependencies(self.index)
mckenziemc@0 193 end
mckenziemc@0 194
mckenziemc@0 195
mckenziemc@0 196 function addon:GetEmbeds()
mckenziemc@0 197 local embeds = {}
mckenziemc@0 198
mckenziemc@0 199 local embedString = GetAddOnMetadata(self.name, "X-Embeds")
mckenziemc@0 200
mckenziemc@0 201 if embedString then
mckenziemc@0 202 for match in string.gmatch(embedString, "[^,%s]+") do
mckenziemc@0 203 table.insert(embeds, match)
mckenziemc@0 204 end
mckenziemc@0 205 end
mckenziemc@0 206
mckenziemc@0 207 return unpack(embeds)
mckenziemc@0 208 end
mckenziemc@0 209
mckenziemc@0 210 function addon:IsLoaded()
mckenziemc@0 211 if IsAddOnLoaded(self.index) then
mckenziemc@0 212 return true
mckenziemc@0 213 else
mckenziemc@0 214 return false
mckenziemc@0 215 end
mckenziemc@0 216 end