annotate DependencyLoader_Core/Addon.lua @ 4:a291f5ab20e4

replaced tabs in .pkgmeta with spaces
author mckenziemc
date Fri, 03 Dec 2010 18:45:45 -0800
parents 9852fcd5e59e
children 930871e163bc
rev   line source
mckenziemc@0 1 -- Addon
mckenziemc@0 2 -- Represents individual addon modules
mckenziemc@0 3
mckenziemc@0 4
mckenziemc@0 5 local addonName, addonTable = ...
mckenziemc@0 6
mckenziemc@0 7 print("running Addon.lua")
mckenziemc@0 8
mckenziemc@0 9 -- NOTE: I assume that the API addon functions are
mckenziemc@0 10 -- slightly quicker with an index than with a number.
mckenziemc@0 11
mckenziemc@0 12 -- TODO: modify the dependency stuff to use the Errata module if available
mckenziemc@0 13
mckenziemc@0 14 local Addon, addon = addonTable:NewClass("Addon")
mckenziemc@0 15
mckenziemc@0 16 function Addon:New(id)
mckenziemc@0 17 assert(type(id) == "number" or type(id) == "string")
mckenziemc@0 18
mckenziemc@0 19 local instance = {}
mckenziemc@0 20
mckenziemc@0 21 setmetatable(instance, self.instanceMetatable)
mckenziemc@0 22
mckenziemc@0 23 if type(id) == "number" then
mckenziemc@0 24 -- TODO: make sure it's in range
mckenziemc@0 25 instance.index = id
mckenziemc@0 26 instance.name = GetAddOnInfo(id)
mckenziemc@0 27 else
mckenziemc@0 28 -- FIXME: allow blizzard addons?
mckenziemc@0 29 local index
mckenziemc@0 30
mckenziemc@0 31 for i=1,GetNumAddOns() do
mckenziemc@0 32 if GetAddOnInfo(i) == id then
mckenziemc@0 33 index = i
mckenziemc@0 34 break
mckenziemc@0 35 end
mckenziemc@0 36 end
mckenziemc@0 37
mckenziemc@0 38 if index then
mckenziemc@0 39 instance.name = GetAddOnInfo(id)
mckenziemc@0 40 instance.index = index
mckenziemc@0 41 else
mckenziemc@0 42 error("Addon not found")
mckenziemc@0 43 end
mckenziemc@0 44 end
mckenziemc@0 45
mckenziemc@0 46 return instance
mckenziemc@0 47 end
mckenziemc@0 48
mckenziemc@0 49
mckenziemc@0 50 -- Checks if an addon exists with the specified name.
mckenziemc@0 51 -- @param addon Name of the addon.
mckenziemc@0 52 -- @return True if the addon is present, false otherwise.
mckenziemc@0 53 function Addon:Exists(addon)
mckenziemc@0 54 if type(addon) == "number" then
mckenziemc@0 55 if addon >= 1 and addon <= GetNumAddOns() then
mckenziemc@0 56 return true
mckenziemc@0 57 else
mckenziemc@0 58 return false
mckenziemc@0 59 end
mckenziemc@0 60 elseif type(addon) == "string" then
mckenziemc@0 61 local status = select(6, GetAddOnInfo(addon))
mckenziemc@0 62
mckenziemc@0 63 if status == "MISSING" then
mckenziemc@0 64 return false
mckenziemc@0 65 else
mckenziemc@0 66 return true
mckenziemc@0 67 end
mckenziemc@0 68 else
mckenziemc@0 69 error()
mckenziemc@0 70 end
mckenziemc@0 71 end
mckenziemc@0 72
mckenziemc@0 73
mckenziemc@0 74 function addon:GetName()
mckenziemc@0 75 return self.name
mckenziemc@0 76 end
mckenziemc@0 77
mckenziemc@0 78
mckenziemc@0 79 function addon:GetIndex()
mckenziemc@0 80 return self.index
mckenziemc@0 81 end
mckenziemc@0 82
mckenziemc@0 83
mckenziemc@0 84 function addon:IsEnabled()
mckenziemc@0 85 -- FIXME: written while tired; review later
mckenziemc@0 86 local status = select(6, GetAddOnInfo(self.index))
mckenziemc@0 87
mckenziemc@0 88 if status == "DISABLED" then
mckenziemc@0 89 return false
mckenziemc@0 90 else
mckenziemc@0 91 return true
mckenziemc@0 92 end
mckenziemc@0 93 end
mckenziemc@0 94
mckenziemc@0 95 -- FIXME: an addon may be present but unloadable if loading out of date addons is disabled.
mckenziemc@0 96 -- NOTE: CanForceLoad and CanLoD don't check the status of dependencies
mckenziemc@0 97
mckenziemc@0 98 function addon:CanForceLoad()
mckenziemc@0 99 return true -- TODO: check if there's any reason addons can't be forceloaded
mckenziemc@0 100 end
mckenziemc@0 101
mckenziemc@0 102 function addon:CanLoD()
mckenziemc@0 103 -- FIXME: what will the client say about addons using LoadManagers if the LM was force-loaded?
mckenziemc@0 104 if IsAddOnLoadOnDemand(self.name) then
mckenziemc@0 105 return true
mckenziemc@0 106 else
mckenziemc@0 107 return false
mckenziemc@0 108 end
mckenziemc@0 109 end
mckenziemc@0 110
mckenziemc@0 111 -- NOTE: only call for LoD, not force-loading
mckenziemc@0 112 function addon:Load()
mckenziemc@0 113 assert(self:CanLoD())
mckenziemc@0 114
mckenziemc@0 115 EnableAddOn(self.name)
mckenziemc@0 116 LoadAddOn(self.name)
mckenziemc@0 117 end
mckenziemc@0 118
mckenziemc@0 119 function addon:ForceLoad()
mckenziemc@0 120 assert(self:CanForceLoad())
mckenziemc@0 121 -- TODO: make sure force-loading is available at this time
mckenziemc@0 122
mckenziemc@0 123 EnableAddOn(self.name) -- This should cause the game to also load this addon
mckenziemc@0 124 end
mckenziemc@0 125
mckenziemc@0 126
mckenziemc@0 127 function addon:GetDependencies()
mckenziemc@0 128 return GetAddOnDependencies(self.index)
mckenziemc@0 129 end
mckenziemc@0 130
mckenziemc@0 131
mckenziemc@0 132 function addon:GetEmbeds()
mckenziemc@0 133 local embeds = {}
mckenziemc@0 134
mckenziemc@0 135 local embedString = GetAddOnMetadata(self.name, "X-Embeds")
mckenziemc@0 136
mckenziemc@0 137 if embedString then
mckenziemc@0 138 for match in string.gmatch(embedString, "[^,%s]+") do
mckenziemc@0 139 table.insert(embeds, match)
mckenziemc@0 140 end
mckenziemc@0 141 end
mckenziemc@0 142
mckenziemc@0 143 return unpack(embeds)
mckenziemc@0 144 end
mckenziemc@0 145
mckenziemc@0 146 function addon:IsLoaded()
mckenziemc@0 147 if IsAddOnLoaded(self.index) then
mckenziemc@0 148 return true
mckenziemc@0 149 else
mckenziemc@0 150 return false
mckenziemc@0 151 end
mckenziemc@0 152 end